-1

请下载运行它。我认为值得一试,虽然它会有点烦人。

在action类的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;
        }

我不知道我刚刚发现了什么。所以我问这个问题。作为我自己的答案,如果我将 bean 推送到 valuestack Modeldriven 将起作用。

我想知道为什么没有关于这个的问题。我认为这是一个严重的问题。

4

1 回答 1

1

我不知道我刚刚发现了什么。所以我问这个问题。

你问了这个问题,但忽略了给你的答案......模型驱动的拦截器位于准备拦截器之后,但在实际执行操作之前很久。这意味着,如果您想检索模型类的实例,您必须在“准备”方法中完成工作。当对您的操作调用 getModel() 时,它将在您的任一操作方法中的任何逻辑之前成为对 TestBean 的引用。在您链接的另一个问题中,您提到您希望顺序不同,因为您在一本书中读到它,那是哪本书?这不是 Manning 的 Struts 2 In Action,因为在那一个中​​,他们明确指出(我认为是第 65 页)-

我们应该注意一个需要避免的陷阱。在调用 ModelDriven 操作的 execute() 方法时,框架已经获得了对模型对象的引用,它将在整个请求中使用。

于 2010-09-03T16:05:37.257 回答