Question

Je mis la println() dans chaque méthode de la classe d'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");
  //...
 }

Je pensais que l'ordre serait; préparer → exécuter → getModel.

Parce que je me souviens que je lis dans le livre, donc je l'habitude de construire des classes Beans et faire quelques logiques dans prepare(), et juste matcher dans execute(). Et je pense que getModel est pour pousser le haricot au ValueStack, droit?

... de toute façon la console m'a montré cela. Il est très étrange; → préparer getModel → Execute.

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

J'utilisé pour créer chaque classe d'action qui traite avec les mêmes haricots, et bien sûr il y a des mêmes codes (variables, et leurs accesseurs) dupliqués dans chaque classe d'action.

Maintenant, je suis en train de créer une action pour éviter les doubles emplois. Cette classe d'action a plusieurs méthodes (cartographiées dans struts.xml comme ça, <action name="View_board" method="view">).

Et comme nous l'avons vu dans la console, ce view() est appelé à la dernière dans la classe d'action comme execute(). Le prepare() ne construit que des haricots, et le fait view() des emplois réels. Mais getModel() est appelé avant d'appeler de view(), donc il n'y a aucune chance de mettre les haricots à ValueStack.

J'espère que vous avez compris ce que je suis en train d'expliquer.

Pour résumer, il y a chaque classe d'action comme BoardView, BoardDelete, BoardWrite ... et ils bien fonctionné! Mais je déteste que les choses dupliqués donc je classe BoardManager créées. Cette classe a chaque méthode (comme view()) qui a été traité par la classe (comme BoardView). Mais ce point de vue () a été appelée après l'appel de getModel(), de sorte que le haricot (retour de getModel()) n'a aucune chance d'être poussé à la ValueStack.

S'il vous plaît, aidez-moi. Apprenez-moi votre savoir-faire dans le domaine. Je développe tout seul et cela me fait sentir si dur.

Merci !!

Était-ce utile?

La solution

Vous devez définir l'objet modèle vous-même que l'intercepteur de modeldriven ne peut le pousser à la pile si son non nul. 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 initialiser dans le champ:

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

Ne pas oublier de mettre en œuvre les interfaces appropriées (ModelDriven et) préparable. Espérons que cela aide un peu.

Autres conseils

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é à ma classe.

Mais je ne pense pas que bon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top