Передать атрибуты области страницы в 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}" />
Другие вопросы по тегам