邓州微网站建设,wordpress 虚拟空间,梧州论坛网,河南郑州最新消息今天前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂#xff0c;风趣幽默#xff0c;忍不住分享一下给大家。点击跳转到教程。
InitBinder用于在Controller中标注于方法#xff0c;表示为当前控制器注册一个属性编辑器或者其他#xff0c;只对当前的Controller有…前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到教程。
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 methodpostinput typetext nameuser.id valuehuo_user_idinput typetext nameuser.name valuehuo_user_nameinput typetext nameaddr.id valuehuo_addr_idinput typetext nameaddr.name valuehuo_addr_nameinput typesubmit 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 MapString,Object test(HttpServletRequest request,ModelAttribute(user) User user,ModelAttribute(addr) Addr addr){MapString,Object mapnew HashMapString,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 methodpostinput typetext nameuser.id valuehuo_user_idinput typetext nameuser.name valuehuo_user_nameinput typetext nameaddr.id valuehuo_addr_idinput typetext nameaddr.name valuehuo_addr_nameinput typesubmit 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 MapString,Object test(HttpServletRequest request,ModelAttribute(user) User user,ModelAttribute(addr) Addr addr){MapString,Object mapnew HashMapString,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 解决类型转换问题