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

mac*_*ost 11 java jsp jsp-tags el

如果我做:

<% pageContext.setAttribute("foo", "bar"); %>
<custom:myTag/>
Run Code Online (Sandbox Code Playgroud)

好像我应该能做到:

<%= pageContext.getAttribute("foo") %>
Run Code Online (Sandbox Code Playgroud)

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

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

${pageContext}
Run Code Online (Sandbox Code Playgroud)

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

${pageContext.getAttribute("foo")}
Run Code Online (Sandbox Code Playgroud)

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

在那儿?

Bal*_*usC 8

至于EL,${pageContext.getAttribute("foo")}仅在EL 2.2中有效.在此之前,正确的语法是${pageContext.foo}或只是${foo}.另请参阅我们的EL维基页面.

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

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

<% request.setAttribute("foo", "bar") %>
<custom:myTag />
Run Code Online (Sandbox Code Playgroud)

在标签中

<%= request.getAttribute("foo") %>
Run Code Online (Sandbox Code Playgroud)

或者,用EL

${requestScope.foo}
Run Code Online (Sandbox Code Playgroud)

要么

${foo}
Run Code Online (Sandbox Code Playgroud)

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

<custom:myTag foo="bar" />
Run Code Online (Sandbox Code Playgroud)

在标签中

<%@attribute name="foo" required="true" %>
${pageContext.foo}
Run Code Online (Sandbox Code Playgroud)

要不就

<%@attribute name="foo" required="true" %>
${foo}
Run Code Online (Sandbox Code Playgroud)