2012-06-14 22 views
5

Estoy creando un ejemplo simple en JSF. Es una aplicación de inicio de sesión pequeña. Mi problema es mensajes de error duplicados en mi página:Mensajes de error en la página con <h:messages> en JSF

my screen

Tengo dos h:message (de nombre de usuario y contraseña) etiquetas y uno h:messages (mensajes globales) en mi página: Método

<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> 

Acción login() en mi respaldo frijol:

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; 
    } 
} 

quiero mostrar mensaje sobre nombre de usuario o contraseña vacíos solo al lado de estos campos, no debajo de mi botón en mensajes globales. Y quiero imprimir mi mensaje de error desde mi método de acción en los mensajes globales si la contraseña o el nombre de usuario son incorrectos. ¿Cómo puedo resolver esto?

He intentado utilizar el atributo globalOnly:

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

pero no se resuelve por completo mi problema, ya que los mensajes globales no se muestran en absoluto en este caso.

¡Gracias de antemano!

+0

Gracias tanto !! ¡Funciona! – Michael

Respuesta

17

El interruptor globalOnly debería funcionar si agrega sus mensajes correctamente en su bean de respaldo. El ID de cliente debe ser null en FacesContext.addMessage(...):

FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message)); 
Cuestiones relacionadas