在自定义EL函数中访问JSP Context

时间:2011-03-15 15:43:01

标签: jsp el

如何在自定义EL函数中访问JSP上下文。

2 个答案:

答案 0 :(得分:7)

您必须明确地将其作为实现EL函数的方法的参数。

实现EL功能的Java方法:

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

EL功能的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>

答案 1 :(得分:-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文件都必须执行该包含