ModelDriven和Prepare的顺序?

时间:2010-08-09 08:39:05

标签: struts2 model-driven

我将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");
  //...
 }
我认为订单会是; 准备→执行→getModel。

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

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

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

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

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

正如我们在控制台中看到的那样,view()在动作类的最后一个被调用,如execute()prepare()只构造bean,view()执行真正的工作。但是在调用getModel()之前调用view(),因此没有机会将bean放到ValueStack。

我希望你们明白我要解释的内容。

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

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

谢谢!

2 个答案:

答案 0 :(得分:5)

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

SomeModelClass myModelObject = null;

public Object getModel()
{
   return myModelObject;
}

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

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

...或者只是在字段中初始化它:

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

不要忘记实现适当的接口(ModelDriven和Preparable)。希望这有点帮助。

答案 1 :(得分:0)

我找到了自己的解决方案..但不是一个好的..

当通过setter设置域对象时,我手动将其推送到valuestack ..

效果很好,我班上只添加了2行。

但我感觉不太好。