如何在JSF中选择dataTable中的多行

如何在JSF中选择dataTable中的多行,jsf,Jsf,我在选择多行h:dataTable时遇到了一些问题。我的代码如下: <h:dataTable value="#{reportBean.lstchalan}" var="chalan" > <h:column > <f:facet name="header"> <h:outputText value="Select" /> </f:facet> <h:sel

我在选择多行
h:dataTable
时遇到了一些问题。我的代码如下:

<h:dataTable value="#{reportBean.lstchalan}"  var="chalan" >
 <h:column  >
      <f:facet name="header">
            <h:outputText value="Select" />
        </f:facet>
         <h:selectBooleanCheckbox value="#{reportBean.checked[chalan.issueNo]}" />

</h:column>  
...
</h:dataTable>
<h:commandButton value="submit" action="#{reportBean.submit()}" />    

...
下面是我的支持bean:

  public class ReportBean {
  List<ChalanVo> checkedItems = new ArrayList<ChalanVo>();
  private Map<String, Boolean> checked = new HashMap<String, Boolean>();
  ........
  public List<ChalanVo> getCheckedItems() {
    return checkedItems;
  }

  public void setCheckedItems(List<ChalanVo> checkedItems) {
    this.checkedItems = checkedItems;
 }
 public Map<String, Boolean> getChecked() {
    return checked;
 }

 public void setChecked(Map<String, Boolean> checked) {
    this.checked = checked;
 }
 public String submit() {


checkedItems = new ArrayList<ChalanVo>();
    for (ChalanVo dataItem : lstchalan) {
        if (checked.get(dataItem.getIssueNo())) {
            checkedItems.add(dataItem);
            checked.remove(dataItem.getIssueNo()); 
        }
    }}
}
公共类ReportBean{
List checkedItems=new ArrayList();
选中私有映射=新建HashMap();
........
公共列表getCheckedItems(){
返回支票;
}
public void setCheckedItems(列出checkedItems){
this.checkedItems=checkedItems;
}
公共地图getChecked(){
退货检查;
}
公共无效设置已选中(映射已选中){
this.checked=checked;
}
公共字符串提交(){
checkedItems=newarraylist();
用于(ChalanVo数据项:lstchalan){
if(选中.get(dataItem.getIssueNo())){
checkedItems.add(数据项);
选中。删除(dataItem.getIssueNo());
}
}}
}

但是当执行(ChalanVo dataItem:lstchalan)的行时,我得到一个异常。lstchalan给出的是空值。您能帮我理解我哪里做错了吗?

下面是一个有效的简化示例:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.faces.view.ViewScoped;
import javax.inject.Named;

@Named("test")
@ViewScoped
public class TestBean implements Serializable{

    private static final long serialVersionUID = -1064219566884774973L;

    private List<ChalanVo> lstChalans;
    private Map<ChalanVo, Boolean> checkedItems = new HashMap<TestBean.ChalanVo, Boolean>();

    public TestBean() {
        lstChalans = new ArrayList<TestBean.ChalanVo>();
        lstChalans.add(new ChalanVo("test1"));
        lstChalans.add(new ChalanVo("test2"));
        lstChalans.add(new ChalanVo("test3"));
    }

    public List<ChalanVo> getLstChalans() {
        return lstChalans;
    }

    public void setLstChalans(List<ChalanVo> lstChalans) {
        this.lstChalans = lstChalans;
    }

    public Map<ChalanVo, Boolean>  getCheckedItems() {
        return checkedItems;
    }

    public void setCheckedItems(Map<ChalanVo, Boolean>  checkedItems) {
        this.checkedItems = checkedItems;
    }

    public void save() {
        System.out.println("save");
        for (Entry<ChalanVo, Boolean> e : checkedItems.entrySet()) {
            if (e.getValue()) {
                System.out.println("checked: " + e.getKey().getIssueNo());
            }
        }
    }

    public class ChalanVo {
        private String issueNo;

        public ChalanVo(String issueNo) {
            setIssueNo(issueNo);
        }

        public String getIssueNo() {
            return issueNo;
        }

        public void setIssueNo(String issueNo) {
            this.issueNo = issueNo;
        }
    }
}
import java.io.Serializable;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入javax.faces.view.ViewScoped;
导入javax.inject.Named;
@命名(“测试”)
@视域
公共类TestBean实现了可序列化{
私有静态最终长serialVersionUID=-1064219566884774973L;
私人名单;
私有映射checkedItems=newhashmap();
公共TestBean(){
lstChalans=newarraylist();
添加(新的ChalanVo(“test1”));
添加(新的ChalanVo(“test2”));
添加(新的ChalanVo(“test3”));
}
公共列表getLstChalans(){
返回伊斯特查兰;
}
公共无效集合集合集合(列表集合集合){
this.lstChalans=lstChalans;
}
公共地图getCheckedItems(){
返回支票;
}
公共void setCheckedItems(映射checkedItems){
this.checkedItems=checkedItems;
}
公共作废保存(){
System.out.println(“保存”);
对于(条目e:checkedItems.entrySet()){
if(如getValue()){
System.out.println(“选中:+e.getKey().getIssueNo());
}
}
}
公共级查兰沃{
私有字符串issueNo;
公共沙兰窝(字符串issueNo){
setIssueNo(issueNo);
}
公共字符串getIssueNo(){
退换货问题;
}
public void setIssueNo(字符串issueNo){
this.issueNo=issueNo;
}
}
}
使用此xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core">
<h:head />
<h:body>
        <h:form>
            <h:dataTable value="#{test.lstChalans}" var="chalan">
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Select" />
                    </f:facet>
                    <h:selectBooleanCheckbox value="#{test.checkedItems[chalan]}"  />
                </h:column>
                <h:column>
                    <f:facet name="header">
                        <h:outputText value="Issue No" />
                    </f:facet>
                    <h:outputText value="#{chalan.issueNo}"/>
                </h:column>
            </h:dataTable>

            <h:commandButton action="#{test.save()}" value="Submit" />
        </h:form>
</h:body>
</html>


save()方法可以列出所选项目。我认为你的NullPointerException与复选框无关。但是无论如何,您可以这样做选择。

在这里发布的代码中,lstchalan变量没有在任何地方声明,因此很难说它为什么为null。lstchalan是在ReportBean中声明的。它包含xhtml页面中显示的表数据。但当我从dataTable中选择数据时,我面临着一个问题。A总是很好创建的!我使用以下链接进行多行选择。我还向ChalanVo类添加了布尔检查。但是lstchalan在我的支持bean中为null。然后请发布完整的代码,在那里我们可以看到lstchalan是如何初始化/更改的。