Когда генерируются сообщения об ошибках валидации, лицевая сторона работает нормально, поскольку один из тегов сообщений имеет пару атрибут-значение globalOnly = "true".
Это неверно. Вы видите сообщения об ошибках проверки в другом теге h:messages
с парой атрибут-значение globalOnly="false"
. Сообщения проверки всегда имеют идентификатор клиента, который является идентификатором элемента формы, который не прошел проверку, и, следовательно, будет отображаться в теге messages
, который позволяет отображать неглобальные сообщения, или имеет значение for
атрибут установлен на соответствующий идентификатор.
Проблема возникает, когда у меня глобальная ошибка. Он появится в обоих полях.
Это ожидаемое поведение. Я полагаю, вы запутали значение атрибута globalOnly
. Когда значение атрибута globalOnly
равно true, будут отображаться только глобальные сообщения (т.е. сообщения без идентификатора клиента); когда значение равно false, глобальные сообщения будут отображаться в дополнение к другим сообщениям, которые уже поставлены в очередь. Это объясняет, почему глобальные сообщения отображаются дважды - первый тег h:messages
будет отображать глобальное сообщение, потому что он должен отображать только глобальные сообщения, а второй отображать его, потому что он может отображать его.
Пожалуйста, помогите мне решить эту проблему. Как я могу получить текущий глобальный список сообщений, чтобы я мог знать, есть ли глобальная ошибка?
Если вы хотите продолжить иметь два h:messages
тега в своем лицевом стекле, тогда вы можете использовать «псевдоглобальный» Id при постановке в очередь ваших FacesMessage
s для отображения вместо указания Id в null
; значение псевдоглобального идентификатора в следующем примере - inputForm
, который является действительным идентификатором клиента (в форме), который не будет иметь никаких сообщений проверки, созданных в этом случае:
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
. Вы также можете использовать идентификатор клиента скрытого элемента формы, созданного специально для направления всех псевдоглобальных сообщений, вместо идентификатора клиента формы.