在两个不同的路径上配置相同的错误页面?

时间:2018-07-20 20:24:18

标签: jsf error-handling http-status-code-404 web.xml faces-config

我正在尝试尽可能简单地在“分支” JSF2应用程序中处理错误,该应用程序具有用于移动设备和台式机的单独的模板以及XHTML页面路径。

目前主要的servlet映射(可能需要修改)

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
    <url-pattern>/javax.faces.resource/*</url-pattern>
</servlet-mapping>

在我的情况下,此方法可以很好地处理桌面错误:

<error-page>
    <error-code>404</error-code>
    <location>/faces/webpages/filenotfound.xhtml</location>
</error-page>
<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/faces/webpages/filenotfound.xhtml</location>
</error-page>

但是考虑到分叉的页面和模板集,我也想拥有

<error-page>
    <error-code>404</error-code>
    <location>/faces/mpages/filenotfound.xhtml</location>
</error-page>
<error-page>
    <exception-type>java.io.FileNotFoundException</exception-type>
    <location>/faces/mpages/filenotfound.xhtml</location>
</error-page>

是否有一种方法可以直接在web.xml中执行此操作,或者使用与上下文根目录无关的路径,或者通过将一些配置嵌套在定义用于不同场景的路径的块中?还是使用faces-config.xml并创建可与确切的XHTML文件位置匹配的自定义结果?

1 个答案:

答案 0 :(得分:0)

好吧,我没有得到回应(也没有想到我会得到)。对于它的价值,这是我为了获得期望的结果所做的事情。

  1. 创建了一个新的404.jsp页面
  2. 为了简洁起见,将我的xhtml页面重命名为404.xhtml
  3. 在正文中插入与此类似的代码:

String pageRoot = MobileChecker.isMobile( request ) ? "mpages" : "webpages"; if(!response.isCommitted()) { response.sendRedirect(request.getContextPath() + "/faces/" + pageRoot + "/404.xhtml"); }

不幸的是,“ MobileChecker”部分是我们代码库的旧部分,但是要尽一切努力检测出该设备应该被视为“移动设备”(UA嗅探可能是其中的一部分,但是从客户端传递的功能检测可能会更好)。我们已经在服务器级别进行了此设置,因此对应用程序根目录的请求已相应地重定向到/webpages/mpages路径。

到目前为止,这种方法总体上似乎可行。