Сообщения об ошибках на странице с ‹h:messages› в JSF

Я создаю простой пример на JSF. Это небольшое приложение для входа. Моя проблема заключается в дублировании сообщений об ошибках на моей странице:

мой экран

У меня есть два тега h:message (для имени пользователя и пароля) и один тег h:messages (глобальные сообщения) на моей странице:

<h:form id="loginForm">

   <h:panelGrid columns="3">

       <h:outputText value="Username" />
       <h:inputText id="username" value="#{loginBean.username}" 
                  required="true" requiredMessage="Please enter your username" />
       <h:message for="username" errorClass="errorMessage" /> <!-- Message for username -->

       <h:outputText value="Password" />
       <h:inputSecret id="password" value="#{loginBean.password}" 
                  required="true" requiredMessage="Please enter your password" />
       <h:message for="password" errorClass="errorMessage" /> <!-- Message for password -->


       <h:commandButton value="Login" action="#{loginBean.login}" />

   </h:panelGrid>

   <h:messages styleClass="errorMessage" /> <!-- Global messages -->


</h:form>

Метод действия login() в моем вспомогательном компоненте:

public String login() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    if ("admin".equals(username) && "pass".equals(password)) {
        return "success";
    } else {
        facesContext.addMessage("loginForm", new FacesMessage("Username or password is incorrect"));
        return null;
    }
}

Я хочу отображать сообщение о пустом имени пользователя или пароле только рядом с этими полями, а не под моей кнопкой в ​​глобальных сообщениях. И я хочу напечатать свое сообщение об ошибке из моего метода действия в глобальных сообщениях, если пароль или имя пользователя неверны. Как я могу решить эту проблему?

Я попытался использовать атрибут globalOnly:

<h:messages styleClass="errorMessage" globalOnly="true" /> <!-- Global messages -->

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

Заранее спасибо!


person Michael    schedule 14.06.2012    source источник


Ответы (1)


Переключатель globalOnly должен работать, если вы правильно добавляете свои сообщения в свой компонент поддержки. Идентификатор клиента должен быть null в FacesContext.addMessage(...):

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message));
person Matt Handy    schedule 14.06.2012