jsf中的异常处理 - 在新页面中打印错误消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jsf中的异常处理 - 在新页面中打印错误消息相关的知识,希望对你有一定的参考价值。

我只想在发生异常时在错误页面上打印自定义消息。

我试过这个

    if(erroroccured){
        FacesMessage message=new FacesMessage("You must login to continue");
        context.addMessage(null, message);
        FacesContext.getCurrentInstance().getExternalContext().redirect("error.xhtml");

    }

在error.xhtml我给了

    <h:messages></h:messages>

标签也..每当发生异常时我的页面都被完美地重定向。但我没有得到任何错误消息。

答案

Faces消息是请求范围。重定向基本上指示webbrowser发送全新的HTTP请求(这也是您在浏览器地址栏中看到URL被更改的原因)。在新请求中,当前在先前请求中设置的面部消息当然不再可用。

有几种方法可以让它工作:

  1. 不要发送重定向。发送前进代替。你可以通过ExternalContext#dispatch()来做到这一点 FacesContext.getCurrentInstance().getExternalContext().dispatch("error.xhtml"); 或者如果你已经在一个动作方法中,只需按常规方式导航 return "error";
  2. 创建一个公共错误页面主模板,并为每种类型的错误使用单独的模板客户端,并将该消息放入视图中。 <ui:composition template="/WEB-INF/templates/error.xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" > <ui:define name="message"> You must login to continue. </ui:define> </ui:composition> 然后你可以重定向到这个特定的错误页面,就像redirect("error-login.xhtml")
  3. 通过重定向URL传递一些错误标识符作为请求参数,如redirect("error.xhtml?type=login"),让视图处理它。 <h:outputText value="You must login to continue." rendered="#{param.type == 'login'}" />
  4. 将面部消息保留在闪存范围中。 externalContext.getFlash().setKeepMessages(true); 然而,Mojarra有一个有点错误的闪存范围实现。对于当前版本,当您需要重定向到其他文件夹时,这将不起作用,但当目标页面位于同一文件夹中时它将起作用。

以上是关于jsf中的异常处理 - 在新页面中打印错误消息的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2全局异常处理,导航到错误页面没有发生

JSF ajax 请求中的异常处理

JSF ajax 请求中的异常处理

处理 AJAXified 组件的 JSF 2.0 异常的正确方法是啥?

在新选项卡/窗口中打开链接而不丢失当前 JSF 页面的视图范围

p:commandLink无法在新窗口/选项卡中打开页面