Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jsf中的异常处理-在新页面中打印错误消息_Jsf_Jsf 2 - Fatal编程技术网

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

jsf中的异常处理-在新页面中打印错误消息,jsf,jsf-2,Jsf,Jsf 2,我只想在出现异常时在错误页上打印一条自定义消息 我试过这个 if(erroroccured){ FacesMessage message=new FacesMessage("You must login to continue"); context.addMessage(null, message); FacesContext.getCurrentInstance().getExternalContext().redirect("error

我只想在出现异常时在错误页上打印一条自定义消息

我试过这个

    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>


标签也是。。每当发生异常时,我的页面就会被完全重定向。但我不能得到任何错误消息

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

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

  • 不要发送重定向。改为发送转发。您可以通过
    ExternalContext#dispatch()

    或者,如果您已经在操作方法中,则只需以常规方式导航即可

    return "error";
    
  • 创建一个常见错误页面主模板,对每种类型的错误使用单独的模板客户端,并将消息放在视图中

    
    您必须登录才能继续。
    
    然后您可以重定向到这个特定的错误页面,如so
    redirect(“error login.xhtml”)

  • 通过重定向URL传递一些错误标识符作为请求参数,如so
    redirect(“error.xhtml?type=login”)
    ,并让视图处理它

    
    
  • 将faces消息保留在flash范围内

    externalContext.getFlash().setKeepMessages(true);
    
    然而,Mojarra的flash范围实现有点缺陷。在当前版本中,当您需要重定向到其他文件夹时,这将不起作用,但当目标页面位于同一文件夹中时,它将起作用


  • 可能重复:不,不是,这个问题涉及验证错误MSG,我问的是异常处理,我需要重定向到另一个页面来打印我的自定义消息。但在这个问题上没有重定向。。。我可以在同一页中打印验证消息。。问题似乎主要存在于重定向中。现在一切正常,但这个例外怎么办
    无法在响应提交后调用sendRedirect()
    。显然,调用链中较低的其他一些代码也在调用
    sendRedirect()
    (或
    externalContext.redirect()
    ,这是在幕后委托给非常相同的方法)。你需要跳过那个电话。有关提示,请参见此相关答案:
    externalContext.getFlash().setKeepMessages(true);