表单在 web 页面上无处不在,有些表单可能很复杂,大部分表单里的输入项都会对应后端对象属性。
SpringMVC 可以自动将表单值绑定到对象上!而且能绑定很复杂的对象!!
这里就不写那些基本的表单绑定了。
我想写工作中遇到的一个情况,就是想转换成一个 List 对象,并且这个对象里面有属性也是 List 的。

public class ProjectDO{
//其他属性就省略了
//团队成员
private List<ProjectTeamInfoDO> teaminfoList;
} public class ProjectTeamInfoDO {
//学历信息
private List<ProjectCollegeDO> college;
} public class ProjectCollegeDO{
// 专业
private String major;
// 学校
private String school;
// 学位
private String diploma;
}

解释下意思,项目类里有个属性存放团队成员信息的,肯定有多个成员对吧,所以是 List 类型。每个团队成员又有学历信息,那学历也有很多,本科、硕士、博士啊之类的,所以也是 List 类型的。

这个对像已经算是复杂了,那应该怎样让它自动绑定起来呢?
说难不难,说简单也不简单。

先说说为什么简单,我们来看看怎么写这个表单才能自动绑定上去。

<form action="/createdProject.htm" >

    //第一个团队成员 ,第一个学历
<input type="text" name="teaminfoList[0].college[0].major">
<input type="text" name="teaminfoList[0].college[0].school">
<input type="text" name="teaminfoList[0].college[0].diploma"> //第一个团队成员 ,第二个学历
<input type="text" name="teaminfoList[0].college[1].major">
<input type="text" name="teaminfoList[0].college[1].school">
<input type="text" name="teaminfoList[0].college[1].diploma"> //第二个团队成员 ,第一个学历
<input type="text" name="teaminfoList[1].college[0].major">
<input type="text" name="teaminfoList[1].college[0].school">
<input type="text" name="teaminfoList[1].college[0].diploma"> </form>
@RequestMapping("/createdProject.htm")
public String createdProjects(ProjectDO Project){
//project 就是绑定后的对象
}

看,form 结构是不是很简单,其实就是一个二维数组。name 值带上对应的下标就行。

那又难在哪呢?
难在下标的生成,团队成员人数是未知的,不知道这个数组应该有多长,所以下标都是后面用 js 动态生成的。
添加、删除的时候下标都需要变动,还有编辑草稿加载之前缓存的信息下标也要变动。

有个问题需要注意的是绑定 List 类型的时候,会根据 input name 值下标来确定 List 长度。
比如

<input type="text" name="teaminfoList[2].college[0].major">

那 teaminfoList 的长度就是 3 了。前面两个 0 和 1 都为 null。
中间或者前面空掉的数字都会是 null ,所以后端接收到绑定后的对象要注意移除那些空对象。如果前端能保证下标连续的话就最好了。

via:http://deadlion.cn/2016/05/14/SpringMVC-复杂对象数据绑定.html

SpringMVC 复杂对象数据绑定的更多相关文章

  1. SpringMVC类型转换、数据绑定

    SpringMVC类型转换.数据绑定详解[附带源码分析] 目录 前言 属性编辑器介绍 重要接口和类介绍 部分类和接口测试 源码分析 编写自定义的属性编辑器 总结 参考资料 前言 SpringMVC是目 ...

  2. SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解

    SpringMVC强大的数据绑定(2)——第六章 注解式控制器详解 博客分类: 跟开涛学SpringMVC   6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于 ...

  3. springMVC接受对象实体并且对象实体里面又有对象集合方式

    springMVC接受对象实体并且对象实体里面又有对象集合方式: Ajax: function add(){ var orders = [ { orderNo : "H222255" ...

  4. SpringMVC类型转换、数据绑定详解[附带源码分析]

    目录 前言 属性编辑器介绍 重要接口和类介绍 部分类和接口测试 源码分析 编写自定义的属性编辑器 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那 ...

  5. SpringMVC类型转换、数据绑定详解

    public String method(Integer num, Date birth) { ... } Http请求传递的数据都是字符串String类型的,上面这个方法在Controller中定义 ...

  6. springMVC传对象参数、返回JSON格式数据

    假如请求路径:http://localhost/test/test.do?user.id=1 后台接收参数的方法如下: @RequestMapping("/test") publi ...

  7. springmvc 数据对象回绑

    springmvc中,由页面 post到 controller,对象可以在form里面设置modelAttribute达到回绑的目的. 但是如果对象里面有复杂的非String,int的对象,则要在co ...

  8. springmvc 接收对象 滴灌摘要

    js 对象 该阵列看起来像 我明白http://blog.csdn.net/baicp3/article/details/12752255本文 我们指示样品棒 data3一个js对象.遗嘱java当代 ...

  9. SpringMVC强大的数据绑定

    6.6.2.@RequestParam绑定单个请求参数值 @RequestParam用于将请求参数区数据映射到功能处理方法的参数上. public String requestparam1(@Requ ...

随机推荐

  1. Java Statement PK PrepareStatement

    PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement.PreparedStatement 和 CallableStatement三种方式来执行查询 ...

  2. 命令行创建mysql数据库指定编码方法

    GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE t ...

  3. SpringBoot开发案例之整合Dubbo分布式服务

    前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了.在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使 ...

  4. 小程序解决方案 Westore - 组件、纯组件、插件开发

    数据流转 先上一张图看清 Westore 怎么解决小程序数据难以管理和维护的问题: 非纯组件的话,可以直接省去 triggerEvent 的过程,直接修改 store.data 并且 update,形 ...

  5. Python中IO概述

    Python中的io模块是用来处理各种类型的I/O操作流.主要有三种类型的I/O类型:文本I/O(Text I/O),二进制I/O(Binary I/O)和原始I/O(Raw I/O).它们都是通用类 ...

  6. ES6 Promise 详解

    一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...

  7. JS闭包以及作用域初探

    以前看到的一个问题,很有意思: for (var i = 0; i < 5; i++) { setTimeout(function () { console.log(i); },500); } ...

  8. 【转】实现Nginx代理WSS协议

    https://blog.csdn.net/chopin407/article/details/52937645 后来看到了官网的教程(http://nginx.org/en/docs/http/we ...

  9. Use the Microsoft Symbol for VS and Windbg

    快捷方式mklink的远程符号由于所有者权限问题,链接到本地可能造成不能使用, 或每次都需要重新下载, 1.环境变量中没有设置_NT_SYMBOL_PATH的值 2.windbg快捷方式中也没有设置- ...

  10. 一、npm基础

    一.什么是npm? npm 是模块管理工具,可以下载.更新第三方模块,也可以发布自己的模块共替他人使用,主要目的在于分享和重用代码: 二.下载安装node,更新npm node 下载网址  https ...