用隐式导航替换导航用例后,显示未显示的消息



我把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消息是请求范围的。它们被添加到当前请求中。重定向指示浏览器在给定URL上创建一个全新的 GET请求。新请求与当前请求不同。这个新请求根本不包含这些faces消息。

你有两个选择:

  1. 不要重定向。你可能也没有在你原来的导航案例中重定向。

    if (result == 1) {
        return "DatacentersList.xhtml";
    }
    if (result == 2) {
        return "NewDatacenter.xhtml";
    }
    
  2. 将消息保持在flash范围内。只要有一个重定向,flash作用域就有效地存在。

    context.getExternalContext().getFlash().setKeepMessages(true);
    

    请注意,旧的Mojarra版本有一些与此相关的特殊错误。例如,重定向到另一个文件夹仍然会导致失败。确保你至少使用Mojarra 2.1.14版本,以确保你不会被这些bug困扰(它目前已经是2.1.20)。

最新更新