JSP标记文件可以访问其调用JSP的PageContext吗?

时间:2011-08-17 19:11:11

标签: java jsp el jsp-tags

如果我这样做:

<% pageContext.setAttribute("foo", "bar"); %>
<custom:myTag/>
似乎我应该能够做到:

<%= pageContext.getAttribute("foo") %>

myTag.tag内...但当然我不能,因为标签文件无法访问pageContext(相反它可以访问jspContext ...它没有相同的属性调用页面的pageContext)。

现在,您可以通过ELScript访问pageContext:

${pageContext}

但这没有用,因为ELScript无法传递参数,所以你不能这样做:

${pageContext.getAttribute("foo")}

然而,ELscript可以访问页面上下文的事实,以及标签可以访问各种变量(如jspContext)这一事实,标签必须有某种方式才能访问(以scriptlet / Java逻辑方式,不仅仅是在ELScript中)来自调用JSP的pageContext的一个属性。

有吗?

2 个答案:

答案 0 :(得分:7)

对于EL,${pageContext.getAttribute("foo")}仅适用于EL 2.2。在此之前,正确的语法是${pageContext.foo}${foo}。另请参阅我们的EL wiki page

但是,父JSP文件和JSP标记之间不共享${pageContext}。每个都有自己的实例。

您可以 将其设置为请求属性:

<% request.setAttribute("foo", "bar") %>
<custom:myTag />

带有标签

<%= request.getAttribute("foo") %>

或,与EL

${requestScope.foo}

${foo}

,更好的是,您可以将其作为一个完整的标记属性传递

<custom:myTag foo="bar" />

带有标签

<%@attribute name="foo" required="true" %>
${pageContext.foo}

或只是

<%@attribute name="foo" required="true" %>
${foo}

答案 1 :(得分:1)

至少在WebLogic 10中,隐含的&#34;应用程序&#34; object 在标记文件中可用,并且是ServletContext的实例。也许使用它,当它真正是一个人的ServletContext,而不一定是更高级别的pageContext。