Chamar link e executar metodo ao mesmo tempo - jsf[Resolvido]

16 respostas
F

Pessoal, tenho o seguinte trecho do codigo, o qual chama uma outra pagina quando clico na imagem(logotipo)

problema que ao clicar na imagem queria que o commandLink executasse o metodo citadob[/b]

Mas ele nao esta fazendo isso, apenas chama o link em questao;

Voces tem ideia de como executand o metodo e ja chamar a outra o link?

<h:commandLink id="teste"  action="teste.jsf" actionListener="#{opBean.calculaTaxa}" >
       <h:graphicImage id="finalizaRetorna" url="/logotipo.jpg"/>
   </h:commandLink>

16 Respostas

A

vc pode fazer de duas maneiras,
colocar immediate = true ou vc fazer um metodo no ManagedBean e o retorno ser a pagina que vc quer.

t+

A

Você pode até deixar melhor ainda, ao invés de colocar um action, coloca o retorno como o alissonvla falou, mas não coloque uma ação, assim ao clicar você não vai ser direcionado para a action que você quer, no entanto, deixe o listener como está e no método a ser executado, ao finalizar, adicione esse trecho de código:

FacesContext.getCurrentInstance().getExternalContext().redirect("teste.jsf");

assim o proprio método te joga para aonde tu quiseres

F

voce diz colocar a linha do faces dentro do meu metodo??


alissonvla

essa questao do immediate seria no codigo do jsf?

A

Fabio, exemplo da utilização no teu método no backbean

public void realizarMinhaAcao(){
if (1 == 1) {
FacesContext.getCurrentInstance().getExternalContext().redirect("sim.jsf");  
} else {
FacesContext.getCurrentInstance().getExternalContext().redirect("nao.jsf");  
}
}

você simplesmente vai lançar o usuário para a página pelo método

A

segue,

<h:commandLink id="teste"  action="teste.jsf" actionListener="#{opBean.calculaTaxa}" immediate="true">
       <h:graphicImage id="finalizaRetorna" url="/logotipo.jpg"/>
   </h:commandLink>
F

Valeu andre.froes e alissonvla,

vou fazer os testes e dou um retorno …

abraço

F

Entao,

tentei das duas formas,

na aplicacao do metodo, ele zera a sessao, mas nao chama o arquivo .jsf, pois diz que a sessao expirou(o bean que chamo faz isso)

no outro jeito, aplicando o immediate ele tambem chama o bean e zera a sessao, mas nao faz mais nada apos(nao chama o meu outro jsf)…

voces tem outra ideia?

marcuscarvalho1

Nesse caso eu costumo usar regra de navegação.

<h:commandLink id="teste"  action="meuBean.faz" actionListener="#{opBean.calculaTaxa}" >  
     <h:graphicImage id="finalizaRetorna" url="/logotipo.jpg"/>  
 </h:commandLink>

E no menaged bean:

public String faz(){

//aqui o seu método opBean

return "redireciona";
}

E no faces-config:

<navigation-rule>
      <from-view-id>/esta página que você está.xhtml</from-view-id>
      <navigation-case>
       <from-outcome>redireciona</from-outcome>
       <to-view-id>/a página para onde você vai.xhtml</to-view-id>
      </navigation-case>
    </navigation-rule>
marcuscarvalho1

Ah, mais um detalhe:
na tentativa anterior, em que você usou o immediate=“true”, você precisa usar o ajax=“false”, senão o botão não faz nada mesmo.

F

Pessoal, resolvi !

marcuscarvalho1 valeu cara, sua dica funcionou, so modifiquei algumas coisas no meu metodo. valeuu

abraços

A

Galera,

Estava acompanhando este exemplo, e tentei utilizar o esquema do ajax=false, mas quando uso a na linha do commandlink ele da o seguinte erro:

atributo ajax é invalido para a tag commandlink

Esqueci de algo?

marcuscarvalho1

Desculpe Adamastor, a tag h:commandLink não possui mesmo o atributo ajax, somente a tag p:commandLink do primefaces. Esta sim, só funcionará com o ajax=false. Foi viagem minha! Mas acho que o exemplo que funfou para o Fabio Silveira foi o da regra de navegação. Esse aí sim está redondinho.

A

Entao, marcuscarvalho1

eu entendi a parte do codigo jsf, mas a parte do maneged-bean(regra de navegacao) nao entendi(sou meio iniciante nisto). estava vendo umas apostila de como implementar, mas nao deu certo

marcuscarvalho1

Adamastor, vamos lá.
Primeiro de tudo, esqueça tudo o que aprendeu sobre request, response, action do formulário, e submit que você aprendeu lá no PHP, asp, jsp e afins. Em jsf, o esquema de submissão de formulário é bem diferente de tudo que você já viu.
Basicamente, o menaged bean (mb) é o cara que resolve tudo. Ele representa o seu formulário, e tem dentro dele o bean da sua camada de persistência. Na tag de submit do formulário, você precisa acionar um método do mb onde está a ação a ser realizada e mais a regra de navegação que define para que página o sistema deverá ser encaminhado, como neste exemplo abaixo. Repare que, na chamada do mb, o método não tem os parênteses - "meuMB.faz" e não "meuMB.faz()", o que significa que os métodos do mb NÃO ACEITAM PARÂMETROS:

código de "paginaAtual.xhtml"
<h:commandLink id="teste"  action="meuMB.faz" >    
     <h:graphicImage id="finalizaRetorna" url="/logotipo.jpg"/>    
</h:commandLink>

