前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SpringMvc 注解 @InitBinder 表单多对象精准绑定接收

SpringMvc 注解 @InitBinder 表单多对象精准绑定接收

作者头像
微风-- 轻许--
发布于 2019-07-02 05:45:48
发布于 2019-07-02 05:45:48
1.8K00
代码可运行
举报
文章被收录于专栏:java 微风java 微风
运行总次数:0
代码可运行

@InitBinder用于在@Controller中标注于方法,表示为当前控制器注册一个属性编辑器或者其他,只对当前的Controller有效。

在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,需要手动配置自定义数据的绑定才能解决这个问题。

在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。

WebDataBinder是用来绑定请求参数到指定的属性编辑器. 由前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。

-----------------------------------我是分隔线-----------------------------------

一. 问题描述: 一张表单中提交多个对象,并在后台Controller 中精准的绑定。可对象中的参数名有的相同,后台接收入参时无法像struts那样jsp表单中使用Object.Param形式对表单进行精准绑定入参(struts2默认就是这种方案),因为struts2采用了OGNL,并通过栈(根对象)进行操作,栈中默认有action实例,所以无此问题。但 Struts用这种方式绑定入参牺牲了性能。

现在以前台表单提交两个对象为例。

User.java 和 Addr.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class User implements Serializable{
String id;
String name;
//get..set....
}
public class Addr implements Serializable{
 
String id;
 
String name;//set..get...
}

前台JSP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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>

此时 springMVC 直接进行入参,是不能接收到参数的。

二. 解决思路

用 @InitBinder 注解作参数绑定。前台表单中name属性仍然使用Object.Param形式传入。

(另一种解决思路:扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    @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、不支持如集合/数组的绑定;

三 问题解决

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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完成如下几件事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1、binder.setAllowedFields("id")  : 设置允许的字段,比如我只想设置id,那么可以调用这个方法,那么其他属性会忽略;

2、binder.setDisallowedFields("id") : 设置不允许的自动,比如我不想设置id,那么可以调用此方法,这个属性将不设置;

3、binder.setRequiredFields() : 表示哪些字段是必填的;

4、binder.setValidator() :设置自定义的验证器,如果如JSR-303不适合,可以使用这个。

完整例子:

两个对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class User implements Serializable{
String id;
String name;
//get..set....
}
public class Addr implements Serializable{
 
String id;
 
String name;//set..get...
}

jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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;
    }

--------------------- 转自:

https://blog.csdn.net/qq_24505127/article/details/54236583

https://blog.51cto.com/simplelife/1919597

