假设我有一个
<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]实际上,我希望会引发一个异常,因为这样可以更优雅,更节省时间,但是由于我看不到的原因,这可能不是一个好主意。
答案 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