假设我的模型字段是Strings到字符串的字符串的HashMap。
HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
对于字段绑定,我需要指向JSP中特定键的ArrayList的第i项。我该怎么做?这种双括号表示法有效吗?假设'key'和'index'是我JSP中已知的JSTL变量。
<form:checkbox path="map[${key}][${index}]" />
我实际上做的是,对于字段值,存储其路径,例如
map['testkey'][4]
指向
map.get("testkey").get(4);
这不起作用:
org.springframework.beans.NullValueInNestedPathException: Invalid property 'map[TestKey][0]'
注意根据此(Binding a map of lists in Spring MVC),这将是一个问题,因为子对象不可自动增长,我需要实现一个LazyList或可增长的列表?对于Spring MVC的表单,ArrayList本身是可增长的,但是当用作子集合时,它不是吗?非常棘手。
答案 0 :(得分:0)
我通过上面链接中的LazyList / LazySet实现解决了这个问题, Binding a map of lists in Spring MVC
从他们的例子中,
public class PrsData {
private Map<String, List<PrsCDData>> prsCDData;
public PrsData() {
this.prsCDData = MapUtils.lazyMap(new HashMap<String,List<Object>>(), new Factory() {
public Object create() {
return LazyList.decorate(new ArrayList<PrsCDData>(),
FactoryUtils.instantiateFactory(PrsCDData.class));
}
});
}
}
一旦我有一个映射到我的JSP路径的数据结构,字段绑定就会神奇地开始工作,然后我可以创建我的路径,例如JSP中的map["key"][index]
。
正如他们回答的那样,SpringMVC会将简单列表和地图自动转换为Lazy集合,但当集合是子对象时,不会这样做。