2011-08-17 53 views
10

如果我做的:JSP标签文件可以访问它的调用JSP的PageContext吗?

<% 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的属性。

有吗?

回答

7

至于EL,${pageContext.getAttribute("foo")}只适用于EL 2.2。在此之前,正确的语法是${pageContext.foo}或只是${foo}。另见我们的EL wiki page

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

你可以要么将其设置为请求属性来代替:

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

与标签

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

,或者与EL

${requestScope.foo} 

${foo} 

或者,更好的,你可以在标签

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

或只是

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

谢谢,但事情是,我已经在pageContext中获得了我想要的变量,并且有足够的(遗留)代码引用它们,我不想将它们更改为请求属性。所以我*可以*只是将重复的副本放入请求中,但我希望有其他方法可以做到这一点。哦,如果我把这些变量变成属性,这些变量将会在很多标签中通过,所以我真的希望有一个“幕后”解决方案。如果没有办法通过标记访问JSP的pageContext,但是...猜猜我运气不佳:-( – machineghost

+0

)您可以使用(PageContext)getJspContext()来访问实际的页面上下文,请参阅下面的答案。 –

+0

@Jason:问题不在于此。 – BalusC

1

看起来像把它作为一个fullworthy标签属性

<custom:myTag foo="bar" /> 

至少WebLogic 10,隐含的“应用程序”对象是标记文件中可用的,并且是instanceof ServletContext。也许使用它,当它真的是一个后面的ServletContext,而不一定是更高级的pageContext。