SpringMvc @InitBinder 表单多对象精准绑定接收
来源:互联网 发布:最新软件代理 编辑:程序博客网 时间:2024/05/17 23:01
问题出现
要在一张表单中提交多个对象,并且还要在后台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
- <form action="/test/test" method="post">
- <input type="text" name="user.id" value="huo_user_id">
- <input type="text" name="user.name" value="huo_user_name">
- <input type="text" name="addr.id" value="huo_addr_id">
- <input type="text" name="addr.name" value="huo_addr_name">
- <input type="submit" value="提交">
- </form>
看到这种情况,很容易想到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、不支持如集合/数组的绑定;
问题解决
- @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){
- Map<String,Object> map=new HashMap<String,Object>();
- map.put("user", user);
- map.put("addr", addr);
- return map;
- }
就一个@InitBinder 就可以解决了。
另外可以通过DataBinder完成如下几件事情:
1、binder.setAllowedFields("id") : 设置允许的字段,比如我只想设置id,那么可以调用这个方法,那么其他属性会忽略;
2、binder.setDisallowedFields("id") : 设置不允许的自动,比如我不想设置id,那么可以调用此方法,这个属性将不设置;
3、binder.setRequiredFields() : 表示哪些字段是必填的;
4、binder.setValidator() :设置自定义的验证器,如果如JSR-303不适合,可以使用这个。
完整实例
为了防止上面内容说的和写的模糊看不懂,我还是把较完整的代码贴出来吧,不过也是重复一遍。哈哈哈。
两个对象
- public class User implements Serializable{
- String id;
- String name;
- //get..set....
- }
- public class Addr implements Serializable{
- String id;
- String name;//set..get...
- }
jsp
- <form action="/test/test" method="post">
- <input type="text" name="user.id" value="huo_user_id">
- <input type="text" name="user.name" value="huo_user_name">
- <input type="text" name="addr.id" value="huo_addr_id">
- <input type="text" name="addr.name" value="huo_addr_name">
- <input type="submit" value="提交">
- </form>
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<String,Object> test(HttpServletRequest request,@ModelAttribute("user") User user,@ModelAttribute("addr") Addr addr){
- Map<String,Object> map=new HashMap<String,Object>();
- map.put("user", user);
- map.put("addr", addr);
- return map;
- }
- SpringMvc @InitBinder 表单多对象精准绑定接收
- SpringMvc @InitBinder 表单多对象精准绑定接收
- SpringMvc @InitBinder 表单多对象精准绑定接收
- SpringMVC用InitBinder注解实现表单多对象精准绑定接收
- @InitBinder注解 解决form表单向springmvc传递多个对象参数
- InitBinder表单数据绑定编辑器
- SpringMVC中利用@InitBinder来对表单数据进行解析绑定
- SpringMVC接收Json数据并绑定对象
- 使用@InitBinder 标签对表单数据绑定
- SpringMVC-InitBinder验证-对表单数据验证
- springMVC提交表单绑定到对象
- SpringMVC - 页面form表单绑定对象
- 4种方法让SpringMVC接收多个对象 List<user> 表单提交,以BeanListModel接收
- springMVC接收多个对象
- SpringMVC-----SpringMVC接收多个对象参数
- spring mvc使用@InitBinder 标签对表单数据绑定
- spring mvc使用@InitBinder 标签对表单数据绑定
- spring mvc使用@InitBinder 标签对表单数据绑定
- 原系统改造的思维扩张之路---交易系统
- NYOJ:23-取石子(一)
- 网络编程调参学习————三次握手中的接收缓存和通告窗口
- 引导页
- Redis学习——Redis事务
- SpringMvc @InitBinder 表单多对象精准绑定接收
- Docker的四种网络模式
- SetupAPI简介与设备管理
- centos学习:理解main函数的两个参数
- 《200行Python代码实现2048》分析
- CakePHP中的批量保存及批量更新
- 移动端屏幕适配的解决
- Thinking in java 笔记(更新中)
- Java Lambda(语言篇——lambda,方法引用,目标类型,默认方法,函数接口,变量捕获)