Объем страницы передачи приписывает JSP, использующему pagecontext.include для использования в JSTL?

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

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

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

5
задан skaffman 12 May 2010 в 08:35
поделиться

2 ответа

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

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

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

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

Затем он использует теги "put" и "get", чтобы помещать/получать элементы в текущую "стопку" и обратно.

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

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

В остальном ваши шаблонные теги работают одинаково.

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

10
ответ дан 13 December 2019 в 19:23
поделиться

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

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

или

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

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

<c:out value="${myAttribute}" />
1
ответ дан 13 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: