这种表达式语言 $pageContext.request.contextPath 在 JSP EL 中究竟做了啥?
Posted
技术标签:
【中文标题】这种表达式语言 $pageContext.request.contextPath 在 JSP EL 中究竟做了啥?【英文标题】:What does this expression language $pageContext.request.contextPath exactly do in JSP EL?这种表达式语言 $pageContext.request.contextPath 在 JSP EL 中究竟做了什么? 【发布时间】:2011-08-16 13:25:21 【问题描述】:我有一个网络应用程序,其中有不同的导航锚标记,例如主页、个人资料等。
我想要什么:
当我按下诸如主页或个人资料之类的锚标签时。我只想确保当前用户在该标签/JSP 页面中获取其信息。
我正在尝试的示例:
<a href="$pageContext.request.contextPath/JSPAddress.jsp">Profile</a>
【问题讨论】:
将鼠标放在[el]
标签上方,然后点击弹出框上的“信息”链接。
【参考方案1】:
对于我的项目设置,“$pageContext.request.contextPath”= 指的是“src/main/webapp”。另一种判断方法是在 Eclipse 中右键单击您的项目,然后转到属性:
【讨论】:
【参考方案2】:在您的 jsp 页面顶部包含 <%@ page isELIgnored="false"%>
。
【讨论】:
Dhanywaada,对我来说,表达语言被忽略了。【参考方案3】:在 JSP 表达式语言中使用 request.getContextPath()
代替 $pageContext.request.contextPath
。
<%
String contextPath = request.getContextPath();
%>
out.println(contextPath);
输出:willPrintMyProjectcontextPath
【讨论】:
不鼓励使用片段,不应再使用。表达式语言是做到这一点的正确方法,并且已经存在很长时间了。 @KjetilNordin 知道从 scriptlet 你必须做request.getContextPath()
而不是 pageContext.getRequest().getContextPath()
这仍然是有用的,这将是幼稚的 JSP 到 scriptlet 的翻译。
答案不回答问题的标题。接受的答案已经表明 pageContext 在 JSP 中是隐含的。这个答案没有用,它是噪音,并且指的是不鼓励的编码方式。它也比公认的答案早了三年,绝不应该参考非常过时的做法。所以我恭敬地不同意你的评论@MarcusJuniusBrutus【参考方案4】:
pageContext
是 JSP 中可用的隐式对象。 The EL documentation 说
JSP 页面的上下文。提供对各种对象的访问,包括: servletContext: ... 会话:... 请求:... 回应:...
因此,此表达式将获取当前的 HttpServletRequest
对象并获取当前请求的 context path 并将 /JSPAddress.jsp
附加到它以创建链接(即使访问此资源的上下文路径也将起作用变化)。
此表达式的主要目的是使您的链接与应用程序上下文保持“相对”,并将它们与应用程序路径的更改隔离开来。
例如,如果您的 JSP(名为 thisJSP.jsp
)通过 http://myhost.com/myWebApp/thisJSP.jsp
访问,则上下文路径将为 myWebApp
。因此,生成的链接href 将是/myWebApp/JSPAddress.jsp
。
如果有一天,您决定将 JSP 部署到上下文路径为 corpWebApp
的另一台服务器上,则为链接生成的 href 将自动更改为 /corpWebApp/JSPAddress.jsp
,而无需您进行任何工作。
【讨论】:
$pageContext.request.contextPath
和 $request.contextPath
有什么区别?
@MeBigFatGuy 我不相信 request
是 EL 中的隐式对象(虽然有一个 requestScope
) - 获取对请求实例的引用的方法是通过 pageContext
就像在 OPs sn-p 中一样。以上是关于这种表达式语言 $pageContext.request.contextPath 在 JSP EL 中究竟做了啥?的主要内容,如果未能解决你的问题,请参考以下文章