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

时间:2015-01-19 01:28:32

标签: jsf servlets el forward web-inf

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

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

request.getRequestDispatcher(" /WEB-INF/HiddenFile.xhtml")。forward(request,response);

我遇到的唯一问题是那些引用某些托管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>

1 个答案:

答案 0 :(得分:1)

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

您已在FacesServlet上映射/faces/*。但是,您的“重定向程序servlet”不会转发到匹配该模式的URL。因此,FacesServlet将不会被调用,因此具有所有taglib和EL的Facelets文件将不会被解析和执行,而只是像纯文本一样返回。

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

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

对于具体问题

无关,“重定向”一词在这里放错了位置。你实际上是在执行forward。并且,您实际上应该使用servlet filter来完成工作。