Pergunta

eu ponho o println() em cada método da classe Action.

public String execute() throws Exception {
  System.out.println("execute");
  //...
 }
 public void prepare() throws Exception {
  System.out.println("prepare");
  //...
 }
 public Object getModel() {
  System.out.print("getModel");
  //...
 }

Achei que a ordem seria;preparar → executar → getModel.

Porque eu lembro que li isso no livro, então eu costumava construir a classe beans e fazer algumas lógicas prepare(), e apenas retorne SUCCESS em execute().E acho que getModel serve para enviar o bean para o valueStack, certo?

...de qualquer forma, o console me mostrou isso.É muito estranho;preparar → getModel → executar.

E isso está se tornando um grande problema para mim.É muito difícil explicar o motivo em inglês...mas eu tentarei!

Eu costumava criar cada classe de ação que lida com os mesmos beans e, claro, existem os mesmos códigos (variáveis ​​​​e seus getters e setters) duplicados em cada classe de ação.

Agora estou tentando criar uma ação para evitar essa duplicação.Esta classe de ação possui vários métodos (mapeados em struts.xml assim;<action name="View_board" method="view">).

E como vimos no console, isso view() é chamado por último na classe de ação como execute().O prepare() apenas constrói beans, e o view() faz trabalhos reais.Mas getModel() é chamado antes de chamar de view(), então não há chance de colocar os beans no ValueStack.

Espero que vocês entendam o que estou tentando explicar.

Resumindo, existem classes de ação como BoardView, BoardDelete, BoardWrite...e eles funcionaram bem!Mas eu odeio duplicar coisas, então criei a classe BoardManager.Esta classe tem cada método (como view()) que foi tratado pela classe (como BoardView).Mas esta view() foi chamada após a chamada de getModel(), então o bean (retorno de getModel()) não tem chance de ser enviado ao ValueStack.

Por favor, me ajude.Ensine-me seu conhecimento na área.Estou desenvolvendo tudo sozinho e isso está me deixando muito mal.

Obrigado!!

Foi útil?

Solução

Você mesmo deve definir o objeto Model, pois o interceptor orientado por modelo só pode empurrá-lo para a pilha se não for nulo.Se o seu getModel() estiver assim:

SomeModelClass myModelObject = null;

public Object getModel()
{
   return myModelObject;
}

...você terá que definir o modelObject para que ele possa ser enviado para o valueStack.Você poderia fazer desta maneira, eu acho:

public void prepare(){
   myModelObject = new myModelObject("I'm so new");
}

...ou apenas inicialize-o no campo:

SomeModelClass myModelObject = new myModelObject("I'm so new");

Não se esqueça de implementar as interfaces apropriadas (ModelDriven e Preparable).Espero que isso ajude um pouco.

Outras dicas

Eu encontrei minha própria solução ..mas não é bom..

Ao definir o objeto de domínio pelo setter, eu o envio manualmente para a pilha de valores.

Funciona bem e apenas 2 linhas foram adicionadas à minha classe.

Mas não me sinto tão bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top