本文主要讲解selectManyCheckbox在渲染初始化的时候如何默认勾选部分checkBox。
网络上JSF组件的知识太少了,被selectManyCheckbox默认勾选的情况搞死了,浪费大半天时间才想明白它的工作原理。
组件源码如下:
<h:selectManyCheckbox value="#{CarouselBackingBean.cityExistList}" id ="cityRelatedList">
<c:forEach items="#{CarouselBackingBean.cityModifyList}" var="city">
<f:selectItem itemLabel="#{city.adminDivisionCnNm}" itemValue="#{city.adminDivisionCd}" itemDisabled="#{city.validIn}"/>
</c:forEach>
</h:selectManyCheckbox >
因为用的是公司的开发框架,部分和JSF标准不太一致,但是原理都是相通的。
cityModifyList中的实体类的属性和组成不重要,重要的是理解一下两点:
1.通过代码
<c:forEach items="#{CarouselBackingBean.cityModifyList}" var="city">
<f:selectItem itemLabel="#{city.adminDivisionCnNm}" itemValue="#{city.adminDivisionCd}" itemDisabled="#{city.validIn}"/>
</c:forEach>
生成的标准JSF代码:
<f:selectItem itemValue="1" itemLabel="Item 1" itemDisabled ="true" />
<f:selectItem itemValue="2" itemLabel="Item 2" itemDisabled ="false" />
2.所有selectManyCheckbox中勾选的结果存储在 CarouselBackingBean.cityExistList 中,数据结构与cityExistList 如何定义的完全没有一丝关系。JSF将它强制设定为List<String>类型。
3.每勾选一个checkBox,cityExistList 都会size+1,多一个成员;取消勾选则少一个。
明白以上几点相信大家知道如何解决这个问题。
标准做法如下:
该组件渲染时,在cityExistList中插入需要默认勾选的所有的itemValue。
范例:
我们要勾选
<f:selectItem itemValue="1" itemLabel="Item 1" itemDisabled ="true" />
这个checkBox,则cityExistList中add一个String类型“1”即可。
附上JSF组件教程 http://www.tutorialspoint.com/jsf/jsf_selectmanycheckbox_tag.htm