RequestDispatcher#forward() 打开的/WEB-INF 中的 Facelets 文件中的 EL 评估

Evaluation of EL in Facelets files in /WEB-INF opened by RequestDispatcher#forward()

我正在为 Glassfish 上的企业应用程序使用 Java EE。

我在 WEB-INF 中有一些 xhtml 文件以防止直接 URL 访问。这些文件由这样的 servlet 显示:

request.getRequestDispatcher("/WEB-INF/HiddenFile.xhtml").forward(请求, 响应);

我遇到的唯一问题是那些引用某些托管 bean 的文件中的表达式语言没有得到评估。

非常感谢任何有关获取这些文件的表达式语言评估的帮助。

提前致谢

编辑

我认为这些信息没有用,但既然有人在这里请求它,那就有用了。

要显示的页面,WEB-INF/HiddenFiles/FileA.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html">
    <h:head>
        <title>PAGE A</title>
    </h:head>
    <h:body>
        A - #{testBean.testString}
    </h:body>
</html>

负责生成响应的 servlet 的摘录:

public class RedirectorServlet extends HttpServlet {

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
 * methods.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    if (logic()) {
        request.getRequestDispatcher("/WEB-INF/HiddenFiles/fileA.xhtml").forward(request, response);
    } else {
        request.getRequestDispatcher("/WEB-INF/HiddenFiles/fileB.xhtml").forward(request, response);
    }

    *other methods including logic()*

}

WEB-INF中的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>RedirectorServlet</servlet-name>
        <servlet-class>servlet.RedirectorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>RedirectorServlet</servlet-name>
        <url-pattern>/RedirectorServlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

EL 仅在 Facelets 文件的情况下由 FacesServlet 评估,在 JSP 文件的情况下由 JspServlet 评估。

您已将 FacesServlet 映射到 /faces/*。但是,您的 "redirector servlet" 没有转发到与该模式匹配的 URL。因此 FacesServlet 不会被调用,因此带有所有标签库和 EL 的 Facelets 文件不会被解析和执行,而是像纯文本一样返回。

您需要将 FacesServlet 映射从 /faces/* 更改为 *.xhtml,以便它也可以在放置在 /WEB-INF 中的 XHTML 文件上调用,该文件由一个 servlet 或过滤器。

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

与具体问题无关,术语"redirect"在这里用错了。您在这里实际上是在为工作执行 forward. And, you should actually be using a