2011-08-17 79 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。

相關問題