S2Daoを使わないList,Colllecitonに対するページングサンプルS2PagerとはS2Daoを使ってページングをを実現する機能です。S2Daoで検索した結果に対して、開始位置と最大取得件数を指定して結果の一部のみを取得することができます。これにより、Googleの検索結果のように、大量の検索結果をページ単位で表示することが可能になります。S2Dao1.0.31よりS2Dao本体に同梱されて配布されるようになりました。1.0.31以降のバージョンではS2DaoのJARファイルのみでS2Pagerを使用することができます。S2Pagerの使い方S2Pagerを使用するには次の手順に従ってください。ページングの方法を選択します。ページングの方法として次の3つが用意されています。選択する方法に合わせてj2ee.dicon(Seasar2.4を利用の場合はjdbc.dicon)の設定を変更してください。DBMSにより使用できる方法が限られます。ResultSetの機能を使用する方法(すべてのDBMSで利用可)Limit/Offset句を使用する方法(MySQLやPostgresSQLなどLimit/Offset句をサポートしたDBMSで利用可)ROWNUMを使用する方法(Oracleでのみ利用可)検索条件に利用するDTOを作成します。このDTOはorg.seasar.dao.pager.PagerConditionインターフェイスをimplementsする必要があります。DTOにはS2Pager用のプロパティ(offset、limit、count)と、WHERE句に含める検索条件となるプロパティを保持してください。offset、limit、countのプロパティがあらかじめ実装されたorg.seasar.dao.pager.DefaultPagerConditionを継承して作成するのがよいでしょう。次のコードはDTOの作成例です。}}Daoのメソッドを定義します。上記で作成したDTOをパラメータとして受け取るメソッドをDaoに定義します。次のコードはDaoの作成例です。dto);}開始位置(offset)と最大取得数(limit)をセットしてDaoのメソッドを呼び出します。次のコードはDaoのメソッドの呼び出し例です。使用するページングの方法ごとにj2ee.dicon(Seasar2.4を利用の場合はjdbc.dicon)を変更する必要があります。ResultSetの機能を使用する方法(すべてのDBMSで利用可)ResultSetのスクロール可能カーソル、もしくは空回しを使用することでページングを実現する方法です。S2Daoの配布ファイルに含まれるj2ee.dicon(Seasar2.4を利用の場合はjdbc.dicon)ではこの方法を使用するための設定があらかじめ有効になっています。したがって設定を変更しない限りこの方法が使用されます。スクロール可能カーソルのON/OFFスクロール可能カーソルを使用することで、大量データ検索時のパフォーマンスが向上します。DBやJDBCドライバの実装によっては、スクロール可能カーソルが使用できない場合があります。その場合、上記のuseScrollCursorプロパティにfalseを指定してください。ResultSetの空回しによりカーソルの移動が行われるようになります。Limit/Offset句を使用する方法(MySQLやPostgresSQLなどLimit/Offset句をサポートしたDBMSで利用可)DBMSのLimit/Offset句を使用する方法です。この方法には推奨の設定と非推奨の2つ設定方法があります。非推奨の方法は1.0.45以前のバージョンとの互換性のためにあります。非推奨の設定方法を使用した場合の問題点には次の2点があります。PreparedStatementが開放されない実際には実行されないSQLがログ出力されるj2ee.diconの設定:LimitOffsetPagingSqlRewriterを使う場合(推奨)この設定を有効にするには、他のページング用の設定はコメントアウトしてください。--></component>...j2ee.diconの設定:PagerResultSetFactoryLimitOffsetWrapperを使う場合(非推奨)この設定を有効にするには、他のページング用の設定はコメントアウトしてください。--></component>...PagerResultSetFactoryLimitOffsetWrapperを使った場合に動作確認ができているJDBCドライバの種類とバージョンは次の表のとおりです。limitを使用する場合、MySQLはサブクエリーを使えるバージョン(4.1.x以降?)が必要になります。接続文字列にオプション「protocolVersion=2」を付ける必要があります。ンと比べ、型などについての挙動がかなり異なる為、オプション「protocolVersion=2」を付けて利用します。S2Pagerは動作しません。DEPTNO」というSQLが次のように書き換えられて実行されます。55ROWNUMを使用する方法(Oracleでのみ利用可)OracleのROWNUMを使用する方法です。j2ee.diconの設定この設定を有効にするには、他のページング用の設定はコメントアウトしてください。DEPTNO」というSQLが次のように書き換えられて実行されます(見やすくするために改行を加えています)。S2DAO_ROWNUMBERS2Pagerのユーティリティクラス群S2Pagerにはデータベースアクセスとは離れたレイヤでページングをサポートするいくつかのユーティリティクラスを持ちます。これらのクラスの使用例はサンプルに含まれています。セッションへの検索条件の格納をサポート通常、検索条件オブジェクトはHttpSessionのアトリビュートに格納します。ユーティリィ的なクラスとしてorg.seasar.dao.pager.PagerSupportクラスを用意しています。PagerConditionのlimitに使用されます。セッション中に条件保持DTOが存在しかった場合、ここで指定したクラスの検索条件DTOが生成されます。セッションの属性名を指定します。ここで指定した名前で検索条件DTOがセッション中に格納されます。"categoryPagerCondition");セッション中の検索条件DTOの取得開始位置(offset)の更新は、パラメータ名"offset"が取得開始位置を意味する場合次のコードで可能です。pager.updateOffset(request);また、任意のパラメータ名で更新をしたい場合、次のようなコードになります。"hoge");セッション中の検索条件DTOを取得するには、次のようなコードになります。渡されたクラスが新規に作成されます。pager.getPagerCondition(request);以上のPagerSupportの使い方をまとめると、次のようなコードになります。PagerSupportはスレッドセーフです。複数ユーザで共有して安全に使用することができます。最大取得数(limit)をユーザごとに切り替えたい場合は、PagerSupport自体をセッションに格納するなど工夫が必要でしょう。渡されたクラスが新規に作成されます。ビューの作成を助けるS2Pagerではページリンクを表示するビューの部品は用意していません。これは、ページリンクの表示形式は、プロジェクトによって異なるためです。サンプルは用意しています。サンプルではJSTL版とJSP2.0のタグファイルによるページリンクの2パターンがあります。カスタムタグでのサンプルはありません。org.seasar.dao.pager.PagerViewHelperクラスがあります。PagerViewHelperクラスを使うとビューで(特にJSTLのELやVelocityで)ページリンクを作成するのが楽になります。PagerViewHelperは以下のメソッドを持っています。ページャのビューヘルパークラスです。前へのリンクが表示できるかどうかを判定します。次へのリンクが表示できるかどうかを判定します。現在表示中の一覧の最後のoffsetを取得します。次へリンクのoffsetを返します。前へリンクのoffsetを返します。現在ページのインデックスを返します。現在ページのカウント(インデックス+1)を返します。最終ページのインデックスを返します。ページリンクの表示上限を元に、ページ番号リンクの表示開始位置を返します。ページリンクの表示上限を元に、ページ番号リンクの表示終了位置を返します。}以下はサンプルにあるJSTLによるページリンクの実装例です。S2Daoを使わないList,Colllecitonに対するページングS2Daoを使わないList,Colllecitonに対してページングを行いたいときはPagerUtil#filterを使用します。35サンプルS2PagerのサンプルはJSP2.0で動作します。以下の手順でTomcat5.0.xなどJSP2.0をサポートするServletコンテナ上で動作させる必要があります。s2-dao-pager-examples-x.x.x.zipを展開し、s2dao-pager-examples.warをTomcat5.0.xのwebappsディレクトリに配置します。Tomcat5.0.xを起動します。http://localhost:8080/s2dao-pager-examples/をブラウザで開きます。(Tomcatが8080ポートで動作している場合)Tomcatプラグインを導入している環境であれば、EclipseのTomcatPlugin上でそのまま動作させることもできます。