2010-05-18 45 views
4

我有这样限定的弹簧控制器:春季地图如何发布数据到POJO?

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

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

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

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

回答

2

在第一种情况下,弹簧将MVC尝试匹配的HTTP POST的参数名称的User类的属性名称,根据需要将所述类型的那些参数的值。

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

+0

那么post参数与'User'中的属性不匹配呢?他们会被忽略吗?他们可以用一个'@RequestParam(“type”)类型来代替吗? – 2010-05-18 13:01:23

+0

@Richard:他们会被忽略,是的,你可以混合使用@RequestParam等命令对象,以任何你想要的组合 – skaffman 2010-05-18 13:17:04

2

在许多情况下,只要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会接受多个命令对象。