前阵子在使用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的设置的值自动选中里面的项.