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