如何使用<h:selectBooleanCheckbox>选择多行<h:dataTable>

xua*_*401 2 datatable jsf multipleselection selectbooleancheckbox

<h:dataTable>用来列出数据库中的数据.我们在页面中有很多记录,现在我想选择多行记录,每行都有一个复选框.我怎样才能做到这一点?

Bal*_*usC 6

我假设您的实体经过精心设计,具有唯一的技术标识符,例如来自DB的自动增量序列.

public class Entity {

    private Long id;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果没有,您需要添加它.

然后,将Map<Long, Boolean>属性添加到绑定到表的bean.

private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();
Run Code Online (Sandbox Code Playgroud)

(preinitialization也可以在(post)构造函数中发生,请你选择,至少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}" />
Run Code Online (Sandbox Code Playgroud)

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

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();
}
Run Code Online (Sandbox Code Playgroud)