我有一个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文件本身有问题?