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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

@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

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>

此时 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")@ResponseBodypublic 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")@ResponseBodypublic 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 解决类型转换问题

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2014年科目三智能化考试十大必知事项

一、模拟夜考灯光使用 1&#xff0c;夜间通过急转弯/坡道/拱桥/人行横道/或没有交通信号灯控制的路口&#xff1b; 灯光使用&#xff1a;交替使用远近光(变光2次以上) 2&#xff0c;夜间在窄路窄桥与非机动车会车 灯光使用&#xff1a;近光灯 3&#xff0c;夜间在道路上发生故障…

SpringMVC注解 @initbinder 解决类型转换问题

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 使用 SpringMVC 时&#xff0c;常遇到表单中日期字符串和 JavaBean 的 Date 类型的转换&#xff0c;而 SpringMVC 默认不支持这个格式的…

看了就彻底明白人生!!!

出生一张纸&#xff0c;开始一辈子&#xff1b; 毕业一张纸&#xff0c;奋斗一辈子&#xff1b; 婚姻一张纸&#xff0c;折磨一辈子&#xff1b; 做官一张纸&#xff0c;斗争一辈子&#xff1b; 金钱一张纸&#xff0c;辛苦一辈子&#xff1b; 荣誉一张纸&#xff0c;虚名一辈子…

FreeSql (三十三)CodeFirst 类型映射

前面有介绍过几篇 CodeFirst 内容文章&#xff0c;有 《&#xff08;二&#xff09;自动迁移实体》(https://www.cnblogs.com/FreeSql/p/11531301.html)《&#xff08;三&#xff09;实体特性》(https://www.cnblogs.com/FreeSql/p/11531302.html)《&#xff08;四&#xff09;…

FreeSql (三十四)CodeFirst 迁移说明

FreeSql 支持 CodeFirst 迁移结构至数据库&#xff0c;这应该是(O/RM)必须标配的一个功能。 与其他(O/RM)不同FreeSql支持更多的数据库特性&#xff0c;而不只是支持基础的数据类型&#xff0c;这既是优点也是缺点&#xff0c;优点是充分利用数据库特性辅助开发&#xff0c;缺点…

曾国藩家训:三个地方看一个家庭的兴败

第一看&#xff1a;看子孙睡到几点&#xff0c;假如睡到太阳都已经升得很高的时候才起来&#xff0c;那代表这个家族会慢慢懈怠下来;第二看&#xff1a;看子孙有没有做家务&#xff0c;因为勤劳、劳动的习惯影响一个人一辈子;第三看&#xff1a;看后代子孙有没有在读圣贤的经典…

Linux 查看文件指定行数 内容

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1、tail date.log 输出文件末尾的内容&#xff0c;默认10行 tail -20 date.log 输出最后20行的内容 tail -n -20…

FreeSql (三十五)CodeFirst 自定义特性

比如项目内已经使用了其它 orm&#xff0c;如 efcore&#xff0c;这样意味着实体中可能存在 [Key]&#xff0c;但它与 FreeSql [Column(IsPrimary true] 不同。 Q&#xff1a; FreeSql 实体特性为啥这么别扭&#xff1f; A&#xff1a; 为了考虑一致性用法&#xff0c;全部封装…

相随心转,枯荣立现

宋朝时&#xff0c;有高孝标和高孝积两个双胞胎兄弟&#xff0c;举止言谈和才思颖悟都象同一人。十六岁时&#xff0c;他们一齐考上秀才。婚后&#xff0c;父母为使媳妇能辨认丈夫&#xff0c;命令他们穿着不同衣裳和鞋子&#xff0c;以便辨认。有一天&#xff0c;他们遇到陈希…

查看 linux 硬件信息:内存、分区、系统、环境变量、防火墙、路由、端口监听、进程、CPU...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、linux CPU大小&#xff1b; 其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg…

成功人士高效率的工作法

现在的人总是忙个不停&#xff0c;尤其企业家或高阶主管大多身兼数职&#xff0c;为了达成工作目标&#xff0c;不得不经常加班。加上现在社交媒体和各种电子产品的诱惑让时间更加不够用了。每天察看邮件并即时回覆并不代表工作效率。如何排除干扰、克服惰性和避免超时工作才是…

R语言 线性回归分析实例

y,X1,X2,X3 分别表示第 t 年各项税收收入(亿元)&#xff0c;某国生产总值GDP(亿元)&#xff0c;财政支出(亿元)和商品零售价格指数(%). (1) 建立线性模型&#xff1a; ① 自己编写函数&#xff1a; > library(openxlsx) > data read.xlsx("22_data.xlsx",shee…

maven 工程 pom.xml 中 relativePath 的作用

Maven parent.relativePath 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 默认值为../pom.xml 查找顺序&#xff1a;relativePath元素中的地址–本地仓库–远程仓库 设定一个空值将…

【Cef编译】 CefSharp编译失败,检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”...

编译CefSharp生成后一个libcef_dll_wrapper.lib时&#xff0c;供CefSharp使用。结果CefSharp编译的时候报错。遇到以下异常&#xff1a;libcef_dll_wrapper.lib(binary_value_ctocpp.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值…

做老板欣赏的优秀员工 十大准则你达标吗?

在一个企业里&#xff0c;什么样的员工才是优秀的员工&#xff1f;优秀的员工拥有的怎样的特质&#xff1f;同在一个公司工作&#xff0c;同样的学历与相仿的年龄&#xff0c;为什么有的人总是业绩更好、工资更高、待遇更优秀、更能够获得老板的信任&#xff1f;这是目前许多企…

2 小时学会 springboot ( 附实例讲解 )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一.什么是spring boot Takes an opinionated view of building production-ready Spring applications. Spring Boot favors convention…

管理拾穗:四眼原则

日前听到一位现在服务于一家德国公司的朋友提及他们公司里的主管有一个四眼原则(Four eyes principle)&#xff0c;意思是如果有一份对外的重要文件要发出前&#xff0c;要经过两个人(四个眼睛)看过&#xff0c;确定内容无误之后&#xff0c;再发出。我也曾经在一家国际知名的德…

CEF编译 执行gn args out\Release_GN_x86异常

gn args out\Debug_GN_x86 用来配置编译参数&#xff0c;执行gn args out\Release_GN_x86时异常&#xff1a; Toolchain is out of date. Run "gclient runhooks" to update the toolchain, or set DEPOT_TOOLS_WIN_TOOLCHAIN0 to use the locally installed toolcha…

成功者刻骨铭心的一句话

您知道吗&#xff1f;在这个世界上有许多名人和飞黄腾达的企业家。他们的成功除了靠自己的努力外&#xff0c;还靠来自他人的启发&#xff0c;改变了他们的观点&#xff0c;因而攀上了人生的巅峰。就像美国著名顾问公司盖洛普&#xff08;Gallup&#xff09;的CEO吉姆‧克利夫顿…

js中的鼠标右键点击事件

https://www.cnblogs.com/sea-stream/p/9638870.html window.onload function(){//去掉默认的contextmenu事件&#xff0c;否则会和右键事件同时出现。document.oncontextmenu function(e){e.preventDefault();};document.getElementById("test").onmousedown fun…