Передать атрибуты области страницы в JSP, используя pagecontext.include для использования в JSTL?
Мы используем это шаблонное решение JSP практически дословно:
http://java.sun.com/developer/technicalArticles/javaserverpages/jsp_templates/
Когда он получает страницы JSP для включения, он использует pageContext.include, что оставляет нам одну проблему, а именно то, что у нас много скриптового кода, который инициализируется в самом JSP (теговый суп). Я думал изменить тег шаблона с помощью дополнительного атрибута, который является ссылкой на путь пакета к классу с помощью метода init или execute. Это выполнение будет вызвано первым и добавит атрибуты контекста страницы перед включением JSP. Затем мы будем использовать JSTL для доступа к этим атрибутам. Однако мне сказали, что это не сработает из-за того, как работает pageContext.include, и из-за невозможности передать атрибуты, ограниченные областью страницы. Это правда, и есть ли обходные пути? Я так хорошо знаю все мои правила определения объема.
2 ответа
Правильно, проблема в том, что PageContext - это буквально контекст страницы. Когда вы запускаете include, этот ресурс (при условии, что это JSP) получает свой собственный PageContext, который теряется при возврате.
JSP имеет 4 области действия: приложение, сеанс, запрос и страница. У каждого из них есть свой жизненный цикл, который должен быть понятен.
Использование области запроса здесь является правильной идеей.
Если вы посмотрите на код шаблона, с которым вы связались, это именно то, что делает тег Insert. В этом случае он помещает Hashtables в стек, который поддерживается в Запросе.
Затем он использует теги "положить" и "получить", чтобы помещать / получать элементы в текущем "стеке".
Простая вещь, которую вы можете сделать, - это перед вызовом PageContext.include вызвать ваш метод execute соответствующим образом. Пусть этот метод просто вернет карту пар имя / значение. Затем вы можете взять эту карту и заполнить существующую (или скоро уже существующую) Hashtable в стеке.
По сути, ваш класс Init - это логика, которая похожа на вызов множества тегов put.
Кроме этого ваши теги шаблона работают так же.
Или вы можете объединить результаты прямо в Запрос для использования JSTL. Или вы можете сохранить природу "стека", вставив свой собственный "контекст" в Запрос.
Вы можете передать атрибут, ограниченный областью запроса:
<c:set var="myAttribute" value="myValue" scope="request" />
или же
<% request.setAttribute("myAttribute", "myValue"); %>
А потом на вашей включенной странице:
<c:out value="${myAttribute}" />