代码之家  ›  专栏  ›  技术社区  ›  Kalle Richter

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

  •  2
  • Kalle Richter  · 技术社区  · 6 年前

    假设我有

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

    我给你提供了错误的客户id FacesContext.addMessage (想象一下现实世界中的一个打字错误):

    @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 ? 我希望消息不会被添加,因为已经指定了一个非null和非空的客户端id,它与任何 p:留言 在客户端[1]。

    消息似乎被添加到了 p:留言 元素可靠地匹配客户端id(并且仅与之匹配)。的Javadoc FacesContext。添加消息

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

    参数:

    clientId—与此消息关联的客户端标识符(如果有) 消息-要附加的消息

    抛出: IllegalStateException-如果在释放此实例后调用此方法NullPointerException-如果消息为null

    当然,这就提出了一个问题,一条没有关联的消息可能意味着什么(它是否被显示,或者是否在某个地方排队——在这种情况下,关联只是一个没有解释力的词)。

    然后是

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

    这在我的理解中意味着,如果没有与客户机id匹配的消息,则不会显示,但这在很大程度上取决于关联在这种上下文中的含义。

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

    我用Primefaces 6.2体验到了这一点。


    [1] 实际上,我希望抛出一个异常,因为这样做更优雅,节省时间,但这可能是个坏主意,原因我不明白。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Melloware    6 年前

    让我来帮你澄清一下。无论何时添加FacesMessage,它都会被添加到上下文中,客户机id只是一个帮助器,用于确定要与该验证关联的“哪个”组件。

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

    globalOnly=如果为true,则只显示没有客户端ID的FacesMessage 显示。默认值为false。

    这样,您可以在页面顶部单独显示全局消息和验证消息。如果客户端id与真实组件匹配,则客户端id也只会以红色突出显示组件。

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

    一定要查看Messages demo页面,查看正在运行的消息: https://www.primefaces.org/showcase/ui/message/messages.xhtml