实体的属性前一定要用.分割,如果是使用jquery的ajax提交的一个js数组对象,则请求数据会被格式化为

var sub = [{name:1,num:2},{name:1,num:2}]

$.post(url,{test,sub})

但是springmvc绑定实体时,是检测“.”符号,“.”之前的作为实体list在其bean中的名称,“.”之后的作为实体的属性而存在的,所以这里要用“.”来分割属性与list名

要想使用jquery自带的方法格式化为下面这种形式是不可能的(因为中间带有的.符号的特殊性),于是就只能这样提交了...自己构造一个这样的对象

var sub = {"test[0].num":1,"test[0].name":56,"test[1].num":2,"test[1].name":3}

$.post(url,sub)

这样是可以绑定的。

再说说后台的实体怎么写

1、实体这样写:

2、不可以在参数中直接写List<Test>,要在一个bean中把list作为成员,才可以使用list绑定实体。

3、在请求参数中直接把TestBean作为参数即可

补充1:上面2:不可以在参数中直接写List<Test>,要在一个bean中把list作为成员,才可以使用list绑定实体。

(因为直接绑定到参数名的特殊性,springmvc会直接实例化参数对象类型,接口就会实例化失败

nested exception is org.springframework.beans.BeanInstantiationException:

Could not instantiate bean class [java.util.List]: Specified class is an interface)

根本原因是绑定到参数名与绑定到参数类型中的属性是不同的逻辑,所以要把list作为成员才行。

如果是实体的话,可以通过反射获取到非常多的信息,但是参数就没那么简单了,所以这里要对这两种区别对待,简单类型直接绑定到参数名,复杂类型要写在实体中。

补充2:springmvc绑定实体时,是检测“.”符号。这个检查的代码在:

org.springframework.beans.AbstractPropertyAccessor的方法子类实现:org.springframework.beans.BeanWrapperImpl.setPropertyValue(String propertyName, Object value)中--

public void setPropertyValue(String propertyName, Object value) throws BeansException {
BeanWrapperImpl nestedBw;
try {
nestedBw = getBeanWrapperForPropertyPath(propertyName);
}
catch (NotReadablePropertyException ex) {
throw new NotWritablePropertyException(getRootClass(), this.nestedPath + propertyName,
"Nested property in path '" + propertyName + "' does not exist", ex);
}
PropertyTokenHolder tokens = getPropertyNameTokens(getFinalPath(nestedBw, propertyName));
nestedBw.setPropertyValue(tokens, new PropertyValue(propertyName, value));
}

nestedBw = getBeanWrapperForPropertyPath(propertyName);这一句--

protected BeanWrapperImpl getBeanWrapperForPropertyPath(String propertyPath) {
int pos = PropertyAccessorUtils.getFirstNestedPropertySeparatorIndex(propertyPath);
// Handle nested properties recursively.
if (pos > -1) {
String nestedProperty = propertyPath.substring(0, pos);
String nestedPath = propertyPath.substring(pos + 1);
BeanWrapperImpl nestedBw = getNestedBeanWrapper(nestedProperty);
return nestedBw.getBeanWrapperForPropertyPath(nestedPath);
}
else {
return this;
}
}

的int pos = PropertyAccessorUtils.getFirstNestedPropertySeparatorIndex(propertyPath);获取第一个属性分隔符,属性分隔符就是“.”。其中代码是这样的

private static int getNestedPropertySeparatorIndex(String propertyPath, boolean last) {
boolean inKey = false;
int length = propertyPath.length();
int i = (last ? length - 1 : 0);
while (last ? i >= 0 : i < length) {
switch (propertyPath.charAt(i)) {
case PropertyAccessor.PROPERTY_KEY_PREFIX_CHAR:  //"["
case PropertyAccessor.PROPERTY_KEY_SUFFIX_CHAR:  //"]"
inKey = !inKey;
break;
case PropertyAccessor.NESTED_PROPERTY_SEPARATOR_CHAR:  //"."
if (!inKey) {
return i;
}
}
if (last) {
i--;
}
else {
i++;
}
}
return -1;
}

默认的last为false,即从开始搜索。

