【问题标题】:Understanding the concept of data binding in a Spring-MVC app了解 Spring-MVC 应用程序中数据绑定的概念
【发布时间】:2010-11-05 10:41:06
【问题描述】:

我正在尝试用 Velocity 理解 Spring-MVC 中数据绑定的概念(我正在学习这个框架并将应用程序移植到这个平台)。

我习惯于使用 request.getParameter("username") 获取表单变量,在 Spring 世界中,我似乎可以针对“form objects”执行验证等操作,例如表示表单所有字段的数据模型样式对象。

验证器的概念是有道理的,但是将查询字符串中的数据编组到这些对象对我来说仍然是模糊的。这就是“数据绑定”的概念对吗?

如果我在这一点上是正确的几个具体问题:

  • 当在表单变量(例如"username")和对象的字段(例如org.a.b.MyNewUserFormObj.username)之间进行“绑定”时,就是“绑定”了一个永久定义,这样所有后续的 http 帖子该表单导致username 表单变量被分配给org.a.b.MyNewUserFormObj.username?
  • 究竟如何完成上述绑定定义? (如果我到现在为止说的都是对的,我感觉就像《谁在第一》中的科斯特洛,我什至不知道我刚才说了什么!),我只需要一张概念图。

感谢您纠正误入歧途的大脑。

【问题讨论】:

    标签: java data-binding spring-mvc


    【解决方案1】:

    数据绑定没有魔法。

    实际上,Spring 只是简单地将@ModelAttribute 对象的属性填充为具有相应名称的请求参数的值(在最简单的情况下,请求参数与属性同名,但也支持nested properties)。

    所以,如果你有

    <input type = "text" name = "firstName" />
    

    public class Person {
        private String firstName;
        ... getters, setters ...
    }
    

    你从表单域中得到一个值。

    Spring 还提供了方便的方法来创建 HTML 表单。因此,您可以使用 JSP 编写,而不是手动创建表单字段:

    <form:form modelAttribute = "person" ...>
        <form:input path = "firstName" />
    </form:form>
    

    或在 Velocity 中(请注意,在这种情况下,&lt;form&gt; 是手动创建的,并且属性路径以模型属性名称为前缀):

    <form ...>
        #springFormInput("person.firstName" "")
    </form>
    

    以这种方式生成的表单的字段将预先填充模型属性的相应属性的值(这就是需要模型属性名称的原因)。

    【讨论】:

    • 对于谁将查询字符串/发布数据映射到 Person 对象,我仍然有点模糊。 Spring如何知道Person对象是应该从特定表单创建的对象,以及它如何将表单数据中的名称映射到Person对象的setter?
    • @David:Spring 对特定表单的映射一无所知。当请求到达控制器时,Spring 查看控制器方法的签名并将请求的参数映射到方法的参数。因此,对于@ModelAttribute 参数,它会创建一个指定类型的对象并将请求参数绑定到其属性。 static.springsource.org/spring/docs/3.0.x/…中指定的名称映射规则
    • 当你说它“将请求参数绑定到它的属性”时,指的是例如控制器的方法参数中的一个MyPerson对象,你的意思是对于每个提交的表单变量它将尝试调用 MyPerson 对象的设置器。例如,如果有一个名为“firstname”和“lastname”的表单参数,Spring 将自动创建一个新的 MyPerson(),然后调用 myPerson.setFirstname(value_from_form) 和 myPerson.setLastname(value_from_form)。这是幕后发生的事情吗?
    • 大卫帕克斯有一个很好的问题。我希望有人可以指出或引导我们查看 Spring 文档,说明 Spring 是否使用 setter 方法来设置属性,如果它不使用 setter,我们如何强制 Spring 在访问属性时使用 getter 和 setter模型对象。
    • @supertonsky:Spring 在这种情况下使用了 setter,并且无法配置为直接访问字段。 Spring 文档没有很好地涵盖这一时刻。
    猜你喜欢
    • 2020-10-22
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多