https://blog.csdn.net/flashflight/article/details/42935137

之前写过一篇《扩展SpringMVC以支持更精准的数据绑定1》用于完成类似于struts2的数据绑定;有朋友可能觉得自己写个参数解析器扩展比较麻烦,在此再介绍下springmvc内置的支持。

代码片段如下:

  1. //http://localhost:9080/es-web/binder/test1?user1.id=1&user2.id=2
  2. @RequestMapping("/test1")
  3. public String test1(@ModelAttribute("user1") User user1, @ModelAttribute("user2") User user2) {
  4. System.out.println(user1);
  5. System.out.println(user2);
  6. return "";
  7. }
  8. @InitBinder("user1")
  9. public void initBinder1(WebDataBinder binder) {
  10. binder.setFieldDefaultPrefix("user1.");
  11. }
  12. @InitBinder("user2")
  13. public void initBinder2(WebDataBinder binder) {
  14. binder.setFieldDefaultPrefix("user2.");
  15. }

此处使用@InitBinder() 中间的value,用于指定命令/表单属性或请求参数的名字,符合该名字的将使用此处的DataBinder,如我们的@ModelAttribute("user1") User user1 将使用@InitBinder("user1")指定的DataBinder绑定;如果不指定value值,那么所有的都将使用。

DataBinder.setFieldDefaultPrefix 意思是设置参数的前缀,如我们的是"user1.",此处不能少了".",

这种方式的缺点:

1、不支持Path variable的绑定,如/test1/{user1.id}这种情况的绑定;

2、不支持如集合/数组的绑定;

如果需要复杂的绑定可以直接使用《扩展SpringMVC以支持更精准的数据绑定1》介绍的方式。下载最新的可以参考:

FormModelMethodArgumentResolver.java

spring-config.xml

ParentController.java (绑定集合的例子)

另外可以通过DataBinder完成如下几件事情:

1、binder.setAllowedFields("id")  : 设置允许的字段,比如我只想设置id,那么可以调用这个方法,那么其他属性会忽略;

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

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

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

5、binder.registerCustomEditor : 注册自定义的编辑器;可以参考《第四章 Controller接口控制器详解(6)——跟着开涛学SpringMVC 》

总体来说,如果进行简单的绑定,又不想引入@FormModel注解,那么使用这种方式是可以解决问题的。

在使用springmvc数据绑定时,还有一点需要注意(尤其如增删改 都使用同一个页面):

如果用的是原子类型,如int,但是界面上是:

<input type='text' name='id' value=''> 即值为空

那么会遇到如下异常:

Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'id'; nested exception is java.lang.NumberFormatException: For input string: ""]

建议:

1、最简单的办法 把int 改成---> Integer 即可   即系统的模型中只使用保证类型,

2、如果是新增 到新增页面时  给status一个默认值,可以考虑给个默认值

3、使用if-else 屏蔽掉

其实这个springmvc可以改进下,如果是空,给个默认值,这样也行。不过这总起来说还是使用者的问题。

https://jinnianshilongnian.iteye.com/blog/1888474

