代码之家  ›  专栏  ›  技术社区  ›  Rickard Lindberg

SpringMap如何将数据发布到POJO?

  •  4
  • Rickard Lindberg  · 技术社区  · 15 年前

    我有一个这样定义的弹簧控制器:

    @Controller
    @RequestMapping("/user")
    class UserController {
        ...
        @RequestMapping(method=RequestMethod.POST)
        public String save(User user) {
            // Do something with user
            return "redirect:/...";
        }
    }
    

    在这种情况下,如何将发布数据(从表单提交的数据)映射到用户对象?是否有任何文件说明这是如何工作的?

    如果我有两个这样的水痘怎么办?

    @Controller
    @RequestMapping("/user")
    class UserController {
        ...
        @RequestMapping(method=RequestMethod.POST)
        public String save(User user, Foo anotherPojo) {
            // Do something with user
            return "redirect:/...";
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   skaffman    15 年前

    在第一种情况下,SpringMVC将尝试将HTTP POST参数名与 User 类,根据需要转换这些参数值的类型。

    在第二种情况下,我相信Spring会抛出一个异常,因为它只接受一个命令对象。

        2
  •  2
  •   Daff    15 年前

    在许多情况下,如果post参数名与pojo属性名相同,就足够了。但正确的方法是使用 Spring form taglib 把它绑在你的POJO上:

    @Controller
    @RequestMapping("/user")
    class UserController {
        ...
    
        @RequestMapping(value="/login", method=RequestMethod.GET)
        public ModelAndView get() {
            return new ModelAndView().addObject("formBackingObject", new User());
        }
    
        @RequestMapping(value="/login", method=RequestMethod.POST)
        public String save(User user) {
            // Do something with user
            return "redirect:/...";
        }
    }
    

    然后在JSP中:

    // e.g in user/login.jsp
    <form:form method="post" commandName="formBackingObject" action="/user/login.html">
        <form:label path="username"><spring:message code="label.username" /></form:label>
        <form:input path="username" cssErrorClass="error" />
        <form:label path="password"><spring:message code="label.password" /></form:label>
        <form:password path="password" cssErrorClass="error" />
        <p><input class="button" type="submit" value="<spring:message code="label.login" />"/></p>
    </form:form>
    

    您可以嵌套您的属性(例如,如果您的用户有地址属性,那么address.street),但我认为Spring不会接受多个命令对象。