我有问题。我需要知道我的页面是否有全局错误。这是因为我有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()
和其他一些命令,但它似乎不起作用。
请帮我解决这个问题。如何获取当前的全局消息列表,以便知道是否存在全局错误?
答案 0 :(得分:3)
生成验证错误消息时,facelet工作正常,因为其中一个消息标记具有globalOnly =“true”属性值对。
这是不正确的。您在另一个带有h:messages
属性值对的globalOnly="false"
标记中看到了验证错误消息。验证消息总是有一个客户端ID,它恰好是验证失败的表单元素的Id,因此将显示在允许显示非全局消息的messages
标记中,或者具有for
属性设置为适用的ID。
当我出现全局错误时,问题就出现了。它将出现在两个框中。
这是预期的行为。我相信你已经混淆了globalOnly
属性的含义。当globalOnly
属性的值为true时,仅显示全局消息(即没有客户端ID的消息);当值为false时,除了已排队的其他消息之外,还将显示全局消息。这可以解释为什么全局消息显示两次 - 第一个h:messages
标记将显示全局消息,因为它应该只显示全局消息,第二个将显示它,因为它可以显示它。
请帮我解决这个问题。如何获取当前的全局消息列表,以便知道是否存在全局错误?
如果您希望在facelet中继续使用两个h:messages
标记,则可以在排队FacesMessage
进行排队时使用“伪全局”ID,而不是指定ID为{ {1}};以下示例中的伪全局Id的值为null
,它是一个有效的客户端ID(表单),在这种情况下不会生成任何验证消息:
inputForm
然后,您可以添加EL表达式以呈现负责显示输入验证消息的FacesContext.getCurrentInstance().addMessage("inputForm", new FacesMessage(FacesMessage.SEVERITY_INFO, "Added a global message", null));
标记:
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
属性。如果伪全局消息通过messages
属性中指定的EL表达式排队等待显示,则也不会显示相同的rendered
标记。您还可以使用专门创建的隐藏表单元素的客户端ID来指示所有伪全局消息,而不是表单的客户端ID。
答案 1 :(得分:0)
试试这个:
rendered="#{not empty facesContext.getMessageList('inputForm')}
而不是:
rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}"
在Vineet Reynolds的回答中。