Подтвердить что ты не робот

JSF: лучший способ проверить наличие <h: message for = "id" /">

У меня есть форма, в которой сообщение об ошибке проверки должно отображаться под входными элементами. Ошибка должна быть подсвечена, показывая пузырек ошибки вокруг сообщения об ошибке и текста ввода.

Чтобы достичь этого, мне нужно проверить наличие h: сообщений для отдельных элементов. Я могу проверить наличие глобальных сообщений об ошибках следующим образом

<h:panelGroup rendered="#{not empty facesContext.messages}"> 
</h:panelGroup>

Как я могу проверить то же самое для конкретного идентификатора клиента (например, имя). Так что что-то вроде

faceContent.messages("creditCardNo")

Решением, которое я имею в настоящее время, является создание настраиваемого распознавателя, но было интересно, есть ли лучшее решение.

4b9b3361

Ответ 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, вы можете предпринять соответствующие действия