RichFacesからPrimeFacesに浮気中。こいつも遅延読み込みできるのね。
表示するデータは、以下の単純なクラス。
package com.mycompany.richtest; import java.io.Serializable; public class Person implements Serializable { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
管理ビーンでは、LazyDataModel
package com.mycompany.richtest; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; import org.hibernate.validator.constraints.NotEmpty; import org.primefaces.model.LazyDataModel; import org.primefaces.model.SortMeta; import org.primefaces.model.SortOrder; @ManagedBean @ViewScoped public class IndexPage implements Serializable { private LazyDataModel<Person> model; @PostConstruct public void init() { this.model = new LazyDataModel<Person>() { @Override public List<Person> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, String> filters) { List<Person> l = new ArrayList<>(); for (int i = 0; i < pageSize; i++) { Person p = new Person(); p.setId(first + i); p.setName("田中 太郎" + p.getId()); l.add(p); } return l; } }; // データはとりえず10000行 model.setRowCount(10000); } public LazyDataModel<Person> getModel() { return model; } public void setModel(LazyDataModel<Person> model) { this.model = model; } }
JSFでは、p:dataTableにvar,value, rows, lazy, paginatorの属性を設定してやる。名前からなんとなく想像できますね
<?xml version='1.0' encoding='UTF-8' ?> <!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://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:form> <p:dataTable var="p" value="#{indexPage.model}" paginator="true" lazy="true" rows="15"> <p:column headerText="ID"> <h:outputText value="#{p.id}" /> </p:column> <p:column headerText="名前"> <h:outputText value="#{p.name}" /> </p:column> </p:dataTable> </h:form> </h:body> </html>