2010-08-09 6 views
1

J'ai mis le println() dans chaque méthode de classe Action.La séquence de ModelDriven et Prepare?

Je pensais que la commande serait; prepare → execute → getModel. Parce que je me souviens de l'avoir lu dans le livre, je construisais des classes de haricots et faisais des logiques en prepare(), et retournais simplement SUCCESS au execute(). Et je pense que getModel est pour pousser le bean dans valueStack, non?

... de toute façon la console m'a montré ça. C'est très bizarre; prepare → getModel → execute.

Et cela devient un énorme problème pour moi. C'est très difficile d'expliquer la raison en anglais ... mais je vais essayer!

Je créais chaque classe d'action qui traitait des mêmes beans, et bien sûr il y a les mêmes codes (variables, et leurs getters et setters) dupliqués dans chaque classe d'action.

Maintenant j'essaye de créer une action pour éviter cette duplication. Cette classe d'action a plusieurs méthodes (mappées dans struts.xml comme ceci: <action name="View_board" method="view">).

Et comme nous l'avons vu dans la console, ce view() est appelé au dernier dans la classe d'action comme execute(). Le prepare() ne construit que des beans, et le view() fait de vrais travaux. Mais getModel() est appelée avant d'appeler view(), donc il n'y a aucune chance de mettre les beans à ValueStack. J'espère que vous comprenez ce que j'essaie d'expliquer. En résumé, il y a chaque classe d'action comme BoardView, BoardDelete, BoardWrite ... et ils ont bien fonctionné! Mais je déteste ces choses en double donc j'ai créé la classe BoardManager. Cette classe a chaque méthode (comme view()) qui a été traitée par classe (comme BoardView). Mais cette vue() a été appelée après l'appel de getModel(), donc le bean (retour de getModel()) n'a aucune chance d'être poussé vers le ValueStack.

S'il vous plaît aidez-moi. Apprenez-moi votre savoir-faire sur le terrain. Je développe tout cela par moi-même et cela me rend si dur.

Merci!

+0

Fount une autre chose étrange. il y a 3 getModel dans la console .. signifie que le framework essaie d'obtenir le modèle 3 fois, ce qui manque ... Je suppose – Deckard

Répondre

5

Vous devez définir l'objet Modèle vous-même car l'intercepteur modeldriven ne peut que le pousser vers la pile s'il n'est pas null. Si votre getModel() ressemble à ceci:

SomeModelClass myModelObject = null; 

public Object getModel() 
{ 
    return myModelObject; 
} 

... vous devrez régler le modelObject afin qu'il puisse se pousser à la ValueStack.Vous pouvez le faire de cette façon, je suppose:

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

... ou tout simplement l'initialiser dans le domaine:

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

Ne pas oublier de mettre en œuvre les interfaces appropriées (ModelDriven et) préparable. J'espère que ça aide un peu.

0

J'ai trouvé ma propre solution .. mais pas un bon ..

Lors de la configuration objet de domaine par setter, je pousse à la ValueStack manuellement ..

Il fonctionne bien et seulement 2 lignes ajoutées à ma classe.

Mais je ne me sens pas très bien.