2011-03-15 60 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