ModelDriven和Prepare的顺序?

Dec*_*ard 1 model-driven struts2

我把println()每个方法都放在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");
  //...
 }
Run Code Online (Sandbox Code Playgroud)

我以为订单会是; 准备→执行→getModel.

因为我记得我在书中读过它,所以我习惯构造bean类并做一些逻辑prepare(),然后返回SUCCESS execute().我认为getModel用于将bean推送到valueStack,对吧?

......无论如何,控制台告诉我这个.这很奇怪; 准备→getModel→执行.

这对我来说是一个巨大的问题.用英语解释原因很难......但我会试试!

我曾经创建过处理相同bean的每个动作类,当然每个动作类中都有相同的代码(变量,它们的getter和setter).

现在我正在尝试创建一个操作来避免重复.这个动作类有几个方法(像这样在struts.xml中映射; <action name="View_board" method="view">).

正如我们在控制台中看到的那样,view()在动作类的最后一个调用它execute().该prepare()不会只是构建豆和view()做真正的就业机会.但是getModel()在调用之前调用view(),所以没有机会将bean放到ValueStack.

我希望你们明白我要解释的是什么.

总结一下,每个动作类都像BoardView,BoardDelete,BoardWrite ......它们运作良好!但我讨厌那些重复的东西,所以我创建了BoardManager类.这个类有每个方法(比如view())由类处理(比如BoardView).但是这个view()是在调用之后调用的getModel(),所以bean(return of getModel())没有机会被推送到ValueStack.

请帮帮我.教我你在这个领域的专业知识.我正在自己开发这一切,这让我感觉很难受.

谢谢!!

Akk*_*kku 5

您必须自己设置Model对象,因为modeldriven拦截器只能将其推送到堆栈(如果它不为null).如果你的getModel()看起来像这样:

SomeModelClass myModelObject = null;

public Object getModel()
{
   return myModelObject;
}
Run Code Online (Sandbox Code Playgroud)

...你必须设置modelObject,以便它可以被推送到valueStack.你可以这样做我猜:

public void prepare(){
   myModelObject = new myModelObject("I'm so new");
}
Run Code Online (Sandbox Code Playgroud)

...或者只是在现场初始化它:

SomeModelClass myModelObject = new myModelObject("I'm so new");
Run Code Online (Sandbox Code Playgroud)

不要忘记实现适当的接口(ModelDriven和Preparable).希望这个对你有帮助.