【问题标题】:I found a problem with ModelDriven of Struts2我发现 Struts2 的 ModelDriven 有问题
【发布时间】:2010-08-17 18:43:29
【问题描述】:

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

在action类的execute方法中,如果你通过返回bean的方法来设置bean,Modeldriven在JSP中不起作用(<s:property "someField" />不会起作用,所以你必须像这样键入bean实例名称;@987654324 @)。

但是如果你设置了 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 将起作用。

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

【问题讨论】:

  • 我不确定我是否明白你在问什么。您提供的名称似乎与您提供的代码不匹配。你是说不能访问&lt;s:property value="a"/&gt;,比如你要写&lt;s:property value="test.a/&gt;
  • 没错。请下载我的 WAR 文件并运行它。你会明白我的意思

标签: struts2 model-driven


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    相关资源
    最近更新 更多