我只想在发生异常时在错误页面上打印自定义消息。
我试过这个
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>
标签..每当发生异常时,我的页面都被完美地重定向。但我得到任何错误消息。
答案 0 :(得分:8)
Faces消息是请求范围的。重定向基本上指示webbrowser发送全新的HTTP请求(这也是您在浏览器地址栏中看到URL被更改的原因)。在新请求中,当前在请求中设置的面部消息当然不再可用。
有几种方法可以让它发挥作用:
不要发送重定向。发送前进代替。您可以ExternalContext#dispatch()
FacesContext.getCurrentInstance().getExternalContext().dispatch("error.xhtml");
或者如果你已经在一个动作方法中,只需按常规方式导航
return "error";
创建一个常见的错误页面主模板,并为每种类型的错误使用单独的模板客户端,并将该消息放入视图中。
<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")
。
通过重定向网址将一些错误标识符作为请求参数传递,如redirect("error.xhtml?type=login")
,并让视图处理它。
<h:outputText value="You must login to continue." rendered="#{param.type == 'login'}" />
将面部消息保留在闪存范围内。
externalContext.getFlash().setKeepMessages(true);
然而,Mojarra有一个有点错误的闪存范围实现。对于当前版本,当您需要重定向到其他文件夹时,这将不起作用,但当目标页面位于同一文件夹中时它将起作用。