在Spring启用的Velocity模板中绑定变量集合

时间:2011-08-15 20:10:51

标签: java spring collections binding velocity

假设我有一个Velocity 1.5模板的以下表格支持对象:

public class Bucket {

    String data1;
    String data2;
    String data3;
    String data4;

    // getters setters blah blah...
}

我想将这四个String属性绑定到以下四个下拉单选控件的java.util.Map中:

"a" : "1"
"b" : "2"
"c" : "3"
"d" : "4"

如果在我的页面控制器模型中,我将后备对象命名为“boData”,并且值map“labelKeys”,velocity可以为我绑定后备对象的属性:

#springFormSingleSelect( "boData.data1" $labelKeys "")
#springFormSingleSelect( "boData.data2" $labelKeys "")
#springFormSingleSelect( "boData.data3" $labelKeys "")
#springFormSingleSelect( "boData.data4" $labelKeys "")

但是,有没有办法避免四次调用#springFormSingleSelect?我的意思是,这里有一个模式,但我无法用Velocity的术语来表达它。

例如,如果我将类Bucket中的这四个String属性定义为Java数组或java.util.List,我怎么能告诉velocity我需要它来为每个元素绑定一个下拉单选控件在列表中?

public class Bucket {
    List<String> dataItems = new ArrayList<String>();
    // getter, setter...
}

感谢您提供的任何见解!

3 个答案:

答案 0 :(得分:4)

我不确定答案是否清楚。试着解释一下 Spring velocity binding需要整个路径作为#springBind的参数 因此,如果您有一个集合dataItems,则不能像

那样绑定
    #foreach($dataItem in $dataItems)
      #springFormSingleSelect( "dataItem.data1" $labelKeys "")
    #end

相反

    #set ($end = $dataItems.size() - 1)
    #foreach($i in [0..$end])
      #springFormSingleSelect( "dataItems[$i].data1" $labelKeys "")
    #end

这将绑定集合项。

答案 1 :(得分:0)

不确定我是否理解这个问题。 但似乎只需要一个foreach循环。 在Velocity中,如果能让你的生活更轻松,你也可以输入java。

但是你可以这样做:

#set ($map = $myobject.getMap() )
#foreach ($mapEntry in $map.entrySet())
     // $mapEntry.key
     // $mapEntry.value
    #springFormSingleSelect( "boData.data1" $mapEntry.key "")
#end

您可以对列表执行相同操作。

我希望这会有所帮助。的问候,

答案 2 :(得分:0)

怎么样:

#foreach($i in [1..4])
    #set($field = "boData.data" + $i)
    #springFormSingleSelect($field $labelKeys "")
#end