在JSP中,Field Path使用HashMap <string,arraylist <string>&gt; (SpringMVC表格)

时间:2016-01-05 20:59:10

标签: spring jsp spring-mvc

假设我的模型字段是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本身是可增长的,但是当用作子集合时,它不是吗?非常棘手。

1 个答案:

答案 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集合,但当集合是子对象时,会这样做。