Hide JSPs from FacesContext



我有一个JSF应用程序,它的Servlet Filter配置为/faces/*的urlPattern。我想从faces上下文隐藏一个JSP,这样它就不会通过Servlet Filter。所以我把它放在我的项目的WebContent文件夹下,作为WebContent/Error.jsp,并在web.xml中声明如下:

<error-page>
    <exception-type>java.lang.NullPointerException</exception-type>
    <location>/Error.jsp</location>
</error-page>

但是我的Error.jsp从来没有被接走。相反,我看到404 Page not found error.

为了更清楚,我希望我的Error.jsp页面URL为:

http://localhost: 8080/myappname Error.jsp

但是只能通过:

http://localhost: 8080/myappname/脸/Error.jsp

当我在faces-config.xml中声明任何view-id时也是如此。如果我想从faces上下文中隐藏错误JSP,我应该在哪里保存它?

根据目前给出的信息,看起来应该可以正常工作。在过滤器上没有<dispatcher>ERROR</dispatcher>,因此在抛出NPE时根本不应该调用过滤器。

显然,NPE被包裹在另一个异常中,因为它被抛出在一个不合逻辑的地方,比如bean的构造函数而不是正常的bean操作方法。在这种情况下,JSF会将其作为ManagedBeanCreationException重新抛出。容器将获得它而不是NPE,因此将无法定位错误页。在容器的默认HTTP 500错误页中,您应该读取堆栈跟踪的最顶层异常,以确定为其定义错误页的正确异常。

请记住,运行时异常,如npe是开发人员的错误(bug !),而不是生产错误,他们应该尽快修复。对于这种错误,我个人会使用全局HTTP 500错误页面:

<error-page>
    <status-code>500<status-code>
    <location>/errors/generic.jsp</location>
</error-page>

对于更具体的、真实的生产异常,你总是可以声明一个更具体的错误页:

<error-page>
    <exception-type>com.example.YourDatabaseAccessException</exception-type>
    <location>/errors/database.jsp</location>
</error-page>
<error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/errors/sessionexpired.jsp</location>
</error-page>

如果你定义了一个过滤器并在你的web.xml中声明,所有的请求都将通过这个过滤器,除非你定义了过滤器映射。

我认为你可以在web.xml中定义一个过滤器映射,如下所示:

<filter> 
<filter-name>URLFilter</filter-name> 
<filter-class>the filter class in your source code</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>URLFilter</filter-name> 
<url-pattern>/some pages</url-pattern>//skip error.jsp here
</filter-mapping> 

这不是测试,而只是一个灵感。编辑:你可以从Oracle网站

找到更多信息

对我来说,这听起来不像Faces过滤器与这个问题有任何关系。你能在完全禁用过滤器的情况下访问http://localhost:8080/myappname/Error.jsp吗?如果没有,那么可能是Error.jsp文件本身有问题?

最新更新