要在一张表单中提交多个对象,并且还要在后台Controller 中精准的绑定接收。可是,这些对象中的参数名可能相同,后台接收入参时无法像struts那样jsp表单中使用Object.Param形式对表单进行精准绑定入参,我们都知道struts2默认就是这种方案,这是因为struts2采用了OGNL,并通过栈(根对象)进行操作的,而且栈中默认有action实例,所以很自然的没有这种问题。另一方面说,Struts用这种方式绑定入参,却牺牲了性能。虽然springmvc不能像struts那样方便的很直接的入参绑定,当然,Spring多对象绑定入参也提供了方法。
今天就以前台表单提交两个对象做实例。为了扩大影响,我让这两个对象的属性相同。
User.java 和Addr.java
public class User implements Serializable{
String id;
String name;
//get..set....
}
public class Addr implements Serializable{
String id;
String name;//set..get...
}
前台JSP
使用 @InitBinder 注解进行绑定参数。前台表单中name属性仍然使用Object.Param形式传入。(另一种解决思路:扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。)
@InitBinder("user")
public void initBinderUser(WebDataBinder binder) {
binder.setFieldDefaultPrefix("user.");
}
@Controller
@RequestMapping("/test")
public class TestController {
// 绑定变量名字和属性,参数封装进类
@InitBinder("user")
public void initBinderUser(WebDataBinder binder) {
binder.setFieldDefaultPrefix("user.");
}
// 绑定变量名字和属性,参数封装进类
@InitBinder("addr")
public void initBinderAddr(WebDataBinder binder) {
binder.setFieldDefaultPrefix("addr.");
}
@RequestMapping("/test")
@ResponseBody
public Map test(HttpServletRequest request,@ModelAttribute("user") User user,@ModelAttribute("addr") Addr addr){
Map map=new HashMap();
map.put("user", user);
map.put("addr", addr);
return map;
}
为了防止上面内容说的和写的模糊看不懂,我还是把较完整的代码贴出来吧,不过也是重复一遍。哈哈哈。
两个对象
public class User implements Serializable{
String id;
String name;
//get..set....
}
public class Addr implements Serializable{
String id;
String name;//set..get...
}
Controller
@Controller
@RequestMapping("/test")
public class TestController {
// 绑定变量名字和属性,参数封装进类
@InitBinder("user")
public void initBinderUser(WebDataBinder binder) {
binder.setFieldDefaultPrefix("user.");
}
// 绑定变量名字和属性,参数封装进类
@InitBinder("addr")
public void initBinderAddr(WebDataBinder binder) {
binder.setFieldDefaultPrefix("addr.");
}
@RequestMapping("/test")
@ResponseBody
public Map test(HttpServletRequest request,@ModelAttribute("user") User user,@ModelAttribute("addr") Addr addr){
Map map=new HashMap();
map.put("user", user);
map.put("addr", addr);
return map;
}