我有一个JSF应用程序,其中为Filter
的urlPattern配置了Servlet /faces/*
。
我想隐藏来自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
网页网址为:
但它只能通过以下方式到达:
当我在view-id
中声明任何faces-config.xml
时,情况也是如此。如果我想将其隐藏在faces
上下文中,我在哪里保留错误JSP?
答案 0 :(得分:0)
如果您在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 site
了解更多信息答案 1 :(得分:0)
对我而言,这听起来并不像Faces过滤器与此问题有任何关系。完全禁用过滤器可以到达http://localhost:8080/myappname/Error.jsp吗?如果没有,那么可能是Error.jsp文件本身存在一些问题?
如果不看代码本身就很难说。
答案 2 :(得分:0)
根据目前为止提供的信息,它看起来应该可以正常工作。您在过滤器上没有<dispatcher>ERROR</dispatcher>
,因此无论何时抛出NPE都不应调用过滤器。
显然NPE在另一个异常中被包裹起来,因为它被抛到一个不合逻辑的地方,比如bean的构造函数,而不是普通的bean动作方法。在这种情况下,JSF会将其重新抛出为ManagedBeanCreationException
。容器将获取它而不是NPE,因此将无法找到错误页面。在容器的默认HTTP 500错误页面中,您应该读取堆栈跟踪的最高异常,以确定为其定义错误页面的正确异常。
请记住,像NPE这样的运行时异常是开发人员错误(错误!),而不是生产错误,应该尽快修复它们。我个人只是使用全局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>