4

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

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

在这种情况下,post 数据(从表单提交的数据)如何映射到 User 对象?有没有关于它是如何工作的文档?

如果我有两个这样的 POJO 会发生什么?

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

2 回答 2

2

在第一种情况下,Spring MVC 将尝试将 HTTP POST 参数名称与User类的属性名称匹配,并根据需要转换这些参数值的类型。

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

于 2010-05-18T12:59:10.240 回答
2

在许多情况下,如果 POST 参数名称与您的 POJO 属性名称相同就足够了。正确的方法是使用Spring 表单 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 不会接受多个命令对象。

于 2010-05-18T13:01:32.570 回答