另关于类型转换见另一文章: SpringMVC注解 @initbinder 解决类型转换问题

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年06月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SpringMVC数据绑定定义支持的数据绑定方式
定义 百度百科定义: 简单绑定是将一个用户界面元素(控件)的属性绑定到一个类型(对象)实例上的某个属性的方法。 例如,如果一个开发者有一个Customer类型的实例,那么他就可以把Customer的“Name”属性绑定到一个TextBox的“Text”属性上。“绑定”了这2个属性之后,对TextBox的Text属性的更改将“传播”到Customer的Name属性,而对Customer的Name属性的更改同样会“传播”到TextBox的Text属性。 支持的数据绑定方式 SpringMVC的各种参数包括对
JavaEdge
2018/04/28
5.6K0
SpringMVC数据绑定定义支持的数据绑定方式
从原理层面掌握@InitBinder的使用【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/09/18
3.4K0
【工作篇】再次熟悉 SpringMVC 参数绑定
主要现在项目中使用的参数绑定五花八门的,搞得很头大,例如有些用字符串接收日期,用字符串接受数组等等,完全没有利用好 SpringMVC 的优势,这里自己也总结一下,免得到时又要百度谷歌查找。
玖柒的小窝
2021/12/17
6660
SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
@ControllerAdvice ,很多初学者可能都没有听说过这个注解,实际上,这是一个非常有用的注解,顾名思义,这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:
江南一点雨
2019/05/07
1.4K0
SpringMVC 中 @ControllerAdvice 注解的三种使用场景!
SpringMVC学习笔记
(1)通过 contextConfigLocation 来配置 SpringMVC 的配置文件
shirayner
2018/08/10
1.3K0
SpringMVC学习笔记
Spring Boot 学习三:静态资源、整合 Thymeleaf 页面模板、@RestControllerAdvice
在 Spring Boot 中,默认情况下,一共有5个位置可以放静态资源,五个路径分别是如下:
关忆北.
2020/10/15
8970
Spring Boot 学习三:静态资源、整合 Thymeleaf 页面模板、@RestControllerAdvice
一文读懂SpringMVC中的数据绑定
Struts2 和 SpringMVC 都是 Web 开发中视图层的框架,两者都实现了数据的自动绑定,都不需要我们手动获取参数然后关联到对应的属性上,下面就谈谈两者的区别。
Wizey
2018/09/29
9230
【Spring Boot】027-@ControllerAdvice 与 @RestControllerAdvice
@ControllerAdvice 是 @Controller 的增强版,其主要用来处理全局数据,一般搭配 @ExceptionHandler 、@ModelAttribute 以及 @InitBinder 使用!
訾博ZiBo
2025/01/06
2830
【Spring Boot】027-@ControllerAdvice 与 @RestControllerAdvice
SpringMVC参数绑定-细致总结(通俗易懂)
前面已经写过 SSM 三大框架的一些入门文章,在 SpringMVC 部分,关于参数的绑定提的不是太多,重新整理了一下,就当做一个补充,时间匆匆,可能会有一些错误,大家可以共同交流,一起探讨!
BWH_Steven
2020/05/11
1.2K0
SpringMVC参数绑定-细致总结(通俗易懂)
springMVC参数绑定
处理器形参中添加如下类型的参数处理注解适配器会默认识别并进行赋值。 1 HttpServletRequest 通过request对象获取请求信息 2 HttpServletResponse 通过response处理响应信息 3 HttpSession 通过session对象得到session中存放的对象 4 Model 通过model向页面传递数据,如下: //调用service查询商品信息 Items item = itemService.findItemById(id); model.addAttribute("item", item); 页面通过${item.XXXX}获取item对象的属性值。 model也可以通过modelMap或map将数据传到页面(这是因为底层就是这个类型,具体可以看看底层代码)。
intsmaze-刘洋
2018/08/29
6490
SpringMVC(一)
概述 SpringMVC 通过一套 MVC 注解,让一个 POJO 成为处理请求的控制器,而无需实现任何接口 HelloWorld 步骤概括 加入 jar 包 加入 SpringMVC 配置文件 在 web.xml 文件中配置 DispatcherServlet 编写处理请求的处理器,并标识为处理器 编写视图 详细步骤 创建 Maven 工程,加入 jar 依赖 <properties> <spring.verison>4.3.8.RELEASE</spring.verison> </prop
bgZyy
2018/06/07
8600
Spring数据绑定之 WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...---02
上一篇我们对DataBinder的源码进行了详细的分析,下面我们对DataBinder的实现子类来做一下具体分析:
大忽悠爱学习
2022/08/23
4740
Spring数据绑定之 WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...---02
Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上
前面已经详细介绍过了RequestMappingHandlerMapping是如何在初始化方法中搜集容器中所有标注了@Controller或者@RequestMapping注解的Bean的,然后解析将映射关系保存到映射中心。
大忽悠爱学习
2023/02/13
7960
Spring MVC注解Controller源码流程解析--HandlerAdapter执行流程--上
聊聊Spring中的数据绑定 --- WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...【享学Spring】
上篇文章聊了DataBinder,这篇文章继续聊聊实际应用中的数据绑定主菜:WebDataBinder。
YourBatman
2019/09/03
1.9K1
聊聊Spring中的数据绑定 --- WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...【享学Spring】
5千字的SpringMVC总结,我觉得你会需要
SpringMVC再熟悉不过的框架了,因为现在最火的SpringBoot的内置MVC框架就是SpringMVC。我写这篇文章的动机是想通过回顾总结一下,重新认识SpringMVC,所谓温故而知新嘛。
java技术爱好者
2020/09/22
7710
Spring Boot的数据绑定和参数传递(一)
Spring Boot 是一款基于Spring框架的开源框架,它可以帮助开发者快速搭建、配置和部署各种类型的应用程序。其中,数据绑定和参数传递是Spring Boot的两个核心功能之一,也是RESTful API开发中非常重要的一部分。
堕落飞鸟
2023/04/05
1K0
史上最强Spring mvc入门
一、SpringMVC基础入门,创建一个HelloWorld程序   1.首先,导入SpringMVC需要的jar包。   2.添加Web.xml配置文件中关于SpringMVC的配置 <!--c
xiangzhihong
2018/02/01
1.3K0
史上最强Spring mvc入门
SpringMVC注解 @initbinder 解决类型转换问题
使用 SpringMVC 时,常遇到表单中日期字符串和 JavaBean 的 Date 类型的转换,而 SpringMVC 默认不支持这个格式的转换,故需要手动配置,自定义数据的绑定才能解决这个问题。 在需要日期转换的 Controller 中使用 SpringMVC 的注解 @initbinder 和 Spring 自带的 WebDateBinder 类来操作。 WebDataBinder 是用来绑定请求参数到指定的属性编辑器.由于前端传到 controller 里的值是 String 类型的,当往 Model 里 Set这个值的时候,如果 set 的这个属性是个对象,Spring 就会去找到对应的 editor 进行转换,然后再 SET 进去。 代码如下:
微风-- 轻许--
2019/07/02
6030
SpringMVC注解@initbinder解决类型转换问题
在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换,而SpringMVC默认不支持这个格式的转换,所以需要手动配置,自定义数据的绑定才能解决这个问题。 在需要日期转换的Controller中使用SpringMVC的注解@initbinder和Spring自带的WebDateBinder类来操作。 WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再SET进去。 代码如下:
wuweixiang
2018/08/14
3440
SpringMVC【开发Controller】详解
前言 本文主要是讲解在Controller中的开发,主要的知识点有如下: 编码过滤器 使用注解开发 注解@RequestMapping详解 业务方法接收参数 字符串转日期 重定向和转发 返回JSON
Java3y
2018/03/16
1K0
SpringMVC【开发Controller】详解
推荐阅读
相关推荐
SpringMVC数据绑定定义支持的数据绑定方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验