【发布时间】:2011-03-04 15:00:49
【问题描述】:
我正在重写 com.sun.facelets.FaceletViewHandler 中定义的 handleRenderResponse 方法:
protected void handleRenderException(FacesContext context, Exception ex)
我将覆盖此方法,以便将用户重定向到自定义错误页面(其中包含所需的外观和其他内容)。这就是我正在尝试的方式
String errorPage = "/error.xhtml";
String contextPath = context.getExternalContext().getRequestContextPath();
String errorPagePath = contextPath+errorPage;
context.getExternalContext().redirect(errorPagePath);
前面的代码是我用来重定向到这个自定义错误页面的代码。无论如何,当我执行重定向时,我会收到一个下载对话框提示(这是使用 Internet Explorer,在 Firefox 中,页面无法正确显示或无法正常显示)。我尝试将“/error.xhtml”更改为“/error.jsf”,但在这种情况下我收到 404 错误。
不知何故,我认为重定向后 XHTML 文件没有被处理到 Facelets ViewHandler,如果我打开下载的 xhtml 文件,我可以看到 EL 表达式没有被解析并且 ui 标记没有被处理。我的应用程序中的其他页面没有问题,只有在以编程方式进行重定向时。
来自我的 web.xml 的重要数据:
facelets.VIEW_MAPPINGS 设置为 *.xhtml
javax.faces.DEFAULT_SUFFIX 设置为 .xhtml
“Faces Servlet”的 servlet 映射是“.jsf”和“/faces/”
【问题讨论】:
-
有什么理由不使用
<error-page>inweb.xml? -
我可以这样做,但实际上我希望能够动态地更多地控制发生异常时会发生什么(例如调用特定的导航规则或更新托管 bean、更新会话数据、等等。)。如果我使用错误页面,我不确定我是否可以拥有这么多的控制权,你怎么看?
-
可以是JSF(XHTML)页面。您可以将托管 bean 附加到它。托管 bean 可以访问
FacesContext。算一下 :) 顺便说一句,在非其他人的帖子中评论其他人的 cmets 时,请使用@name让他们立即得到通知。在我偷看之前我没有看到你的评论。另见this -
@BalusC,很抱歉这么长时间忽略了这篇文章,但是一旦我解决了我的问题,我就忘记更新了。我最终使用了一种混合方法,我同时使用了错误页面元素,并且我还提供了一个自定义的视图处理程序,我在其中覆盖了 handleRenderException 以便对于非常具体的错误情况我可以采取特殊的措施。