Как проверить, было ли установлено <s: message /> в JSF? - PullRequest
1 голос
/ 14 декабря 2010

У меня есть два следующих файла (JSF 1.2) для создания формы:

<!-- segment of form.xhtml -->
<s:decorate template="edit.xhtml">
    <h:inputText label="First Name" id="firstName" required="true" value="#{contactBean.firstName}">
        <f:validateLength minimum="1" maximum="25"/>
    </h:inputText>
</s:decorate>

<!-- segment of edit.xhtml -->
<s:validateAll>
    <ui:insert />
</s:validateAll>

<h:graphicImage value="/images/errorIcon.png" rendered="#{when we have a message for this input}" />
<s:message />

В edit.xhtml, есть ли выражение, которое я использую в атрибуте <h:graphicImage> rendered?

Я пытался rendered="#{invalid}", но invalid остается верным даже после очистки <s:messages />. В результате errorIcon.png отображается без ассоциированного <s:message />.

Дайте мне знать, если я использую совершенно неправильный подход.

1 Ответ

4 голосов
/ 14 декабря 2010

Я не уверен насчет части Seam, я предложу только общий подход JSF. Я вижу в основном два способа достижения этого требования:

  1. Обертка FacesContext#getMessages(String clientId) в свойстве бобов.

    public boolean hasMessages(String clientId) {
        return FacesContext.getCurrentInstance().getMessages(clientId).hasNext();
    }
    

    Используйте его следующим образом:

    <h:graphicImage rendered="#{bean.hasMessages('form:firstName')}" />
    

    (я предполагаю, что вы уже используете JBoss EL)

  2. Вместо этого установите изображение как фоновое изображение CSS (мой предпочтительный подход):

    <s:message errorClass="message error" />
    

    с

    .message.error {
        background: url('error.png') no-repeat left center;
        padding-left: 15px;
    }
    
...