【问题标题】:Getting the current global messages from FacesContext从 FacesContext 获取当前的全局消息
【发布时间】:2011-11-22 09:23:46
【问题描述】:

我有问题。我需要知道我的页面是否有全局错误。这是因为我有 2 个不同的 h:messages(错误容器)

<h:messages id="errorMsgsContainer"
layout="table" 
rendered="true"
styleClass="message-container error-message" 
infoClass="info" 
errorClass=" error" warnClass="warn-message warn" globalOnly="true"/>

<h:messages id="errorMsgsContainerValidation"
layout="table" 
styleClass="message-container error-message-validation" 
infoClass="info" 
errorClass="error" globalOnly="false"/>

一个将显示与业务相关的消息,另一个将仅显示验证消息。由于业务需要,有两个messages

生成验证错误消息时,facelet 工作正常,因为 messages 标记之一具有 globalOnly="true" 属性值对。

当我遇到仅全局错误时,问题就来了。它将出现在两个框中。

我想知道是否有任何错误是全局性的,所以在用户在我的表单上修复全局错误之前,我不会显示验证容器。

我已经尝试通过FacesContext 使用

FacesContext.getCurrentInstance().getMessageList().get(i).getSeverity()

还有其他一些命令,但它似乎不起作用。

请帮我解决这个问题。如何获取当前的全局消息列表,以便知道是否有任何全局错误?

【问题讨论】:

    标签: java jsf facescontext


    【解决方案1】:

    当产生验证错误消息时,facelet 工作正常,因为其中一个消息标签具有 globalOnly="true" 属性-值对。

    这是不正确的。您在另一个带有globalOnly="false" 属性值对的h:messages 标记中看到验证错误消息。验证消息总是有一个客户端 ID,它恰好是验证失败的表单元素的 ID,因此将显示在允许显示非全局消息的 messages 标记中,或者具有 @ 的值987654324@ 属性设置为适用的 Id。

    当我遇到仅全局错误时,问题就来了。它将出现在两个框中。

    这是预期的行为。我相信您已经混淆了globalOnly 属性的含义。当globalOnly 属性的值为true 时,只会显示全局消息(即没有客户端ID 的消息);当该值为 false 时,除了已排队的其他消息外,还将显示全局消息。这可以解释为什么全局消息显示两次 - 第一个 h:messages 标记会显示全局消息,因为它应该只显示全局消息,第二个会显示它,因为它可以显示它。

    请帮我解决这个问题。如何获取当前的全局消息列表,以便知道是否有任何全局错误?

    如果你想在你的 facelet 中继续有两个h:messages 标签,那么你可以在你的FacesMessages 排队显示时使用一个“伪全局”ID,而不是指定一个null 的ID;以下示例中的伪全局 ID 的值为 inputForm,这是一个有效的客户端 ID(表单),在这种情况下不会生成任何验证消息:

    FacesContext.getCurrentInstance().addMessage("inputForm", new FacesMessage(FacesMessage.SEVERITY_INFO, "Added a global message", null));
    

    然后您可以添加一个 EL 表达式来呈现负责显示输入验证消息的 messages 标记:

    <html xmlns="http://www.w3.org/1999/xhtml" 
          xmlns:ui="http://java.sun.com/jsf/facelets" 
          xmlns:h="http://java.sun.com/jsf/html" 
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:fn="http://java.sun.com/jsp/jstl/functions">
    ...
        <h:form id="inputForm">
        ...
        </h:form>
        <h:messages id="psuedoGlobalMessages" for="inputForm" globalOnly="true" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" />
        <h:messages id="clientMessages" rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}" globalOnly="false" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" />
    ...
    

    注意,globalOnly 属性仅在一个messages 标记中使用。如果伪全局消息通过rendered 属性中指定的EL 表达式排队等待显示,则也不会显示相同的messages 标记。您还可以使用专门创建的隐藏表单元素的客户端 ID 来引导所有伪全局消息,而不是使用表单的客户端 ID。

    【讨论】:

      【解决方案2】:

      试试这个:

      rendered="#{not empty facesContext.getMessageList('inputForm')}
      

      代替:

      rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}"
      

      在 Vineet Reynolds 的回答中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多