Jsf 如何选择多行<;h:数据表>;与<;h:选择布尔复选框>;

Jsf 如何选择多行<;h:数据表>;与<;h:选择布尔复选框>;,jsf,datatable,multipleselection,selectbooleancheckbox,Jsf,Datatable,Multipleselection,Selectbooleancheckbox,我使用列出数据库中的数据。我们在页面中有很多记录,现在我想选择多个记录,每行都有一个复选框。如何实现这一点?我假设您的实体设计得非常好,它具有唯一的技术标识符,例如数据库中的自动递增序列 public class Entity { private Long id; // ... } 如果没有,您需要添加它 然后,向绑定到表的bean添加Map属性 private Map<Long, Boolean> checked = new HashMap<Long, B

我使用
列出数据库中的数据。我们在页面中有很多记录,现在我想选择多个记录,每行都有一个复选框。如何实现这一点?

我假设您的实体设计得非常好,它具有唯一的技术标识符,例如数据库中的自动递增序列

public class Entity {

    private Long id;
    // ...
}
如果没有,您需要添加它

然后,向绑定到表的bean添加
Map
属性

private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();
private Map checked=new HashMap();
(预初始化也可以发生在(后)构造函数中,你可以选择,至少JSF不会为你做;哦,给它一个getter,setter是不必要的)

然后,添加带有复选框的列,该复选框通过实体ID作为键映射到布尔值

<h:dataTable value="#{bean.entities}" var="entity">
    <h:column>
        <h:selectBooleanCheckbox value="#{bean.checked[entity.id]}" />
    </h:column>
    ...
</h:dataTable>
<h:commandButton value="Delete" action="#{bean.delete}" />

...
现在,在与“删除”按钮关联的操作方法中,您可以按如下方式收集和删除选中的项目:

public void delete() {
    List<Entity> entitiesToDelete = new ArrayList<Entity>();

    for (Entity entity : entities) {
        if (checked.get(entity.getId())) {
            entitiesToDelete.add(entity);
        }
    }

    entityService.delete(entitiesToDelete);
    checked.clear();
    loadEntities();
}
public void delete(){
List entitiesToDelete=new ArrayList();
for(实体:实体){
if(checked.get(entity.getId())){
entitiesToDelete.add(实体);
}
}
entityService.delete(EntitysToDelete);
选中。清除();
加载实体();
}

我有完全相同的代码,但我在这一行得到一个NullPointerException
如果(checked.get(entity.getId()){
可能重复的