Facelets 错误页面在使用 FullAjaxExceptionHandler 的 ajax 请求期间有效,但在同步请求期间不评估 EL
Facelets error page works during ajax request with FullAjaxExceptionHandler, but does not evaluate EL during synchronous request
我正在尝试使用 Omnifaces 库配置一个普通的(非 ajax)请求错误页面。我能够使用 FullAjaxExceptionHandler 和 ajax 请求错误及其页面,如演示中所示。当我使用与正常请求相同的错误页面时,会显示错误页面,但值显示为源代码(例如 Date/time: #{of:formatDate(now, 'yyyy-MM-dd HH:mm:ss')} 用户代理: #{header['user-agent']} .. 原样显示在浏览器中。
我正在使用 Tomcat 7、JSF 2.2 (MyFaces)、Weld 2.6(用于 CDI)、Omnifaces 2.0 和 Primefaces 5.1。以下是相关代码。
页面:
<h:commandButton value="Throw runtime exception on normal request"
action="#{appbean.throwRuntimeException}"/>
<p:commandButton value="Throw runtime exception on AJAX request"
action="#{appbean.throwRuntimeException}"/>
豆子:
public void throwRuntimeException() {
throw new RuntimeException("peek-a-boo");
}
面孔配置:
<factory>
<exception-handler-factory>
org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
</exception-handler-factory>
</factory>
web.xml:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>facesExceptionFilter</filter-name>
<filter-class>org.omnifaces.filter.FacesExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>facesExceptionFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/WEB-INF/errorpages/error2.xhtml</location>
</error-page>
<error-page><location>
必须匹配 FacesServlet
映射,以便在同步请求异常期间也能在错误页面上获得 FacesServlet
到 运行(这不会不要使用 ViewHandler#renderView()
, but RequestDispatcher#forward()
).
相应地更改映射:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
使用 /faces/*
(和 *.faces
)是 soo JSF 1.0/1.1。如果您出于某种原因确实需要保留 /faces/*
(例如,具有已发布 URL 的现有 Web 应用程序),则只需同时使用两者(并相应地使用 301 进行迁移):
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
另请参阅:
- JSF returns blank/unparsed page with plain/raw XHTML/XML/EL source instead of rendered HTML output
我正在尝试使用 Omnifaces 库配置一个普通的(非 ajax)请求错误页面。我能够使用 FullAjaxExceptionHandler 和 ajax 请求错误及其页面,如演示中所示。当我使用与正常请求相同的错误页面时,会显示错误页面,但值显示为源代码(例如 Date/time: #{of:formatDate(now, 'yyyy-MM-dd HH:mm:ss')} 用户代理: #{header['user-agent']} .. 原样显示在浏览器中。
我正在使用 Tomcat 7、JSF 2.2 (MyFaces)、Weld 2.6(用于 CDI)、Omnifaces 2.0 和 Primefaces 5.1。以下是相关代码。
页面:
<h:commandButton value="Throw runtime exception on normal request"
action="#{appbean.throwRuntimeException}"/>
<p:commandButton value="Throw runtime exception on AJAX request"
action="#{appbean.throwRuntimeException}"/>
豆子:
public void throwRuntimeException() {
throw new RuntimeException("peek-a-boo");
}
面孔配置:
<factory>
<exception-handler-factory>
org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
</exception-handler-factory>
</factory>
web.xml:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<filter>
<filter-name>facesExceptionFilter</filter-name>
<filter-class>org.omnifaces.filter.FacesExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>facesExceptionFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/WEB-INF/errorpages/error2.xhtml</location>
</error-page>
<error-page><location>
必须匹配 FacesServlet
映射,以便在同步请求异常期间也能在错误页面上获得 FacesServlet
到 运行(这不会不要使用 ViewHandler#renderView()
, but RequestDispatcher#forward()
).
相应地更改映射:
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
使用 /faces/*
(和 *.faces
)是 soo JSF 1.0/1.1。如果您出于某种原因确实需要保留 /faces/*
(例如,具有已发布 URL 的现有 Web 应用程序),则只需同时使用两者(并相应地使用 301 进行迁移):
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
另请参阅:
- JSF returns blank/unparsed page with plain/raw XHTML/XML/EL source instead of rendered HTML output