<p:message > + <p:messages >

Bom dia…

Quero usar o <p:messages> e o <p:message> em meu form, um será para mensagens “globais” e outro para mensagens locais, Por exemplo: O <p:message> apresenta mensagem de campo não preenchido e o <p:messages> apresenta mensagem de login inválido. Ficou claro?

Minha dúvida é como direcionar a mensagem para um ou para outro, peguei um exemplo de internet e não consegui fazer funcionar. Alguém aí pode me ajudar?

LoginBean

   public String loginAction()
    {
        //Valida preenchimento dos campos de email e senha
        boolean campoBranco = false;
        if((email == null) || (email.trim().length() == 0))
        {
            campoBranco = true;
            /*
            FacesMessage facesMessage = new FacesMessage("Preencha o email e tente novamente!");
            facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null,facesMessage);
            return null;
            * 
            */
            FacesContext.getCurrentInstance().addMessage("loginForm:email",new FacesMessage(FacesMessage.SEVERITY_ERROR, "Email não informado!","Preencha o email e tente novamente!"));
        }
        
        if((senha == null) || (senha.trim().length() == 0))
        {
            campoBranco = true;
            /*
            FacesMessage facesMessage = new FacesMessage("Preencha a senha e tente novamente!");
            facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
            FacesContext.getCurrentInstance().addMessage(null,facesMessage);
            * 
            */
            FacesContext.getCurrentInstance().addMessage("loginForm:senha",new FacesMessage(FacesMessage.SEVERITY_ERROR, "Senha não informada!","Preencha a senha e tente novamente!"));
        }
        
        if(campoBranco)
            return null;
        
        
        //Verifica se há informações de usuário na sessão. Caso já exista tenta validar para não ir sempre ao banco de dados
        if(usuarioSessao != null)
        {
            Cliente c = usuarioSessao.getCliente();
            if(c != null)
            {
                if((c.getEmail().trim().equals(email.trim())) &&
                        (c.getSenha().equals(senha)))
                    return "auth/bemvindo";
            }
        }
        else
            usuarioSessao = new UsuarioSessionBean();
        
        //Consulta informações do usuário no banco e verifica o login
        ClienteDaoFactory cFactory = new ClienteDaoFactory();
        IClienteDao clienteDao = cFactory.getClienteDao();
        Cliente cliente = new Cliente();
        cliente.setEmail(email);
        List&lt;Cliente&gt; listaCliente = clienteDao.findBy(cliente);
        
        FacesMessage fMsg =  new FacesMessage(FacesMessage.SEVERITY_WARN, &quot;Login inválido!&quot;,&quot;Email ou senha invalidos, tente novamente por favor&quot;);
        if(listaCliente.isEmpty())
        {
            FacesContext.getCurrentInstance().addMessage(null,fMsg);
            return null;
        }
        
        cliente = listaCliente.get(0);
        if((!cliente.getEmail().equals(email)) || (!cliente.getSenha().equals(senha))) 
        {
            FacesContext.getCurrentInstance().addMessage(null,fMsg);
            return null;
        }
        usuarioSessao.setCliente(cliente);
        return &quot;auth/bemvindo&quot;;
    }

login.xhtml

&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
&lt;html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.prime.com.tr/ui"&gt;
    &lt;h:head&gt;
        &lt;title&gt;TESTE&lt;/title&gt;
    &lt;/h:head&gt;
    &lt;h:body&gt;
          Bem vindo ao TESTE<br/>
        &lt;h:form id="loginForm"&gt;
            &lt;p:messages id="messages" /&gt;
            &lt;!--&lt;p:growl id="msg" showDetail="true" life="3000" /&gt;--&gt;
            &lt;!--&lt;p:growl id="growlLoginValidationStatus" showDetail="true" sticky="false" autoUpdate="true" life="4000" redisplay="false" showSummary="true" globalOnly="false" /&gt;--&gt;
            &lt;p:panel header="Login" style="width: 360px;"&gt;
                &lt;h:panelGrid id="loginPanel" columns="2"&gt;
                    &lt;h:outputText value="Email:" for="email" /&gt;
                    &lt;p:inputText id="email" value="#{loginBean.email}" &gt;&lt;/p:inputText&gt;
                     &lt;p:spacer&gt;&lt;/p:spacer&gt;
                    &lt;p:message for="email" /&gt;
 
                    &lt;h:outputText value="Senha" for="senha" /&gt;
                    &lt;p:password id="senha" value="#{loginBean.senha}"  feedback="false" minLength="1"&gt;&lt;/p:password&gt;
                    &lt;p:spacer&gt;&lt;/p:spacer&gt;
                    &lt;p:message for="senha" /&gt;
                    &lt;p:spacer&gt;&lt;/p:spacer&gt;
                    &lt;p:commandButton action="#{loginBean.loginAction}" value="Login" update="loginForm" ajax="true"/&gt;
                &lt;/h:panelGrid&gt;
            &lt;/p:panel&gt;
        &lt;/h:form&gt;
    &lt;/h:body&gt;
&lt;/html&gt;

o <p:message> vc usa o atributo “for” para direcionar para um componente
o <p:messages> vc usa o atributo globalOnly=true para que não exiba mensagens direcionadas a componentes.
no messages tem o atributo autoUpdate, coloque como true para atualizar automático se quiseres.
ok?