Jsf 将导航大小写替换为隐式导航后,将显示未显示的消息

Jsf 将导航大小写替换为隐式导航后,将显示未显示的消息,jsf,jsf-2,primefaces,Jsf,Jsf 2,Primefaces,我从faces config.xml中删除了导航案例,并切换到隐式导航 FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, new FacesMessage("Successful", "Datacenter " + ndc.componentStatsId + " is created!")); if (result == 1) { return "Datacenters

我从
faces config.xml
中删除了导航案例,并切换到隐式导航

FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, new FacesMessage("Successful", "Datacenter " + ndc.componentStatsId + " is created!"));

if (result == 1)
{
    return "DatacentersList.xhtml?faces-redirect=true";
}

if (result == 2)
{
    return "NewDatacenter.xhtml?faces-redirect=true";
}
return null;

导航运行得很好,但事实证明,faces消息不再显示。这是如何造成的,我如何解决这一问题?

Faces消息是请求范围内的消息。它们将添加到当前请求中。重定向指示浏览器在给定URL上创建全新的获取请求。该新请求与当前请求不同。这个新请求根本不包含那些faces消息

您有两种选择:

  • 不要重定向。在最初的导航案例中,您可能也没有重定向

    if (result == 1) {
        return "DatacentersList.xhtml";
    }
    
    if (result == 2) {
        return "NewDatacenter.xhtml";
    }
    
  • 闪存范围中的消息。只要一次重定向,闪存示波器就可以有效使用

    context.getExternalContext().getFlash().setKeepMessages(true);
    
    请注意,较旧的Mojarra版本有一些与此相关的特殊bug。例如,重定向到其他文件夹仍会导致失败。确保您至少使用了Mojarra版本2.1.14,以确保您不会被这些bug所困扰(目前已经是2.1.20)


  • 请注意,执行转发还是重定向在功能上是一个相对巨大的差异,应该根据功能需求仔细决定。例如,您希望响应是幂等的/可书签的吗?当最终用户按F5刷新登录页时,您希望发生什么?或者当终端用户复制粘贴/书签当前URL(显示在浏览器的地址栏中)并重新打开它时?或者当最终用户通过浏览器历史导航回它时?这不是一个应该草率作出的决定。