因为项目需要用到doubleselect, 查了下资料, 比较含糊, 最后还是在实际运用中摸索出来. 在此小记一篇以做备用
doubleselect算是Struts2中稍微复杂点的表单标签, 尤其官方示例比较简单, 没有太大的实用价值.
<s:doubleselect label="doubleselect test2" name="menu" list="#{'fruit':'Nice Fruits', 'other':'Other Dishes'}" doubleName="dishes" doubleList="top == 'fruit' ? {'apple', 'orange'} : {'monkey', 'chicken'}" />
从这个官方示例中可以看到基本用法, list开头的代表的是第一级下拉框的属性, doubleList开头的则是第二级下拉框. 与select标签的属性基本是对应的.
在实际应用中, 我们比较关注的就是list和doubleList这两个属性了, list是存放的第一级下拉框的数据集合, 比如List<DataBean>, 而doubleList就可以用Map<String, List<DataBean>>来存储, 其中map的键名String与第一级下拉框相关联.
例:
两个DataBean
public class Father { int id; String name; //getter and setter }
public class Son { int id; String name; int fatherId; //getter and setter }
Action:
public class DemoAction { private List<Father> fatherList; private Map<Integer, List<Son>> sonMap; public String execute() throws Exception { fatherList= new ArrayList<Father>(); Father father; father= new Father(); father.setId(1); father.setName("Test"); fatherList.add(father); father = new Category(); father.setId(2); father.setName("Test2"); fatherList.add(father); sonMap = new HashMap<Integer, List<Son>>(); List<Son> sonList = new ArrayList<Son>(); Son son; son= new Book(); son.setId(1); son.setName("SonTest"); son.setFatherId(1); sonList.add(son); son= new Book(); son.setId(2); son.setName("SonTest2"); son.setFatherId(1); sonList.add(son); sonMap.put(1, sonList); sonList = new ArrayList<Son>(); son= new Book(); son.setId(3); son.setName("SonTest3"); son.setFatherId(2); sonList.add(son); son= new Book(); son.setId(4); son.setName("SonTest4"); son.setFatherId(2); sonList.add(son); sonMap.put(2, sonList); return SUCCESS; } // getter and setter.. }
JSP:
<s:doubleselect list="fatherList" listKey="id" listValue="name" doubleName="sonId" doubleList="sonMap.get(top.id)" doubleListKey="id" doubleListValue="name" theme="simple"/>
此处要注意的是top的用法,top代表的就是list当前选中的对象, 所以top.id对应的就是当前选中的Fahter对象中的ID, sonMap.get(top.id)即根据当前选中的Fahter对象中的ID来取出第二级下拉框的数据集合