今天就以前台表单提交两个对象做实例。为了扩大影响,我让这两个对象的属性相同。
User.Java??和Addr.java
??
前台JSP
看到这种情况,很容易想到struts进行绑定非常方便,可是,谁让我们要使用SpringMVC呢。。。这种情况springMVC直接进行入参,是不能接收到参数的。
??解决思路:
使用 @InitBinder 注解进行绑定参数。前台表单中name属性仍然使用Object.Param形式传入。(另一种解决思路:扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。)
??
@InitBinder("user")????
????????public??void??initBinderUser(WebDataBinder??binder)??{????
????????????????binder.setFieldDefaultPrefix("user.");????
????????}????
此处使用@InitBinder() 中间的value,用于指定命令/表单属性或请求参数的名字,符合该名字的将使用此处的DataBinder,如我们的@ModelAttribute("user1") User user1 将使用@InitBinder("user1")指定的DataBinder绑定;如果不指定value值,那么所有的都将使用。
DataBinder.setFieldDefaultPrefix 意思是设置参数的前缀,如我们的是"user1.",此处不能少了".",
这种方式的缺点:
1、不支持Path variable的绑定,如/test1/{user1.id}这种情况的绑定;
2、不支持如集合/数组的绑定;
后台接收 完整代码:
??
[java]??view plain??

@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<String,Object>??test(HttpServletRequest??request,@ModelAttribute("user")??User??user,@ModelAttribute("addr")??Addr??addr){????
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-65226-3.html
怎么感觉有自我安慰的感觉
6%