かとじゅんの技術日誌

技術の話をするところ

Teedaでもページングするには

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でもページングが可能になるはずです.