现在的位置: 首页 > 综合 > 正文

JSF如何实现列表多选

2013年10月05日 ⁄ 综合 ⁄ 共 3402字 ⁄ 字号 评论关闭

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;
   }
   ------------------------------------------------
  
欢迎添加评论或来信交流。 

抱歉!评论已关闭.