検索結果の一覧をDataTableで表示して、一覧の行からリンクして別情報へ飛んで、再び検索結果一覧の画面に戻った時、前に検索した状態で一覧を復元して欲しいという要件があったとします。
検索画面のBackingBeanをSessionScopeで保持という技もあるかもしれませんが、検索結果のDataTableをずっと保持し続けるのは好ましくないかと思います。
1つの方法としては、検索条件などの情報だけをSessionScopeなインスタンスに格納しておいて、戻ってきたときの画面表示時に復元して、再検索させるなどが(性能的に問題がなければ)あるかなと。
で、検索自体はそれでクリアできたとして、ユーザが選択していた一覧表示件数やページ番号も復元できるのか?気になる所です。
一応試してみて動いたのでメモ。
一覧表示件数
一覧表示件数といっているのは、ドロップダウンで選択された数値のことです。
下図の場合は10です。
これはPrimeFacesのDataTableが持つ属性「rows」を使えば割と簡単に実装できます。
単に
<p:dataTable id="hogehoge" rows="#{backingBean.rowCnt}" />
と通常通りEL式で紐づけておいて、復元した際にBackingBeanのプログラムでrowCnt変数を復元(SessionScopeなインスタンスから取り出して)すればOKです。
ページ
問題はページ番号ですね。少しわかりにくいですが、下図ではページングで3ページある状態で、2 of 3、つまり2ページ目にいる状態です。下図では2が赤っぽくなっています。
PrimeFacesのドキュメントみても、選択されたページを示すような属性はなく、うーむ困ったなと思っていたのですが、プログラムでDataTableを取得すると、ページのインデックスを取得するメソッド(getPage())があって、値を取ることができました。
当たり前かもしれませんが、コンポーネントをプログラムで取得するとJSFの属性ではみえないものが色々見える(^^)/
DataTable dtHoge = (DataTable)findComponent(":formId:dataTableId");
int nowPage = dtHoge.getPage();
あとはこれを復元時にセットすればいける!と思ったら「setPage」がない…orz
えーーー。
どうすれば…と思っていたのですが、属性に「first」という表示する最初のデータを示す属性があって、これと一覧表示件数を上手く使えば、ページを復元できました。
DataTable dtHoge = (DataTable)findComponent(":formId:dataTableId");
int first = nowPage * rowCnt;
dtHoge.setFirst(first);
ふぅ。
プログラムでコンポーネントのインスタンスを取得して色々できることを覚えてしまうと
(気を付けて使わないと)なんか危なっかしいし、色々気を付けながら使いたい所です。