所以要使springmvc可以绑定最开始方括号那种属性到实体中,只需要对上面那一段做处理就行了,检测有两对[]的话,把最后一对换为.符号即可。具体有没有别的影响我不确定。

SpringMVC绑定到实体数组、list、set、和map时要注意的更多相关文章

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

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

  2. JavaScript中的数组遍历forEach()与map()方法以及兼容写法

    原理: 高级浏览器支持forEach方法 语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是 ...

  3. go语言的 数组、slice、map使用(转)

    golang群 点击加入 go语言的 数组.slice.map使用, 由于网上有很好的说明, 不需要再写了,请看这几篇: Go语言中的 Array, Slice和 Map 深入学习golang五篇,以 ...

  4. 数组的方法 Array.map();Array.every()和Array.some();数组的indexof();检测是否是数组isArray(obj);

    数组的方法 Array.map(); 栗子: var a=[1,2,,3]; var b=a.map( function(value){return value*value} ); alert(b); ...

  5. struts2 传递数组、List、Map

    struts2 传递数组.List.Map jsp文件 数组:     <s:textfield name="ages" value="a1">&l ...

  6. Vue表单绑定(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  7. js和jquery中的遍历对象和数组(forEach,map,each)

    arr[].forEach(function(value,index,array){ //do something }) 参数:value数组中的当前项,index当前项的索引,array原始数组: ...

  8. springMVC对简单对象、Set、List、Map的数据绑定和常见问题.

    算了,就不粘贴了,到原文去查看吧! springMVC对简单对象.Set.List.Map的数据绑定和常见问题.

  9. java中将数组、对象、Map、List转换成JSON数据

    如果要将数组.对象.Map.List转换成JSON数据,那我们需要一些jar包: json-lib-2.4-jdk15.jar ezmorph-1.0.6.jar commons-logging.ja ...

随机推荐

  1. java链接FTP实现上传和下载

    FtpUtil.java import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStr ...

  2. xpath定位--绝对与相对的定位

    xpath定位--绝对与相对的定位: xpath定位即为xml路径语言,它是一种用来确定xml文档中某部分位置的语言,xpath基于xml的树状结构,提供在数据结构中找寻节点的能力 xpath的相对定 ...

  3. ispostback的使用

    如果form表单属性里没有 runat="server"就不能使用ispostback因为不会生成__viewstate隐藏域

  4. Python threading 单线程 timer重复调用函数

    项目中需要使用定时器,每次都使用构造器函数调用: timer = threading.Timer(timerFlag, upload_position) timer.start() 打印线程后发现,每 ...

  5. fragment Activity之间传值的方法 之------------接口回调

    首先  定义一个  回调接口 public interface FragmentCallBack { public void callbackFun1(Bundle arg); public void ...

  6. ViewPager欢迎界面

    一.几张图片组成欢迎界面 下方有几个点对应每个图片 当图片被选中时对应的点会变亮,当对应的点被点击时也会切换到指定画面 以下是代码 package com.example.viewpager_1; i ...

  7. dede5.7 GBK 在php5.4环境下 后台编辑器无法显示文章内容

    问题的原因是:是htmlspecialchars,PHP 5.4后GBK编码下默认不支持中文,转换后内容为空,UTF-8编码没有任何问题.   解决方法如下: 在\include\ckeditor\c ...

  8. MongoDB 3.0 Release Notes

    MongoDB 3.0支持WiredTiger存储引擎,提供可插拔存储引擎API,新增SCRAM-SHA-1认证机制,改进explain功能. 可插拔存储引擎API 允许第三方为MongoDB开发存储 ...

  9. Laravel 5 如何对部份 URI 禁用 CSRF 验证

    打开中间件 VerifyCsrfToken.php 在其 $except 属性中添加要禁用的 uri,如: api/user/add api/user/* api/*

  10. 5 个关键点!优化你的 UI 原型设计

    当你和你的团队着手开始一个产品开发的时候,最开始的一步一般是绘制线框图,这是大部分产品项目的第一步,它不复杂但是却对整个产品的完成形态和质量有着至关重要的作用. 很多刚开始工作设计师或者产品经理都会提 ...