S2JSFからTeedaに移行してからは,大量データを表示する際はGridを使うとよいということは分かっているのですが,顧客からこれまでの方式の,”前の?件”,”次の?件”でページングしてほしいと要求されるときがあります.
今回,Teedaでページングのやりかたについていろいろ調べたので,下記に示します.(以下の説明には,jdbc.diconとdao.diconをS2Pager用にカスタマイズする内容は含まれていません.S2Pagerのドキュメントを参考にしてください)
簡単にいえば,Gridを使わずに,ForeachをベースにS2PagerのPagerViewHelperの助けをかります.このあたりはS2JSFの時代と変わりません.
まず,HTMLファイルを用意
最初のtableがページングの操作ができるボタン類です.
userInfoList.html
<form id="usreInfoListForm"> <table width="100%"> <tr> <td> <div id="isPrev"> <input type="button" id="doPrev" value="前のxx件"/> <input type="hidden" id="prevOffset"/> </div> </td> <td> <div style="text-align: center;"> 総件数 : <span id="count">1000</span>件 </div> </td> <td> <div id="isNext" style="text-align: right;"> <input type="button" id="doNext" value="次のxx件"/> <input type="hidden" id="nextOffset"/> </div> </td> </tr> </table> <table border="1" width="100%"> <tr> <th>ユーザID</th> <th>ユーザ名</th> </tr> <div id="userInfoItems"> <tr> <td><span id="userId"/></td> <td><span id="username"/></td> </tr> </div> </table> </form>
ページクラスを実装
ここで注意するのは,setPrevOffsetやsetNextOffsetでoffsetに値をセットしている部分.これがないとprerenderで正しいオフセットを指定して検索できません.
UserInfoListPage.java
public class UserInfoListPage { private UserInfoDao userInfoDao; private List<UserInfo> userInfoItems; // カレントオフセット private int offset; // ページング用 private PagerViewHelper userInfoPagerViewHelper; // セッションで管理 private UserInfoCondition userInfoCondition; // setter,getter 省略 public boolean isNext() { return userInfoPagerViewHelper.isNext(); } public boolean isPrev() { return userInfoPagerViewHelper.isPrev(); } public int getPrevOffset(){ return userInfoPagerViewHelper.getPrevOffset(); } public void setPrevOffset(int prevOffset){ this.offset = prevOffset; } public int getNextOffset(){ return userInfoPagerViewHelper.getNextOffset(); } public void setNextOffset(int nextOffset){ this.offset = nextOffset; } // DynamicPropertyでボタンのキャプションを変更 public String getDoPrevValue() { int limit = this.userInfoCondition.getLimit(); return "前の" + limit + "件へ"; } // DynamicPropertyでボタンのキャプションを変更 public String getDoNextValue() { int limit = this.userInfoCondition.getLimit(); return "次の" + limit + "件へ"; } // 総件数を返す public int getCount() { return this.userInfoCondition.getCount(); } public String doNext() { return null; } public String doPrev() { return null; } public String prerender(){ // 新しいオフセットで検索 this.userInfoCondition.setOffset(this.offset); this.userInfoCondition . setUserName ("%S2Pager%"); List<UserInfo> userInfoItems = this.userInfoDao .selectByCondition(this.userInfoCondition); this.setUserInfoItems(userInfoItems); } }
diconファイルにuserInfoCondition, userInfoPagerViewHelperを登録する
hogehogeの部分はルートパッケージ名になります.
ちなみに,この二つのコンポーネントだけは,SMART deploy環境下に登録する方法が思いつかなかったのですが,どなたか何か手立てがあれば教えてください.
app.dicon
<component name="userInfoCondition" class="hogehoge.condition.UserInfoCondition" instance="session"/> <component name="userInfoPagerViewHelper" class="org.seasar.dao.pager.PagerViewHelper" instance="request"> <arg>userInfoCondition</arg> </component>
と,するとTeedaでもページングが可能になるはずです.