如果客户端ID不匹配,为什么要在p:messages中添加JSF消息?

时间:2018-07-13 02:06:29

标签: jsf primefaces

假设我有一个

<h:form>
    <p:commandButton value="Add no message">
        <p:ajax listener="#{backingBean0.action0()}"
                update="@form"/>
    </p:commandButton>
    <p:messages id="messages"/>
</h:form>

并且我为FacesContext.addMessage提供了错误的客户端ID(想象现实中的错字):

@Named
@ViewScoped
public class BackingBean0 implements Serializable {
    private static final long serialVersionUID = 1L;

    public void action0() {
        FacesContext.getCurrentInstance().addMessage("inexisting",
                new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "summary",
                        "detail"));
    }
}

为什么将在BackingBean0.action0中创建的消息添加到p:messages中?我希望不会添加该消息,因为已指定了一个非空且非空的客户端ID,该ID与客户端[1]上的任何p:messages不匹配。

似乎已可靠地将消息添加到与客户端ID匹配的p:messages元素中(并且仅添加到它们)。 FacesContext.addMessage的Javadoc状态

  

如果clientId不为null,则将FacesMessage附加到与指定的客户端标识符关联的消息集。如果clientId为null,则假定此FacesMessage与任何特定的组件实例都不关联。

     

参数:

     

clientId-与该消息相关联的客户端标识符(如果有)   邮件-要附加的邮件

     

抛出:   IllegalStateException-如果在释放此实例之后调用此方法NullPointerException-如果message为空

这当然引起了一个问题,一个非关联的消息可能意味着什么(该消息是否显示或在某个地方排队-关联在这种情况下只是一个解释力为零的单词)。

然后是

  

与此消息相关联的客户端标识符(如果有)

按照我的解释,这意味着如果没有客户端ID匹配,则不会显示该消息,但是再次,这很大程度上取决于在这种情况下关联的含义。

这个问题显然不是着重解决通过指定正确的客户ID来解决的问题,而是要理解这一点。

我在Primefaces 6.2中体验了这一点。


[1]实际上,我希望会引发一个异常,因为这样可以更优雅,更节省时间,但是由于我看不到的原因,这可能不是一个好主意。

1 个答案:

答案 0 :(得分:2)

让我尝试为您清除此问题。每当您添加FacesMessage时,它总是会添加到上下文中,并且client-id只是确定此验证与之关联的“哪个”组件的助手。

PrimeFaces以globalOnly标志的形式对其消息组件提供了一些帮助。

  

globalOnly =为true时,只有没有客户端ID的facemessages是   显示。默认值为false。

这样,您可以在页面顶部拥有一种分别显示全局消息和验证消息的方法。如果客户ID与真实的ID匹配,则客户ID只会用红色突出显示一个组件。

<p:messages id="globalMessages" globalOnly="true"/>

<p:messages id="validationMessages" globalOnly="false" redisplay="false"/>

一定要查看“消息”演示页面以查看正在使用的消息:https://www.primefaces.org/showcase/ui/message/messages.xhtml