How to select multiple rows of <h:dataTable> with <h:selectBooleanCheckbox>

随声附和 提交于 2019-11-29 12:11:30

I assume that your entity is that well-designed that it has an unique technical identifier, for example the auto increment sequence from the DB.

public class Entity {

    private Long id;
    // ...
}

If not, you'll need to add it.

Then, add a Map<Long, Boolean> property to the bean which is tied to the table.

private Map<Long, Boolean> checked = new HashMap<Long, Boolean>();

(preinitialization can also happen in (post)constructor, take your pick, at least JSF won't do it for you; oh, give it a getter as well, a setter is not necessary)

Then, add a column with a checkbox which maps to the boolean value by entity ID as key.

<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}" />

Now, in the action method associated with the delete button, you can collect and delete the checked items as follows:

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();
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!