Почему существует необходимость в pageContext в JSP?
Когда мы можем получить доступ ко всем неявным переменным в JSP, почему у нас есть pageContext?
Мое предположение следующее: если мы используем выражения EL или JSTL, для доступа или установки атрибутов нам нужен pageContext. Дайте мне знать, прав ли я.
3 ответа
Вам это нужно для доступа к неявным переменным. Теперь это имеет смысл?
Обновление: иногда просто хотел бы получить доступ к методам получения HttpServletRequest
а также HttpSession
непосредственно. В стандартном JSP оба доступны только ${pageContext}
, Вот некоторые примеры использования в реальном мире:
Обновление страницы по истечении времени сеанса:
<meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval}">
Передача идентификатора сеанса в апплет (чтобы он мог взаимодействовать с сервлетом в одном сеансе):
<param name="jsessionid" value="${pageContext.session.id}">
Отображение некоторого сообщения только по первому запросу сеанса:
<c:if test="${pageContext.session['new']}">Welcome!</c:if>
Обратите внимание, что new
имеет специальную обработку, потому что это зарезервированное ключевое слово в EL, по крайней мере, начиная с EL 2.2
Отображение IP-адреса пользователя:
Ваш IP-адрес: ${pageContext.request.remoteAddr}
Делаем ссылки доменными относительно без жесткого кодирования текущего пути к контексту:
<a href="${pageContext.request.contextPath}/login">login</a>
Динамически определяя <base>
tag (с помощью JSTL-функций taglib):
<base href="${fn:replace(pageContext.request.requestURL, pageContext.request.requestURI, pageContext.request.contextPath)}/">
Etcetera. Заглянуть в вышеупомянутое HttpServletRequest
а также HttpSession
Javadoc, чтобы узнать обо всех этих методах получения. Некоторые из них могут быть полезны и в JSP/EL.
Чтобы добавить к отличному ответу @BalusC, полученный вами PageContext может не ограничиваться тем, что вы видите в спецификации.
Например, Lucee - это сервлет JSP, который добавляет множество функций в интерфейс и абстрактные классы. Получив ссылку на PageContext, вы можете получить доступ к большому количеству информации, которая в противном случае недоступна.
Все 11 неявных переменных EL определены как Map, кроме переменной pageContext. Переменная pageContext предоставляет удобные методы для доступа к атрибутам запроса / ответа / сеанса или пересылки запроса. Конечно, вы можете сделать гораздо больше, чем это