前阵子在使用struts2的checkboxlist,遇到不会默认选中的问题,花了不少时间,终于解决了.现在把它记录下来.
项目里面有两个实体对象 Lace(花边) 和Tag(标签,花边属性),关系是 n v n.即一个花边对象可以有多个花边属性,一个花边属性可以被多个花边所拥有.代码如下:
public
class
Lace
...
{ private Integer id; private String name; private List < Tag > tags; // ...省略其他属性及其getter和setter }
public
class
Tag
...
{ private Integer id; private String name; private List < Lace > laces; // ...省略其他属性及其getter和setter }
当时要做的一个功能是编辑或新建一个Lace对象时可以使用chekbox选中Tag,并将这些属性保存到Lace对象的tags集合里面.
Action的代码如下:
public
class
LaceAction
extends
ActionSupport
...
{ // Tag集合. private List < Tag > tags; // 当前选中(或当前编辑的Lace对象)的所有Tag的id. private Integer[] selectTagIds; // 当前编辑的Lace对象 private Lace lace; // ..省略其他代码和getter和setter public String load() throws Exception ... { if (id != null ) ... { / / 获取当前编辑的Lace对象 setLace(laceService.getLaceById(id)); // 设置当前选中的Tag, if (lace.getTags().size() > 0 ) ... { selectTagIds = new Integer[lace.getTags().size()]; for ( int i = 0 ; i < this .lace.getTags().size(); i ++ ) ... { selectTagIds[i] = lace.getTags().get(i).getId(); } } } return SUCCESS; } public String save() throws Exception ... { List < Tag > laceTags = lace.getTags(); // 设置花边属性 if (selectTagIds != null ) ... { for (Integer tagId : selectTagIds) ... { Tag t = laceService.getTagById(tagId)); if ( ! laceTags.contains(t)) lace.getTags().add(t); } } laceService.saveLace(lace); return SUCCESS; }
页面的代码:
< s:checkboxlist name = "selectTagIds" list = "tags" listKey = "id" listValue = "name" />
这里要说明一下,selectTagIds 为Action里面的一个Integer[] ,用来存放当前用户选中的chekbox的key值,这样当编辑的时候,action为selectTagIds设置了当前编辑的lace对象的tag集合的所有id, checkboxlist 会根据 selectTagIds的设置的值自动选中里面的项.