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 。
我正在为 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