从FacesContext获取当前的全局消息

时间:2011-09-21 22:57:59

标签: java jsf facescontext

我有问题。我需要知道我的页面是否有全局错误。这是因为我有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()

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

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

2 个答案:

答案 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的回答中。