Chamar duas Action

6 respostas
C

Olá pessoal, estou com um problema

Preciso chamar duas action. Estou fazendo assim mais eu acho que nao é a melhor forma

<h:outputText value="LINK">
        <a4j:support action="#{tecnicaMB.setOpcao}" event="onclick">
              <a4j:support action="#{osMB.carregarCampos}" event="onclick" >
                    <f:setPropertyActionListener value="opOSLanca" target="#{tecnicaMB.opcao}"/>
                    <f:setPropertyActionListener value="#{resultado}" target="#{osMB.os}"/>
               </a4j:support>
        </a4j:support>
 </h:outputText>

Porque eu faço isso, preciso chamar um metodo em um MB e outro metodo em outra MB.

Funciona no tomcat, já no Glassfish não funciona. Eu acho que essa não é a melhor forma.

Tentei outras formas mas a que funcionou foi essa.

Existe outra maneira?

Obrigado

6 Respostas

A

Amigo essa definitivamente não é a melhor forma de fazer isso. Arrisco dizer que o buraco está mais embaixo. Sua arquitetura talvez não esteja executando uma separação de camadas de maneira satisfatória. Vale a pena rever a arquitetura da sua aplicação.
Tente resolver seu problema nas classes java, não na JSP. Talvez se você fizer um unico método que recebe o evento e chama 2 trechos de negocio diferentes. Isso é mais elegante.
Tudo que eu disse antes é o jeito mais correto, se você não quer seguir e prefere resolver na JSP mesmo tente não encadear os supports. Deixe algo assim:

<h:outputText value="LINK">  
    <a4j:support action="#{tecnicaMB.setOpcao}" event="onclick">  
    </a4j:support>  

    <a4j:support action="#{osMB.carregarCampos}" event="onclick" >  
        <f:setPropertyActionListener value="opOSLanca" target="#{tecnicaMB.opcao}"/>  
        <f:setPropertyActionListener value="#{resultado}" target="#{osMB.os}"/>  
    </a4j:support>  
</h:outputText>

:smiley:

C

andre2k2, agradeço pela sua resposta.

Quando voce diz para resolver pela classes java, o que voce esta querendo dizer.

Seria usar os nos tags do jsp o binding e trabalhar dentro do MB, seria isso?

Obrigado

A

Mais ou menos. Você cria dentro da tag outputText apenas uma chamada a um evento na sua MB. Ou seja apenas um support. Dentro do método que trata o evento você chama seus dois trechos de código que vc precisa: setOpcao e o carregarCampos.

C

Então andre2k2, entendi o que voce disse, o problema que eu tenho é que os metodos estao em duas MB separadas.

Como poderia chamar um metodo em um MB que esta em outra MB

Sei lá por exemplo, tipo o meu caso eu faria assim

<h:outputText value="LINK">     
    <a4j:support action="#{tecnicaMB.setOpcao}" event="onclick">     
        <f:setPropertyActionListener value="opOSLanca" target="#{tecnicaMB.opcao}"/>     
        <f:setPropertyActionListener value="#{resultado}" target="#{osMB.os}"/>
    </a4j:support>     
  
   </h:outputText>

so que ainda preciso chamar um outro metodo que nao esta na tecnicaMB e sim em minha osMB como osMB.carregarCampos

minha MB - TecnicaMB

public void setOpcao () {

      // -- Como chamar o metodo que esta na minha bean osMB

  }

Essa é minha difuculdade.

Se voce da puder da uma dica, agradeço.

Valeu

A

Chronos:
Então andre2k2, entendi o que voce disse, o problema que eu tenho é que os metodos estao em duas MB separadas.

Como poderia chamar um metodo em um MB que esta em outra MB

Sei lá por exemplo, tipo o meu caso eu faria assim

<h:outputText value="LINK">     
    <a4j:support action="#{tecnicaMB.setOpcao}" event="onclick">     
        <f:setPropertyActionListener value="opOSLanca" target="#{tecnicaMB.opcao}"/>     
        <f:setPropertyActionListener value="#{resultado}" target="#{osMB.os}"/>
    </a4j:support>     
  
   </h:outputText>

so que ainda preciso chamar um outro metodo que nao esta na tecnicaMB e sim em minha osMB como osMB.carregarCampos

minha MB - TecnicaMB

public void setOpcao () {

      // -- Como chamar o metodo que esta na minha bean osMB

  }

Essa é minha difuculdade.

Se voce da puder da uma dica, agradeço.

Valeu

Ai que entra a arquitetura… seus métodos de NEGÓCIO não deveriam estar nas MBs. Uma MB deveria ser apenas uma ponte entre sua tela e sua aplicação. É uma das ideias do padrão MVC, não vou entrar no mérito do MVC aqui. Só o que to querendo dizer que sua MB deveria conter um método que recebe a chamada da tela e invoca um ou alguns métodos na sua camada de negocio. Algo como:

public void metodoNaMB() {   
   objetoDeNegocio1.setOpcao();
   objetoDeNegocio2.carregarCampos();
}  

<h:outputText value="LINK">       
    <a4j:support action="#{tecnicaMB.metodoNaMB}" event="onclick">       
        <f:setPropertyActionListener value="opOSLanca" target="#{tecnicaMB.opcao}"/>       
        <f:setPropertyActionListener value="#{resultado}" target="#{osMB.os}"/>   
    </a4j:support>       
     
</h:outputText>

Da uma pesquisadinha sobre MVC. Não te aconselho a usar esse padrão de projeto a risca mas ele tem algumas idéias legais! Acho que você entenderá o que estou dizendo!

C

andre2k2, valeu pela explicação.

Eu tinha um conceito que a MB seria a minha classe tambem de negocio, parece que nao, mais tenho me preocupado em seguir o padrão MVC, acho que o erro esta sendo de conceito.

Mas vou verificar com mais detalhes.

Obrigado.

Criado 26 de novembro de 2008
Ultima resposta 27 de nov. de 2008
Respostas 6
Participantes 2