我发现Struts2的ModelDriven存在问题

时间:2010-08-17 18:43:30

标签: struts2 model-driven

请下载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将会工作。

我想知道为什么对此毫无疑问。我认为这是一个严重的问题。

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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