从FacesContext隐藏JSP

时间:2011-10-24 12:41:42

标签: java jsf servlet-filters

我有一个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网页网址为:

  

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

但它只能通过以下方式到达:

  

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

当我在view-id中声明任何faces-config.xml时,情况也是如此。如果我想将其隐藏在faces上下文中,我在哪里保留错误JSP?

3 个答案:

答案 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>