2010-11-12 19 views
3

我在這裏檢查了關於taglibs和隱式對象的各種問題。雖然許多答案提出了有趣的想法,但我一直無法找到直接回答這個問題的答案。如何訪問自定義taglib Java類中的JSP隱式對象?

所以來說明我的困境,說我有一個實現了javax.servlet.jsp.tagext.Tag接口的Java類...

import javax.servlet.ServletRequest; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.PageContext; 
import javax.servlet.jsp.tagext.Tag; 

class MyTag implements Tag { 
    private PageContext _pageContext; 

    public void setPageContext(PageContext pageContext) { 
     _pageContext = pageContext; 
    } 
    . 
    . 
    . 

這讓我獲得了pageContext對象,它提供一些有關調用JSP的有用信息。問題是,PageContext中似乎沒有提供訪問許多JSP的實際隱含對象的...

. 
. 
. 
public int doEndTag() throws JspException { 
    ServletRequest req = _pageContext.getRequest(); 
    . 
    . 
    . 
    return EVAL_PAGE; 
} 

上面描述的ServletRequest對象是HttpServletRequest的完全不同,這是由隱對象實現「請求「在JSP本身。這使得在我的類中調用像HttpServletRequest.getRequestURI()這樣的方便方法存在問題。

因此,通過閱讀其他幾個問題的答案,我留下了一個印象,即沒有獲取實際隱式對象的開箱即用方式。我要麼必須明確地傳遞他們作爲我的JSP定製標記的屬性...

<mc:mytag request="<%=request%>"/> 

...或許它們存儲在其他一些隱含對象的哈希我訪問.. 。

<% session.setAttribute("request", request); %> 

其中,如果是真的,自然會導致我的問題... 你受詛咒跟我開玩笑吧?有一些關鍵,我在這裏失蹤。訪問JSP的隱式對象看起來像是我想要在自定義taglib類中這樣一個相當普遍的事情。這讓我感到非常不方便,因爲每次我需要時都要採取這樣的步驟 - 尤其是當我傳遞像PageContext對象這樣的東西時,可能會爲我提供這些對象,但似乎沒有。

我真的覺得我在這裏失去了一些基本的東西,但我不能爲了我的生活找出可能的東西。有人可以對此有所瞭解嗎?

回答

10

PageContext給你訪問到當前HttpServletRequest,你只需要投它:

HttpServletRequest req = (HttpServletRequest)_pageContext.getRequest(); 

這是不是很大,但可以追溯到一段時間,人們認爲有希望有一天在Servlet API中是非HTTP的東西。

至於術語「隱式對象」的使用,這隻在JSP頁面本身的上下文中才有意義。這個詞除此之外沒有任何意義。代表當前HttpServletRequest的「隱含對象」與PageContext中的對象相同。

+0

[*桌子上的劉海頭*] gahh!我知道我錯過了一些基本的東西:HttpServerRequest擴展了ServerRequest。應該看到它。謝謝你的迴應,skaffman! – Syndog 2010-11-12 15:01:52

+0

是的,「隱式對象」在JSP本身內部只有意義。我想知道我說的是什麼啓發你指出......? – Syndog 2010-11-12 15:20:18

相關問題