SpringMVC内置的精准数据绑定2的更多相关文章

  1. AngularJS高级程序设计读书笔记 -- 指令篇 之 内置指令

    1. 内置指令(10-12 章) AngularJS 内置超过 50 个内置指令, 包括 数据绑定,表单验证,模板生成,时间处理 和 HTML 操作. 指令暴露了 AngularJS 的核心功能, 如 ...

  2. Spring,SpringMVC,MyBatis,Hibernate,Servlet的生命周期,jsp有哪些内置对象,Tomcat,Cookie和Session的作用以及区别,oracle,MYSQL等面试题总结

    1. 什么是Spring,谈谈你对Spring的理解 Spring是我们JAVA开发人员在搭建后台时选用的一个轻量级的开源框架,Spring框架目前也是功能丰富,十分优秀企业级采用最多的一个框架. S ...

  3. 数据绑定-绑定Servlet内置对象

    数据绑定:获取用户提交的参数,绑定到入参的参数中,就叫数据绑定. 绑定Servlet内置对象: 测试:

  4. springboot(八)内置SpringMvc静态文件地址修改

    参考:作者:恒宇少年链接:https://www.jianshu.com/p/c6ab1081fd5f   介绍: SpringMVC大家都不陌生,而被SpringBoot集成的SpringMVC除了 ...

  5. Webform(七)——内置对象(Session、Application)和Repeater的Command操作

    内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. 一.内置对象 (一)Session 跟Cookies一样用来存储用户数据 1.Session.Cookies对比 ...

  6. Webform(五)——内置对象(Response、Request)和Repeater中的数据增删改

    一.内置对象 (一)Response对象 1.简介:response 对象在ASP中负责将信息传递给用户.Response对象用于动态响应客户端请求,并将动态生成的响应结果返回到客户端浏览器中,使用R ...

  7. WebForm 内置对象2

    Session: 与Cookies相比 相同点:每一台电脑访问服务器,都会是独立的一套session,key值都一样,但是内容都是不一样的 以上所有内容,都跟cookies一样 不同点: 1.Sess ...

  8. WebForm 内置对象

    内置对象: Response对象:响应请求 Response.Write("<script>alert('添加成功!')</script>"); Respo ...

  9. C# WebForm内置对象2+Repeater的Command

    内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及 ...

随机推荐

  1. Oracle数据泵导出导入(expdp/impdp)

    一.创建表空间 create tablespace atp logging datafile 'D:\oracle\oradata\orcl\atp.dbf' size 50m autoextend ...

  2. 一起学习《C#高级编程》2--比较对象的相等性

    今后争取每两天能更新一次.平日的诱惑太多,双休只顾玩了,进度有点慢. 接上一讲的,类型的安全性,留下了点小尾巴——比较对象的相等性. C#有四种比较相等的方式:除了“==”运算符外,System.Ob ...

  3. [C#学习笔记]C#中的decimal类型——《CLR via C#》

    System.Decimal是非常特殊的类型.在CLR中,Decimal类型不是基元类型.这就意味着CLR没有知道如何处理Decimal的IL指令. 在文档中查看Decimal类型,可以看到它提供了一 ...

  4. iOS 模拟器网络设置

    在 iOS Simulator 下,点上面菜单栏最左面的苹果标志,第三项 网络设置,然后先最后面一项,网络设置. 然后在网络设置界面下可以开启或关闭网络.

  5. Android DatePicker / TimePicker 占空间太大的解决办法

    DatePicker 与 TimePicker 控件占用的空间是固定的,没有参数可以更改. 如果修改 length 和 width 属性,只会让控件被切割,显示将不完整.很多人说可以使用 scale ...

  6. linux中使用unzip命令中文乱码解决办法

    今天在使用unzip进行解压缩文件时,发现解压出的文件中文乱码,最后使用如下命令解决: unzip -O CP936 xxx.zip 特此记录一下.

  7. 1270: Wooden Sticks [贪心]

    点击打开链接 1270: Wooden Sticks [贪心] 时间限制: 1 Sec 内存限制: 128 MB 提交: 31 解决: 11 统计 题目描述 Lialosiu要制作木棍,给n根作为原料 ...

  8. 深入了解java虚拟机(JVM) 第十一章 类的加载

    一.类加载机制概述 虚拟机把描述类的数据从class文件加载到内存并对数据进行效验,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制. 二.类加载的机制 类加载的过程 ...

  9. Python(简单计算器)

    参考:https://www.cnblogs.com/alex3714/articles/5169958.html import re ret = re.search('\([^()]+\)','(1 ...

  10. 网卡NAT方式下虚拟机安装FTP服务

    在windows8下安装Oracle VM VirtualBox虚拟机,虚拟机中安装的CentOS操作系统,在CentOS中搭建LNMP环境,安装vsftpd服务器,宿主机在phpStorm编程,将代 ...