我有一个JSF应用程序,它的Servlet Filter配置为urlPattern of /faces/*。我希望将JSP隐藏在faces上下文中,这样它就不会通过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页没有找到错误。
更清楚的是,我希望我的Error.jsp页面网址是:
http://localhost:8080/myappname/Error.jsp
但只有通过以下途径才能达到:
http://localhost:8080/myappname/faces/Error.jsp
当我在view-id中声明任何faces-config.xml时,情况也是如此。如果我想对faces上下文隐藏错误JSP,我应该把它保存在哪里?
发布于 2011-10-24 14:46:49
根据到目前为止所提供的信息,它看起来应该工作得很好。过滤器上没有<dispatcher>ERROR</dispatcher>,因此无论何时抛出NPE,都不应该调用过滤器。
显然,NPE陷入了另一个异常,因为它被抛到了一个不符合逻辑的地方,比如bean的构造函数,而不是普通的bean操作方法。在这种情况下,JSF会将其重新抛出为ManagedBeanCreationException。容器将得到它而不是NPE,因此无法定位错误页面。在容器的默认HTTP 500错误页中,应读取堆栈跟踪的最顶层异常,以确定要定义错误页的正确异常。
请记住,像NPEs这样的运行时异常是开发人员错误(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>发布于 2011-10-24 13:03:33
如果您在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站点中了解更多信息
发布于 2011-10-24 13:43:35
对我来说,这听起来不像是滤镜和这个问题有任何关系。你能用完全禁用的过滤器到达http://localhost:8080/myappname/Error.jsp吗?如果没有,那么Error.jsp文件本身可能有一些问题吗?
很难说,如果没有看到代码本身。
https://stackoverflow.com/questions/7875780
复制相似问题