Já no código do menaged bean, o método de submissão de formulário - faz() - precisa necessariamente retornar uma String, que é uma saída para a regra de navegação defenida em faces-config.xml. Esta saída é conhecida como "outcome", e nós a entenderemos a seguir. Segue o código de MeuMB.java:

public String faz(){  
      
    //aqui você define o que tem que ser feito, exemplo: aciona os daos que passarão os dados do formulário para o banco  
      
    return "redireciona"; //"redireciona" é a saída (ou outcome) do seu método de submissão deste formulário 
    }

pronto, agora só falta colocar a regra de navegação no faces-config.xml. Lá você definirá uma página para o sistema redirecionar, após retornar o outcome "redireciona":

<navigation-rule>  
   <from-view-id>/paginaAtual.xhtml</from-view-id>  
   <navigation-case>  
    <from-outcome>redireciona</from-outcome>  
    <to-view-id>/paginaSeguinte.xhtml</to-view-id>  
   </navigation-case>  
</navigation-rule>

Aqui você definiu que, para paginaAtual, toda vez que um método retornar o outcome "redireciona", deverá ser redirecionado para "paginaSeguinte.xhtml". Desta forma, você pode inclusive definir que a página possa ser direcionada para páginas diferentes, mediante determinadas condições. Ex: se o usuário optou pagamento por cartão, redireciona para a página de cartões; se ele optou por pagamento via boleto, abre a página de boleto.

public String faz(){  
      
    if(usuarioSelecionouCartao) 
            return "cartao";
    else if(usuarioSelecionouBoleto)
            return "boleto";
    }
e no faces-config:
<navigation-rule>  
   <from-view-id>/paginaAtual.xhtml</from-view-id>  
   <navigation-case>  
    <from-outcome>cartao</from-outcome>  
    <to-view-id>/paginaCartao.xhtml</to-view-id>  
   </navigation-case>  
   <navigation-case>  
    <from-outcome>boleto</from-outcome>  
    <to-view-id>/paginaBoleto.xhtml</to-view-id>  
   </navigation-case>  
</navigation-rule>

Espero que isso ajude você.

A

marcuscarvalho1

Muito obrigado pela explicacao, juntei com um material que eu tinha e passei a entender muita coisa

valeu mesmo

abraço

A
marcuscarvalho1:
Adamastor, vamos lá. Primeiro de tudo, esqueça tudo o que aprendeu sobre request, response, action do formulário, e submit que você aprendeu lá no PHP, asp, jsp e afins. Em jsf, o esquema de submissão de formulário é bem diferente de tudo que você já viu. Basicamente, o menaged bean (mb) é o cara que resolve tudo. Ele representa o seu formulário, e tem dentro dele o bean da sua camada de persistência. Na tag de submit do formulário, você precisa acionar um método do mb onde está a ação a ser realizada e mais a regra de navegação que define para que página o sistema deverá ser encaminhado, como neste exemplo abaixo. Repare que, na chamada do mb, o método não tem os parênteses - "meuMB.faz" e não "meuMB.faz()", o que significa que os métodos do mb NÃO ACEITAM PARÂMETROS: código de "paginaAtual.xhtml"
<h:commandLink id="teste"  action="meuMB.faz" >    
     <h:graphicImage id="finalizaRetorna" url="/logotipo.jpg"/>    
</h:commandLink>

Já no código do menaged bean, o método de submissão de formulário - faz() - precisa necessariamente retornar uma String, que é uma saída para a regra de navegação defenida em faces-config.xml. Esta saída é conhecida como "outcome", e nós a entenderemos a seguir. Segue o código de MeuMB.java:

public String faz(){  
      
    //aqui você define o que tem que ser feito, exemplo: aciona os daos que passarão os dados do formulário para o banco  
      
    return "redireciona"; //"redireciona" é a saída (ou outcome) do seu método de submissão deste formulário 
    }

pronto, agora só falta colocar a regra de navegação no faces-config.xml. Lá você definirá uma página para o sistema redirecionar, após retornar o outcome "redireciona":

<navigation-rule>  
   <from-view-id>/paginaAtual.xhtml</from-view-id>  
   <navigation-case>  
    <from-outcome>redireciona</from-outcome>  
    <to-view-id>/paginaSeguinte.xhtml</to-view-id>  
   </navigation-case>  
</navigation-rule>

Aqui você definiu que, para paginaAtual, toda vez que um método retornar o outcome "redireciona", deverá ser redirecionado para "paginaSeguinte.xhtml". Desta forma, você pode inclusive definir que a página possa ser direcionada para páginas diferentes, mediante determinadas condições. Ex: se o usuário optou pagamento por cartão, redireciona para a página de cartões; se ele optou por pagamento via boleto, abre a página de boleto.

public String faz(){  
      
    if(usuarioSelecionouCartao) 
            return "cartao";
    else if(usuarioSelecionouBoleto)
            return "boleto";
    }
e no faces-config:
<navigation-rule>  
   <from-view-id>/paginaAtual.xhtml</from-view-id>  
   <navigation-case>  
    <from-outcome>cartao</from-outcome>  
    <to-view-id>/paginaCartao.xhtml</to-view-id>  
   </navigation-case>  
   <navigation-case>  
    <from-outcome>boleto</from-outcome>  
    <to-view-id>/paginaBoleto.xhtml</to-view-id>  
   </navigation-case>  
</navigation-rule>

Espero que isso ajude você.

Cara, voce ja pensou em escrever alguma apostila ou livro sobre java ou afins? ficou muito claro sua explicacao, facil de entender o problema

Otima didatica..

falow

Criado 26 de setembro de 2011
Ultima resposta 4 de out. de 2011
Respostas 16
Participantes 6