为啥在 JSP 中需要 pageContext?

Posted

技术标签:

【中文标题】为啥在 JSP 中需要 pageContext?【英文标题】:Why there is a need of pageContext in JSP?为什么在 JSP 中需要 pageContext? 【发布时间】:2011-04-13 17:16:13 【问题描述】:

当我们可以访问 JSP 中的所有隐式变量时,为什么我们有 pageContext

我的假设如下:如果我们使用 EL 表达式或 JSTL,来访问或设置我们需要的属性 pageContext。让我知道我是否正确。

【问题讨论】:

【参考方案1】:

您需要它来访问-隐式变量。现在有意义吗?


更新:有时只想直接访问HttpServletRequestHttpSession 的getter 方法。在标准 JSP 中,两者都只能由 $pageContext 获得。以下是一些实际使用示例:


会话超时刷新页面:

<meta http-equiv="refresh" content="$pageContext.session.maxInactiveInterval">

将会话 ID 传递给 Applet(以便它可以在同一会话中与 servlet 通信):

<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>

动态定义&lt;base&gt;标签(在JSTL functions标签库的帮助下):

<base href="$fn:replace(pageContext.request.requestURL, pageContext.request.requestURI, pageContext.request.contextPath)/">

等等。查看前面链接的HttpServletRequestHttpSession javadoc 以了解所有这些 getter 方法。其中一些可能在 JSP/EL 中也很有用。

【讨论】:

正如我提到的 el 表达式语言你需要 pageContext。 您不需要它来访问隐式对象或属性。例如。 $param.name(用于request.getParameter(name))、$cookie.name(用于getName().equals(name) 的cookie)、$header.name(用于request.getHeader(name))或$attributename(用于pageContext.findAttribute(attributename))就足够了。所有隐式对象都列在here 中。顺便说一句,你的英语很差。再想一想,你原来的问题可能有歧义。你真的需要验证和澄清这一点。 感谢您的回答和您花费的时间。是的,我的英语很差,我会努力提高,在这里提问。【参考方案2】:

要添加到@BalusC 的出色答案,您获得的 PageContext 可能不限于您在规范中看到的内容。

例如,Lucee 是一个 JSP Servlet,它为接口和抽象类添加了许多特性。通过获取对 PageContext 的引用,您可以访问大量原本不可用的信息。

【讨论】:

【参考方案3】:

所有 11 个隐式 EL 变量都定义为 Map,除了 pageContext 变量。 pageContext 变量为访问请求/响应/会话属性或转发请求提供了方便的方法。

【讨论】:

以上是关于为啥在 JSP 中需要 pageContext?的主要内容,如果未能解决你的问题,请参考以下文章

${pageContext.request.contextPath}

jsp内置对象pageContext如何在Servlet中获取值

JSP中page和pageContext的区别

转载 : JSP取得绝对路径

JSP中的pageContext隐式对象和EL表达式中的pageContext隐式对象的比较疑问

用JSP取得绝对路径