我将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。
请帮帮我。教我你在这个领域的专业知识。我正在自己开发这一切,这让我觉得很难。
谢谢!
答案 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行。
但我感觉不太好。