为什么在 JSP 中需要 pageContext?
当我们可以访问JSP中的所有隐式变量时,为什么我们有pageContext?
我的假设如下:如果我们使用EL表达式或JSTL,来访问或设置我们需要pageContext的属性。让我知道我是否正确。
当我们可以访问JSP中的所有隐式变量时,为什么我们有pageContext?
我的假设如下:如果我们使用EL表达式或JSTL,来访问或设置我们需要pageContext的属性。让我知道我是否正确。
您需要它来访问非隐式变量。现在有意义了吗?
更新:有时只想直接访问HttpServletRequest
和HttpSession
的getter方法。在标准 JSP 中,两者都只能通过 .以下是一些实际使用示例:${pageContext}
会话超时时刷新页面:
<meta http-equiv="refresh" content="${pageContext.session.maxInactiveInterval}">
将会话 ID 传递给小程序(以便它可以在同一会话中与 servlet 通信):
<param name="jsessionid" value="${pageContext.session.id}">
仅在会话的第一个请求时显示某些消息:
<c:if test="${pageContext.session['new']}">Welcome!</c:if>
请注意,new
具有特殊处理,因为它至少从 EL 2.2 开始就是 EL 中的保留关键字
显示用户 IP:
Your IP is: ${pageContext.request.remoteAddr}
使链接成为域相对的,而无需对当前上下文路径进行硬编码:
<a href="${pageContext.request.contextPath}/login">login</a>
动态定义标签(借助 JSTL 函数 taglib 的一点帮助):<base>
<base href="${fn:replace(pageContext.request.requestURL, pageContext.request.requestURI, pageContext.request.contextPath)}/">
诸如此类。在上述链接和javadoc中窥视,以了解所有这些getter方法。其中一些可能在 JSP/EL 中也很有用。HttpServletRequest
HttpSession
为了增加@BalusC的出色答案,您获得的PageContext可能不仅限于您在规范中看到的内容。
例如,Lucee是一个JSP Servlet,它为接口和抽象类添加了许多功能。通过获取对 PageContext 的引用,您可以访问大量原本不可用的信息。