かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

PrimefacesのdataTableで遅延読み込み

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を継承してloadメソッドを実装するだけ。setRowCountでデータの総行数を指定するだけでとってもシンプル。

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>

実行するとこんな感じ。お手軽です。