A sequência de ModelDriven e Prepare?
-
27-09-2019 - |
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!!
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.