2011-03-15 19 views
6

如何訪問自定義EL函數內部的JSP上下文。在自定義EL函數中訪問JSP上下文

+0

「自定義EL功能」是什麼意思? – skaffman 2011-03-15 15:47:25

+0

@skaffman:參見http://stackoverflow.com/questions/2523430/hidden-features-of-jsp-servlet的「EL函數」部分。 @Viren:你究竟需要什麼JSP上下文?即您想要調用/獲取哪些方法/信息?在任何情況下,答案都是:只需將該信息作爲函數參數傳遞即可。 – BalusC 2011-03-15 17:56:33

回答

7

你必須明確地將它作爲實現EL函數的方法的參數。

實現EL功能

Java方法:對於EL功能

public static Object findAttribute(String name, PageContext context) { 
    return context.findAttribute(name); 
} 

TLD條目:

<function> 
    <name>findAttribute</name> 
    <function-class>kschneid.Functions</function-class> 
    <function-signature>java.lang.Object findAttribute(java.lang.String, javax.servlet.jsp.PageContext)</function-signature> 
</function> 

用法在JSP:

<%@ taglib prefix="kfn" uri="http://kschneid.com/jsp/functions" %> 
... 
<c:if test="${empty kfn:findAttribute('userId', pageContext)}">...</c:if> 
+0

可以請你分享一個示例代碼。 – Viren 2011-03-15 17:48:28

+0

編輯添加示例 – kschneid 2011-03-15 18:04:50

+0

非常感謝。這個例子很棒,正是我想要的。 – Viren 2011-03-15 18:46:56

-1

或者你可以使用一個複雜的伎倆。如果你是用ServletContext而不是PageContext確定它會更容易

  • 在你EL功能類,定義一個靜態ThreadLocal<PageContext>變量
  • 從一個自定義過濾器,從設置的PageContext
  • 存取自由的EL功能

代碼例如:

public class MyFunctions { 

    private static final ThreadLocal<ServletContext> servletContext = new ThreadLocal<>(); 

    public static void setServletContext(ServletContext servletContext) { 
     MyFunctions.servletContext.set(servletContext); 
    } 

} 

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException{ 
    ... 

    MyFunctions.setServletContext(servletRequest.getServletContext()); 

    filterChain.doFilter(servletRequest, servletResponse); 
} 

如果你真的需要PageContext更好的做一個JSP scritplet setPageContext,可能在一個包含文件。這有一個缺點,即每個JSP文件都必須執行該包含操作。

+0

想法很好,但方法有嚴重的錯誤。請測試/澄清/修復它。 – BalusC 2016-01-08 10:40:40

+0

我打算實施和測試,但我寧願找到另一種策略(通過Spring bean)。因此,如果您可以好好舉例說明一些錯誤,我可以查看我的代碼(或者完全刪除它,只留下想法)。基本原理是我假設整個JSP請求生命週期發生在單個線程中 – 2016-01-08 10:55:26

+0

這裏主要監督的是線程彙集(並因此在不同請求中重用)的事實。 – BalusC 2016-01-08 10:59:31

相關問題