Struts, Actions, execute(), subclasse

4 respostas
R

Gente,

Tenho uma classe básica para uma Action (Struts 2) que é declarada assim:

public class BaseAction
         extends ActionSupport
         implements  BeanNameAware,
                     LocaleProvider,
                     ServletRequestAware,
                     ServletResponseAware { ...

Nela eu tenho implementado:

public String execute() throws Exception
      {
      setAppLocaleByCookie();
      return super.execute(  );
      }

Muito bem. Se eu derivo uma action diretamente de BaseAction:

public class DirectAction extends BaseAction { ...

o método execute() de BaseAction é executado (oopss, desculpem a redundância :slight_smile: ) sem que eu precise redefini-lo em DirectAction.

Porém, se eu derivo uma classe intermediária e dela derivo a minha action:

public class BaseModuleAction extends BaseAction { ...

public class ModuleAction extends BaseModuleAction {...

o método execute() de BaseAction não é executado, e eu não estou conseguindo entender o porquê. Já verifiquei, nem BaseModuleAction nem ModuleAction implementam um execute().

Alguma dica?

Obrigado!!!

Ricardo Almeida

4 Respostas

bbviana

estranho, isso nao faz o menor sentido.
tem certeza de que vc ta declarando tudo certo no struts.xml?

se o execute é publico, nao importa a sua hierarquia de classes.

no caso onde o execute nao eh chamado, que metodo eh executado?

R

Otima dica! Descobri que no struts.xml a action definida por ModuleAction está declarada como

<action name="*" class="ModuleAction" method="show">

com isso, ela inicia a execução diretamente pelo metodo show(), bypassando o execute().

Aí vem outra pergunta: existe alguma forma de fazer o metodo execute() sempre ser chamado pela action antes de executar o metodo declarado no struts.xml?

bbviana

nao existe.
o que vc pode usar é o metodo prepare
Basta dizer q sua action implementa Preparable

O interceptador prepareInterceptor Vai chamar o metodo prepara antes do struts chamar seu metodo.
Obviamente o prepare soh será chamado se vc estiver com o prepareInterceptor na sua stack.

R

Bom, descobri uma forma de resolver meu problema:

public void setServletRequest(HttpServletRequest request) {
   this.httpRequest = request;
   if (httpResponse != null)
      setAppLocaleByCookie();
   }

public void setServletResponse(HttpServletResponse response) {
   this.httpResponse = response;
   if (httpRequest != null)
      setAppLocaleByCookie();
   }

E retirei a chamada de setAppLocaleByCookie() da execute();

Assim, arranjei uma forma de executar a inicialização da minha action independente do entrypoint definido no struts.xml.

É feio, mas funcionou… Se alguém tiver uma solução “limpa”, agradeço, mas por enquanto vou com esta mesmo!

Criado 16 de abril de 2008
Ultima resposta 17 de abr. de 2008
Respostas 4
Participantes 2