【问题标题】:Why is a JSF message added to p:messages if the client id doesn't match?如果客户端 ID 不匹配,为什么要向 p:messages 添加 JSF 消息?
【发布时间】:2018-07-13 02:06:29
【问题描述】:

假设我有一个

<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,它与客户端 [1] 上的任何 p:messages 都不匹配。

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

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

参数:

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

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

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

然后是

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

在我的解释中,这意味着如果没有匹配的客户端 ID,则不会显示消息,但同样,这在很大程度上取决于关联在此上下文中的含义。

这个问题显然不是专注于解决通过指定正确的客户端ID来完成的问题,而是要理解这一点。

我在 Primefaces 6.2 中体验过。


[1] 实际上,我希望抛出异常,因为这样更优雅,更省时,但由于我看不到的原因,这可能是个坏主意。

【问题讨论】:

  • clientId - The client identifier with which this message is associated (if any) message - The message to be appended 此 id 指的是引发消息的组件,而不是用于显示消息的目标组件。以某种方式考虑验证消息,这些消息与组件 id 一起显示。看看the showcase。关于组件 id 不存在时抛出的异常,这可能是规范范围内讨论的内容。
  • @XtremeBiker 感谢您的解释,现在更清楚了(Melloware 在下面的回答也涵盖了它)。我希望 JavaEE 世界将在 J4EE 过渡的过程中开放,以便更容易地提出像提议的异常这样的建议。您是否偶然了解了 JSF 在其新家中的状态?

标签: jsf primefaces


【解决方案1】:

让我试着为你解决这个问题。每当您添加 FacesMessage 时,它​​总是会添加到上下文中,并且客户端 ID 只是帮助确定您希望与此验证关联的“哪个”组件。

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

globalOnly = 当为 true 时,只有没有客户端 ID 的 facesmessages 是 显示。默认为假。

通过这种方式,您可以在页面顶部分别显示全局消息和验证消息。如果 client-id 与真实组件匹配,client-id 只会以红色突出显示组件。

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

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

一定要查看消息演示页面以查看消息的实际应用:https://www.primefaces.org/showcase/ui/message/messages.xhtml

【讨论】:

    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多