JSF如何实现列表多选
一、前言
一般的教材都会教你如何使用DataModel实现列表显示与选中其中某一行。
但是教导多选的例子却不多。下面我将会描述如何通过改写值对象来实现
列表多选。
二、使用DataModel对列表的控制
DataModel有以下几种实现:
* ArrayDataModel
* ListDataModel
* ResultDataModel
* ResultSetDataModel
* ScalarDataModel
我们比较常用的是ListDataModel. 下面的代码展示了如何把List转化为DataModel.
------------------------------------------------
public class TypeAllList extends BasePage {
private DataModel typeallModel;
private TypeAllManager typeAllManager;
public void setTypeAllManager(TypeAllManager typeAllManager) {
this.typeAllManager = typeAllManager;
}
public DataModel getTypeallModel(){
if (this.typeallModel==null) {
typeallModel = new ListDataModel();
//注:this.typeAllManager.getTypeAllList()返回的是List类型
typeallModel.setWrappedData(this.typeAllManager.getTypeAllList());
}
return typeallModel;
}
public String select() {
int rowIndex = typeallModel.getRowIndex();
OaTypeall obj = (OaTypeall)typeallModel.getRowData();
//打印出来检查选中
log.debug(rowIndex);
log.debug(obj.toString());
//do something...
return "success";
}
...
}
------------------------------------------------
在页面上使用的代码如下:
------------------------------------------------
<h:dataTable var="e" value="#{typeallList.typeallModel }">
<f:facet name="header"><h:outputText value="#{text['typeall.typelist'] }"/>
</f:facet>
<h:column>
<f:facet name="header"><h:outputText value="#{text['typeall.typename'] }"/></f:facet>
<h:outputText value="#{e.typename }"></h:outputText>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="#{text['typeall.typeid'] }"/></f:facet>
<h:commandLink action="#{typeallList.select }">
<h:outputText value="#{e.typeid }"></h:outputText>
</h:commandLink>
</h:column>
...
</h:dataTable>
------------------------------------------------
点击#{e.typeid }链接之后,将会执行select()方法,你可在在该方法检查选中的值。
三、实现多选
上面所讲的只实现了单选。如果我们要实现对列表任意行进行选择,提交之后判断选中
的行,再进行几种处理,应该怎么做呢?
如:
选中 ID 值标题
[√] S 成功
[ ] A 申请中
[√] M 维修中
[√] L 缺货
[ ] A 申请中
[√] N 正常
[ ] D 分发中
[“全部删除”]
当点击[“全部删除”]按钮要实现把选中的"SMLN"项都删除.
3.1 改写值对象,或者改写值对象的基类
------------------------------------------------
public abstract class BaseObject implements Serializable {
private boolean checked;
public void setChecked(boolean value) {
this.checked = value;
}
public boolean isChecked(){
return this.checked;
}
...
}
public class OaTypeall extends BaseObject implements Serializable {
...
}
------------------------------------------------
3.2 在页面上使用的代码如下,增加#{e.checked}复选框:
<h:dataTable var="e" value="#{typeallList.typeallModel }">
<f:facet name="header"><h:outputText value="#{text['typeall.typelist'] }"/>
</f:facet>
<h:column>
<f:facet name="header"><h:outputText value="#{text['list.checkall'] }"/></f:facet>
<h:selectBooleanCheckbox value="#{e.checked}" />
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="#{text['typeall.typename'] }"/></f:facet>
<h:outputText value="#{e.typename }"></h:outputText>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="#{text['typeall.typeid'] }"/></f:facet>
<h:commandLink action="#{typeallList.select }">
<h:outputText value="#{e.typeid }"></h:outputText>
</h:commandLink>
</h:column>
...
<h:commandButtion value="“全部删除”" action="#{typeallList.removeChecked}"/>
</h:dataTable>
点击[“全部删除”]按钮提交执行:
public String removeChecked(){
List tempList = typeallModel.getWrappedObject();
for (int i=0;i<tempList.size();i++){
OaTypeall obj=(OaTypeall)tempList.get(i);
if (obj.isChecked()) {
//删除obj
}
return null;
}
------------------------------------------------
欢迎添加评论或来信交流。