Передать атрибуты области страницы в JSP, используя pagecontext.include для использования в JSTL? - PullRequest
5 голосов
/ 11 мая 2010

Мы используем это шаблонное решение JSP практически дословно:

http://java.sun.com/developer/technicalArticles/javaserverpages/jsp_templates/

Когда он получает страницы JSP для включения, он использует pageContext.include, что оставляет нам одну проблему, а именно то, что у нас есть много скриптового кода, который инициализируется в самой JSP (теговый суп). Я думал изменить тег шаблона с помощью дополнительного атрибута, который является ссылкой на путь пакета к классу с помощью метода init или execute. Это выполнение будет вызвано первым и добавит атрибуты контекста страницы перед включением JSP. Затем мы будем использовать JSTL для доступа к этим атрибутам. Однако мне сказали, что это не сработает из-за того, как работает pageContext.include, и из-за невозможности передать атрибуты, ограниченные областью страницы. Это правда, и есть ли обходные пути? Я так хорошо знаю все мои правила определения объема.

Ответы [ 2 ]

10 голосов
/ 14 мая 2010

Правильно, проблема в том, что PageContext - это буквально контекст страницы. Когда вы запускаете include, этот ресурс (при условии, что это JSP) получает собственный PageContext, который теряется при возврате.

JSP имеет 4 области действия: приложение, сеанс, запрос и страница. Каждый из них имеет свой жизненный цикл, который должен быть понятен.

Использование области запроса здесь - правильная идея.

Если вы посмотрите на код шаблона, на который вы ссылались, это именно то, что делает тег Вставка. В этом случае он помещает Hashtables в стек, который поддерживается в Запросе.

Затем он использует теги «положить» и «получить», чтобы помещать / получать элементы в текущем «стеке» и выключать его.

Простая вещь, которую вы можете сделать, - перед тем, как PageContext.include, вызвать соответствующий метод «execute». Пусть этот метод просто вернет карту пар имя / значение. Затем вы можете взять эту карту и заполнить существующую (или скоро уже существующую) Hashtable в стеке.

По сути, ваш класс Init - это логика, которая похожа на вызов множества тегов "put".

Кроме того, теги вашего шаблона работают одинаково.

Или вы можете объединить результаты прямо в Запрос для использования JSTL. Или вы можете сохранить природу «стека», вставив свой собственный «контекст» в Запрос.

1 голос
/ 13 мая 2010

В запрос можно передать атрибут, ограниченный областью действия:

<c:set var="myAttribute" value="myValue" scope="request" />

или

<% request.setAttribute("myAttribute", "myValue"); %>

А потом на вашей включенной странице:

<c:out value="${myAttribute}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...