4

我有个问题。我需要知道我的页面是否有全局错误。这是因为我有 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"属性-值对。

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

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

我试图通过FacesContextwith

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

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

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

4

2 回答 2

3

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

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

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

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

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

如果你想在你的 facelet 中继续有两个h:messages标签,那么你可以在排队你的 s 以显示时使用一个“伪全局”Id FacesMessage,而不是指定一个 Id null; 以下示例中的伪全局 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标签中。如果伪全局消息通过属性messages中指定的 EL 表达式排队等待显示,则也不会显示相同的标记。rendered您还可以使用专门创建的隐藏表单元素的客户端 ID 来引导所有伪全局消息,而不是使用表单的客户端 ID。

于 2011-09-22T04:08:15.307 回答
0

试试这个:

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

代替:

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

在 Vineet Reynolds 的回答中。

于 2015-07-31T04:47:08.167 回答