JSF: лучший способ проверить наличие <h: message for = "id" /">
У меня есть форма, в которой сообщение об ошибке проверки должно отображаться под входными элементами. Ошибка должна быть подсвечена, показывая пузырек ошибки вокруг сообщения об ошибке и текста ввода.
Чтобы достичь этого, мне нужно проверить наличие h: сообщений для отдельных элементов.
Я могу проверить наличие глобальных сообщений об ошибках следующим образом
<h:panelGroup rendered="#{not empty facesContext.messages}">
</h:panelGroup>
Как я могу проверить то же самое для конкретного идентификатора клиента (например, имя). Так что что-то вроде
faceContent.messages("creditCardNo")
Решением, которое я имею в настоящее время, является создание настраиваемого распознавателя, но было интересно, есть ли лучшее решение.
Ответы
Ответ 1
Ошибка должна быть подсвечена, показывая сообщение об ошибке в сообщении об ошибке...
Просто используйте <h:message>
со стилем, в котором вы определяете желаемый стиль.
<h:inputText id="foo" />
<h:message for="foo" styleClass="error" />
с
.error {
border: 1px solid red;
background: pink;
}
... и текст ввода.
Просто проверьте, если UIInput#isValid()
true
. Поскольку JSF 2.0, текущий компонент доступен неявной переменной EL #{component}
.
<h:inputText styleClass="#{!component.valid ? 'error' : 'none'}" />
Что касается фактического вопроса о проверке наличия сообщения для определенного идентификатора клиента, то вы можете найти этот ответ интересным. Но я не думаю, что это применимо в вашем конкретном случае.
Обновить: в соответствии с комментариями вы, похоже, хотите стилить содержащий компонент, а не invididual компоненты. В этом случае сделайте следующее:
<h:panelGroup styleClass="#{!foo.valid ? 'error' : 'none'}">
<h:inputText id="foo" binding="#{foo}" />
<h:message for="foo" />
</h:panelGroup>
Ответ 2
Я использую bootstrap и также нуждаюсь в этом... решил его, создав специальную оболочку компонента.
<composite:interface>
<composite:attribute name="casoCustomFieldValue" required="true" />
<composite:attribute name="casoOpen" default="true" />
</composite:interface>
<composite:implementation>
<h:panelGroup styleClass="#{not empty facesContext.getMessageList(''.concat(cc.clientId).concat(':valortext')) ? 'form-group has-error' : 'form-group'}"
rendered="#{cc.attrs.casoCustomFieldValue.customField.fieldTypeId.fieldTypeId eq 'TEXT'}" >
<p:inputText id="valortext" value="#{cc.attrs.casoCustomFieldValue.valor}" styleClass="form-control input-sm"
required="#{cc.attrs.casoCustomFieldValue.customField.required}" requiredMessage="Se necesita un valor." disabled="#{not cc.attrs.casoOpen}"/>
<h:panelGroup rendered="#{not empty facesContext.getMessageList(''.concat(cc.clientId).concat(':valortext'))}" styleClass="help-block">
<h:message for="valortext" />
</h:panelGroup>
</h:panelGroup>
</composite:implementation>
Ответ 3
Iterator<FacesMessage> pkit = fctxt.getMessages(); // check all existing messages from the FacesContext
while(pkit.hasNext()){
System.out.println(pkit.next().getDetail()); // get message text
System.out.println(pkit.next().getSummary());
}
Если искомое сообщение найдено в цикле while, вы можете предпринять соответствующие действия