Struts2 模型驱动和准备的顺序?

Struts2 模型驱动和准备的顺序?,struts2,model-driven,Struts2,Model Driven,我将println()放在每个动作类的方法中 public String execute() throws Exception { System.out.println("execute"); //... } public void prepare() throws Exception { System.out.println("prepare"); //... } public Object getModel() { System.out.print("getMod

我将
println()
放在每个动作类的方法中

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()
中构造beans类并执行一些逻辑,然后在
execute()
中返回SUCCESS。 我认为getModel是用来将bean推到valueStack的,对吗

…不管怎样,控制台给我看了这个。这很奇怪; 准备→ getModel→ 执行

这对我来说是个大问题。很难用英语解释原因。。。但我会努力的

我曾经创建过处理相同bean的每个action类,当然每个action类中都有相同的代码(变量及其getter和setter)

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");
  //...
 }
现在我尝试创建一个操作来避免重复。这个action类有几个方法(在struts.xml中映射如下;

正如我们在控制台中看到的,这个
view()
在action类的最后一个部分被调用,比如
execute()
prepare()。但是在调用
view()
之前调用了
getModel()
,因此没有机会将bean放入ValueStack

我希望你们能理解我想解释的

总而言之,每个动作类都有BoardView、BoardDelete、BoardWrite。。。他们工作得很好!但我讨厌复制东西,所以我创建了BoardManager类。该类具有由类(如BoardView)处理的每个方法(如
view()
)。但是这个视图()是在调用
getModel()
之后调用的,因此bean(返回
getModel()
)没有机会被推送到ValueStack

请帮帮我。教我你在这方面的技术。我正在自己开发这一切,这让我感觉很难


谢谢

我找到了自己的解决办法。。但这不是一个好主意

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

它工作得很好,只在我的课堂上增加了2行


但是我感觉不太好。

我找到了自己的解决办法。。但这不是一个好主意

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

它工作得很好,只在我的课堂上增加了2行


但是我感觉不太好。

您必须自己设置模型对象,因为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)。希望这能有所帮助。

您必须自己设置模型对象,因为模型驱动拦截器只能在其不为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)。希望这能有所帮助。

还有一件奇怪的事。控制台中有3个getModel。。这意味着框架尝试获取模型3次,但没有得到。我猜这是另一件奇怪的事情。控制台中有3个getModel。。这意味着框架尝试获取模型3次,这是缺失的..我猜