由于jsf没有提供可用的datatable多选组件(页面上的复选框样式),所以在实际的应用中需要我们自己来处理这样的全选操作。一个比较间的做法就是改动值对象(或值对象的属性),添加一个Boolean类型的属性(checked),如下面的 Student 对象:
public class Test {
public String name;
public boolean checked;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
在jsp页面中的使用
<h:selectBooleanCheckbox value="#{student.checked}"/>
如下:
<h:dataTable var="student" value="#{studentBean.studentList}">
<h:column>
<f:facet name="header">
<h:outputText value="选择"/>
</f:facet>
<h:selectBooleanCheckbox value="#{student.checked>
<f:facet name="header">
<h:outputText value="name"/>
</f:facet>
<h:outputText value="#{student.name}"/>
</h:column>
</h:dataTable>
在studentBean中执行诸如 delete 等方法时循环判断 student对象的check属性:
public void deleteStudent(ActionEvent event){
for(int i=0;i<studentList.size();i++){
if (studentList.get(i).checked) {
studentManager.deleteStudent(studentList.get(i));
}
}
}
这种方法固然可用满足我们的需求,但同时我们也做了没没必要的操作(就是修改值对象 的属性,这不是一种好的方法。
今天看几个jboss seam 的例子,看到 dvdstore 的时候发现该示例演示的多选方案竟然与我用过的方案不谋而合,呵呵,其实也是一种很简单的实现。仍然以 Studen 对象来说明:
我可以在studentManger中添加一个Map<Student, Boolean> searchSelections 对象来完成页面上的多选功能:
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@DataModel
private List<Student> studentList;
@Out(scope=ScopeType.SESSION, required=false)
Map<Student, Boolean> searchSelections;
//初始值
@Factory("studentList")
public void initStudents() {
studentList = entityManager
.createQuery("select stu from Student stu").getResultList();
searchSelections = new HashMap<Student, Boolean>();
}
页面显示代码:
<h:dataTable var="stu" value="#{studentList}">
<h:column>
<f:facet name="header">
<h:outputText value="select"/>
</f:facet>
<h:selectBooleanCheckbox value="#{searchSelections[stu]}"/>
<f:facet name="header">
<h:outputText value="name"/>
</f:facet>
<h:outputText value="#{stu.name}"/>
</h:column>
</h:datatable>
studentManager 的删除操作:
public void deleteStudent(){
for (int i = 0; i < studentList.size(); i++) {
if(searchSelections.get(studentList.get(i))){
entityManager.remove(studentList.get(i));
}
}
}
这样做岂不是很简单,也没有破坏实体bean本身。
public class Test {
public String name;
public boolean checked;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isChecked() {
return checked;
}
public void setChecked(boolean checked) {
this.checked = checked;
}
}
在jsp页面中的使用
<h:selectBooleanCheckbox value="#{student.checked}"/>
如下:
<h:dataTable var="student" value="#{studentBean.studentList}">
<h:column>
<f:facet name="header">
<h:outputText value="选择"/>
</f:facet>
<h:selectBooleanCheckbox value="#{student.checked>
<f:facet name="header">
<h:outputText value="name"/>
</f:facet>
<h:outputText value="#{student.name}"/>
</h:column>
</h:dataTable>
在studentBean中执行诸如 delete 等方法时循环判断 student对象的check属性:
public void deleteStudent(ActionEvent event){
for(int i=0;i<studentList.size();i++){
if (studentList.get(i).checked) {
studentManager.deleteStudent(studentList.get(i));
}
}
}
这种方法固然可用满足我们的需求,但同时我们也做了没没必要的操作(就是修改值对象 的属性,这不是一种好的方法。
今天看几个jboss seam 的例子,看到 dvdstore 的时候发现该示例演示的多选方案竟然与我用过的方案不谋而合,呵呵,其实也是一种很简单的实现。仍然以 Studen 对象来说明:
我可以在studentManger中添加一个Map<Student, Boolean> searchSelections 对象来完成页面上的多选功能:
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
@DataModel
private List<Student> studentList;
@Out(scope=ScopeType.SESSION, required=false)
Map<Student, Boolean> searchSelections;
//初始值
@Factory("studentList")
public void initStudents() {
studentList = entityManager
.createQuery("select stu from Student stu").getResultList();
searchSelections = new HashMap<Student, Boolean>();
}
页面显示代码:
<h:dataTable var="stu" value="#{studentList}">
<h:column>
<f:facet name="header">
<h:outputText value="select"/>
</f:facet>
<h:selectBooleanCheckbox value="#{searchSelections[stu]}"/>
<f:facet name="header">
<h:outputText value="name"/>
</f:facet>
<h:outputText value="#{stu.name}"/>
</h:column>
</h:datatable>
studentManager 的删除操作:
public void deleteStudent(){
for (int i = 0; i < studentList.size(); i++) {
if(searchSelections.get(studentList.get(i))){
entityManager.remove(studentList.get(i));
}
}
}
这样做岂不是很简单,也没有破坏实体bean本身。