5

richfaces datascroller で真のページネーションを行う方法を理解しようとしています。

現在、私のクエリはテーブルからすべてのデータを取得しています。データスクローラーの次のボタンをクリックすると、次の 20 行のデータベースがクエリされます。

行を制限するクエリを作成する方法は理解していますが、データスクローラーの次のボタンで特定のメソッドを呼び出す方法がわかりません。

多くの人が Richfaces フォーラムに潜在的な解決策を投稿しているように見えますが、それらはすべて dataModel を使用しています。私はORMを使用していないので、これらのソリューションを私が持っているものにどのように適合させることができるかわかりません。

どんな助けでも大歓迎です。

<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row">
    <rich:columns value="#{tableBacking.columns == null ? '' : tableBacking.columns}" var="columns" index="ind" id="column#{ind}" sortBy="#{results[ind].data}" rendered="#{tableBacking.columns != null}">
        <f:facet name="header">
            <h:outputText value="#{columns.columnDescription}" />
        </f:facet>

        <h:outputText value="#{results[ind].data}" />

    </rich:columns>

</rich:extendedDataTable>

<rich:datascroller for="resultsTable" page="#{tableBacking.page}" renderIfSinglePage="false" />

バッキングビーン

public class TableBacking {
    private List<List<TableData>> results = null;
    private int page = 0;

    public int getPage() {
    return page;
    }
    public void setPage(int page) {
    this.page = page;
    }
    public List<List<TableData>> getResults() throws Exception {
    return results;
    }
    public void setResults(List<List<TableData>> results) {
    this.results = results;
    }

    private void getData(String whereClause) {

    try {
    DataDao dd = new DataDao();
    results = dd.getData();    // dd.getData just runs a query on a table and puts the results in a List of lists.
    } catch (Exception e) {}
}
4

3 に答える 3

3

これを試してください:

JSFスタッフ:

 <rich:dataTable id="listTable" var="record" rows="10" value="#{personBean.data}">
   ....
   <f:facet name="footer">
      <rich:column colspan="8">
        <rich:dataScroller page="#{personBean.page}" for="listTable"
                scrollListener="#{personBean.scrollPage}" render="listTable" />
      </rich:column>
      Records  : #{personBean.data.size()}
   </f:facet>
 </rich:dataTable>

Java BackBean のもの:

public class PersonBean {
    // List of Persons
    private PagedList<Person> data;

    // Current page
    private Integer page;

    // Default rows to display
    private Integer rows = 10;

    // Persistence layer
    private DaoService daoService;

    @PostConstruct
    public void init(){
        page= 1;
    }

    // Event trigger on scroll page
    public void scrollPage(DataScrollEvent ev) {
        log.debug("Scroll event");
        reset();

        // getPersons execute 2 queries : the first query is the count(*) and the result is set in TotalElements 
        // the second query gets the 'n' records defined in rows , something like this  :
        //  select * from Persons  LIMIT page*rows, (page*rows) + rows and the result is set in Content
        Page<Person> pageResult = this.daoService.getPersons(filter, page - 1, rows);

        // Now create a pagedList with the constructor 
        this.data = new PagedList<Person>(pageResult.getContent(), (int) pageResult.getTotalElements(), this.pageSize);
    }
}

Java PagedList

public final class PagedList<E> extends AbstractList<E> {

    private final List<E> lista;
    private final int total;
    private final int pageSize;

    public PagedList(List<E> lista, int total, int pageSize) {
        this.lista = lista;
        this.total = total;
        this.pageSize = pageSize;
    }

    public int size() {
        return total;
    } 

    public E get(int i) {
        i = i % this.pageSize;
        return lista.get(i);
    }
}

トリックは、クラスの合計プロパティをデータベース内PagedListのカウントで設定し、リスト内のページ要素のみを設定することです。dataTablePageList

下手な英語でごめんなさい:P

于 2013-01-11T05:23:11.387 に答える
0

rich:extendedDataTableバッキング Bean の属性にバインドする必要があります。

ジャワ

private HtmlExtendedDataTable Table;
//Getter and setter

その後、ビューをバインドします

xhtml

<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row" binding="#{tableBacking.Table}">

RichfacesHtmlExtendedDataTableには、 と呼ばれる、ページごとに表示される行数を確認するメソッドがありますgetRows()。Bean が初期化されると、それに従って最初のページの値がロードされます (残りのページの要素の ID のみをロードし、後でページにアクセスするときに ID に基づいてそれらをロードできます)。

<rich:datascroller/>ページボタンがクリックされたときに発生するイベントもあり、次の方法でバッキング Bean から取得できます。

xhtml

 <f:facet name="footer">
<rich:datascroller id="ds"
                scrollerListener="#{tableBacking.actionOnPageChange}" />
</f:facet>

ジャワ

public String actionOnPageChange(DataScrollerEvent event)

これDataScrollerEventには、ユーザーがクリックしたページが含まれ、 を使用して取得できますgetNewScrolVal()。それが起こったら、対応するページの値をテーブルにロードするだけです。

于 2013-01-08T10:55:10.767 に答える
0

私が見つけた最善の解決策は、dataTable の「値」属性を org.richfaces.model.ExtendedTableDataModel プロパティにマッピングすることです。次に、org.richfaces.model.DataProvider のインスタンスで ExtendedTableDataModel を初期化します。サンプル:

ビューで:

<rich:dataTable id="table" value="#{bean.model}" rows="#{bean.rows}">
    <!-- columns -->
    <f:facet name="footer">
        <rich:dataScroller for="table"/>
    </f:facet>
</rich:dataTable>

ビーンで:

@ManagedBean
public class Bean {
    private int rows = 15; // the ammount of rows per page.
    private org.richfaces.model.ExtendedTableDataModel model = new org.richfaces.model.ExtendedTableDataModel(
        new org.richfaces.model.DataProvider(
        public int getRowCount() {
            // count your rows.
        }

        public List<T> getItemsByRange(int first, int quantity) {
            // fetch the page's rows. 
        }

        public T getItemByKey(Object o) {
            return null; // no need to implement this.
        }

        public Object getKey(T t) {
            return null; // no need to implement this.
        )
    );

    public int getRows() { return rows; }
    public ExtendedTableDataModel getModel() { return model; }

}
于 2015-04-15T21:30:23.767 に答える