请下载this并运行它。 我认为这值得尝试虽然它会有点烦人。
在execute方法的动作类中,如果通过返回bean的方法设置bean,则Modeldriven将无法在JSP中工作(<s:property "someField" />
将无法工作,因此你必须像这样输入bean实例名称; <s:property "myBean.someField" />
)。
但是如果设置bean的字段值,Modeldriven就可以工作。
我知道你可能不相信我,并认为我做错了其他事情。 但事实并非如此!试试吧..
public class DefaultClass extends ActionSupport implements ModelDriven<TestBean> {
TestBean test = new TestBean();
DAO db = DAO.getInstance();
public String access() throws Exception {
//Beans setter doesn't work!
setTest( db.getTest() );
return SUCCESS;
}
public String access2() throws Exception {
//Field setter works!
test.setA(db.getA());
test.setB(db.getB());
return SUCCESS;
}
我不知道我刚发现了什么。所以我问this question。而作为我自己的答案,如果我将bean推送到valuestack,Modeldriven将会工作。
我想知道为什么对此毫无疑问。我认为这是一个严重的问题。
答案 0 :(得分:1)
我不知道我刚发现了什么。所以我问这个问题。
你问了这个问题,却忽略了给你的答案......模型驱动的拦截器位于准备拦截器之后,但是在实际执行动作之前很久。这意味着,如果要检索模型类的实例,则必须使用“prepare”方法进行工作。当对您的操作调用getModel()时,它将在您的任一操作方法中的任何逻辑之前引用TestBean。在您链接的另一个问题中,您提到您希望订单有所不同,因为您在一本书中读到了它,这本书是哪本书? Manning不是Struts 2 In Action,因为在那一个中,他们明确表示(我认为这是第65页) -
我们应该注意避免一个陷阱。 到execute()方法的时候 您的ModelDriven操作已经完成 调用后,框架已经获得了 引用你的模型对象,哪个 它将在整个请求中使用。