爲JSP表達式語言定義函數時,是否有一種方法可以指定函數需要某個隱式對象(如pageContext
)?從JSP EL函數訪問隱式對象
我要定義一個函數${my:href('a.jpg')}
由
public static String href(String fileName, PageContext pageContext)
來實現,但我不希望有pageContext的我每次調用它明確地傳遞給函數。
爲JSP表達式語言定義函數時,是否有一種方法可以指定函數需要某個隱式對象(如pageContext
)?從JSP EL函數訪問隱式對象
我要定義一個函數${my:href('a.jpg')}
由
public static String href(String fileName, PageContext pageContext)
來實現,但我不希望有pageContext的我每次調用它明確地傳遞給函數。
這將是很好,但不是,沒有辦法直接做到這一點。此外,由於JSP EL功能必須是public static
,因此沒有解決方法。所以,解決的辦法就是回到普通的舊JSP代碼:
<% Helper my= new Helper (pageContext); %>
Helper
有一個文件名作爲參數正常的公共方法:
public String href (String fileName) { ... }
後來
... ${my.href(...)}
你只有當您提供將它們(通過過濾器或其他)存儲爲線程局部變量時纔可以訪問「隱式」對象。然後,您可以編寫一些實用程序類,以便從任何情況下合理地獲取它們。一些框架(例如Stripes)(yaay Stripes!)使得它相對容易。
所以你把信息對象放在一些上下文中(這可能在某處使用哈希映射)。這可以很容易地從任何地方找到信息對象,但速度很慢。我的解決方案速度更快但不夠靈活。 – 2010-02-23 16:08:32
這並不慢,你不需要把它們放在散列圖中。 (好吧,不是一個明確的哈希映射,或者一個可見的哈希映射;這都是ThreadLocal實現的問題。)您可以使用單獨的ThreadLocal變量來存儲不同的上下文對象,並通過實用類訪問它們(單例或靜態訪問函數)。 Strips可以讓你保持一個單一的通用上下文對象,從中你可以得到任何你可能需要的東西。 – Pointy 2010-02-23 19:07:26
考慮使用標籤而不是函數。標籤爲您隱式提供了繼承的TagSupport#pageContext
對PageContext
的訪問。
是的,我現在有一個標籤,但我想將它轉換爲函數,因爲'>'冒犯了我的XML敏感性。我不想一路走下去,實現一個完整的'
沒有辦法直接做到這一點,但絕對有可能做到這一點,我在Java Web應用程序中廣泛使用它。 – Pointy 2010-02-23 15:43:48
scriptlet?真? -1 – Yevgeniy 2014-03-08 16:27:06