Доступ к JSP-контексту внутри пользовательской EL-функции - PullRequest
7 голосов
/ 15 марта 2011

Как получить доступ к контексту JSP внутри пользовательской функции EL.

Ответы [ 2 ]

8 голосов
/ 15 марта 2011

Вы должны явно включить его в качестве аргумента в метод, который реализует вашу функцию EL.

Метод Java, который реализует функцию EL:

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

Запись TLD для функции EL:

<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 голосов
/ 07 января 2016

Или вы можете использовать сложный трюк. Если вы в порядке с 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, лучше сделайте это setPageContext в скрипте JSP, возможно, в файле включения. Это имеет тот недостаток, что КАЖДЫЙ JSP-файл должен выполнять это включение

...