2010-08-09 47 views
1

我把println()放在Action类的每个方法中。ModelDriven和Prepare的序列?

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

因为我记得我在书中读过它,所以我曾经在prepare()中构建了豆类并做了一些逻辑,然后在​​中返回SUCCESS。 我认为getModel是将bean推送到valueStack,对吗?

......无论如何,控制台向我展示了这一点。这很奇怪, prepare→getModel→执行。

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

我用来创建每个操作类,这是处理相同的豆,当然有相同的代码(变量,和他们的getter和setter)重复在每个操作类。

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

正如我们在控制台中看到的那样,view()在动作类的最后被调用,如​​。 prepare()只建立豆类,而view()确实做了真正的工作。但在调用view()之前调用getModel(),因此没有机会将Bean放入ValueStack。

我希望你们明白我想说明什么。

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

请帮我一把。教我在实地的技术诀窍。我正在自己开发这一切,这让我感到很难受。

谢谢!

+0

从另一个奇怪的事情。在控制台中有3个getModel ..意味着该框架试图获得模型3次,这是失踪..我猜 – Deckard 2010-08-10 11:30:06

回答

5

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

SomeModelClass myModelObject = null; 

public Object getModel() 
{ 
    return myModelObject; 
} 

...你必须设置modelObject所以它可以推送到值栈。你可以做这种方式我想:

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

...或只是初始化领域:

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

不要忘记实施适当的接口(模型驱动和制备的)。希望这个对你有帮助。

0

我发现我自己的解决方案..但不是一个好..

当设置器域对象,我把它推到手动值栈..

它的工作好,只增加了2行我的班级。

但我感觉不太好。

相关问题