gpt4 book ai didi

java - 从 FacesContext 获取当前全局消息

转载 作者:行者123 更新时间:2023-12-03 06:45:39 28 4
gpt4 key购买 nike

我有一个问题。我需要知道我的页面是否存在全局错误。这是因为我有 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"/>

一个将显示业务相关消息,另一个将仅显示验证消息。由于业务需求,有两条消息

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

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

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

我尝试使用

通过 FacesContext 获取它
FacesContext.getCurrentInstance().getMessageList().get(i).getSeverity()

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

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

最佳答案

When validation error messages are produced, the facelet works fine, because one of the messages tag has the globalOnly="true" attribute-value pair.

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

The problem comes when I've a global-only error. It will appear in both boxes.

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

Please help me to solve this problem. How can I get the current global messages list, so I can know if there is any global error?

如果您想在 Facelet 中继续使用两个 h:messages 标记,那么您可以在对 FacesMessage 进行排队显示时使用“伪全局”ID ,而不是指定 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" />
...

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

关于java - 从 FacesContext 获取当前全局消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7507729/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com