JSF2: usar action e actionListener ao mesmo tempo no h:commandButton?

3 respostas
Roger75

Tentei usar os atributos “action” e “actionListener” ao mesmo tempo num h:commandButton, mas deu erro. O action eu tenho que usar para navegação à próxima página, e o actionListener eu uso para mostrar a mensagem de erro caso não satisfaça uma condição. Tentei colocar a mensagem do faces no método do managedbean que é chamado pela action, mas não mostra a mensagem de aviso na página… Há algum outro modo de se fazer isso?

3 Respostas

Quindin

Olá, você pode declarar la em cima da sua pagina depois da ou onde vc quiser que ela apreça ^^

<h:messages/>

e na sua bean, você retorna uma faces messages e ela vai aparecer na pagina.

gilvan.sfilho
pagina.xhtml
<h:form>
    <h:messages globalOnly="true" showDetail="true"/>

    Nome: <h:inputText value="#{MBean.nome}"/>
    <h:commandButton value="Enviar" action="#{MBean.salvar}/>
</h:form>
MBean.java
...
private String nome;

//gets e sets

public String salvar() {
    if( !(nome.equals("")) ) { //Se o nome for diferente de ""
         //continua com cadastro.
        //return "listagem";
    }

    FacesContext ctx = FacesContext.getCurrentInstance();
    ctx.addMessage(null, new FacesMessage("Mensagem a ser exibida"); //não lembro bem os construturos do FacesMessage, tem que conferir.

    return "pagina";
}

Cara, acho que ta certinho, fiz tudo aqui direto no editor do forum mesmo, mas desse jeito quando o usuário clicar em salvar
o bean vai verificar se existe algo digitado em "nome", se não estiver ele adiciona uma mensagem ao contexto e reexibe o formulário com a mensagem.

Da pra fazer com ajax também, ai sim seria necessário utilizar o actionListener.

Abraços...

Roger75
Tive que fazer uma certa gambiarra: usei actionListener no commandButton, só que o método no managed bean ficou algo assim:
public void acao(ActionEvent event) {
  FacesContext context = FacesContext.getCurrentInstance();

  ...
  //redireciona navegação
  NavigationHandler handler =context.getApplication()
						.getNavigationHandler();
  handler.handleNavigation(context, null, "proximaPagina");
  context.renderResponse();

  ...
  //mandando mensagem de erro na tela
  context.addMessage(null,new FacesMessage("Ocorreu um erro!!!"));
}
Criado 9 de fevereiro de 2011
Ultima resposta 10 de fev. de 2011
Respostas 3
Participantes 3