因为项目需要用到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来取出第二级下拉框的数据集合