Java

SpringMVCでPagenationを実装する方法

投稿日:2013/10/17 更新日:

最近、SpringMVCを使って色々作っておりました。
今まで色々なフレームワークを触って、その度に挫折していましたが、SpringMVCは使えると思うように至りました。

業務ではないのですが、SpringMVCでPagenationを実装する機会があったので、いろいろ調べたところ、ありがたいことに実装してあるサンプルがありましたので、使わせていただきました。
ソースファイルはGitHubにアップロードしておきます。
Twitter Bootstrap3で画面を作成して、最終的な画面イメージはこんな感じになります。

pagenation

PagedListHolder

SpringMVCにPagedListHolderというクラスがあるのでこちらを使います。

PagedListHolder<Blog> pagenation = new PagedListHolder<>(list);
pagenation.setPage(Integer.parseInt(p)); // 現在ページ(0から開始)
pagenation.setPageSize(12); // 1ページの表示数

その他にも、getFirstPageやgetLastPageやgetPageなど各種必要なメソッドが用意されております。
Pagenationを実装したことがある人はわかると思いますが、予め計算してくれるのは楽ですね。

Pagenationの実装

サンプルが掲載されているページではtaglibとして実装してありました。

WEB-INF/tags/pagenation.tg
<%@ tag import="org.springframework.util.StringUtils" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ attribute name="pagedListHolder" required="true" type="org.springframework.beans.support.PagedListHolder" %>
<%@ attribute name="pagedLink"       required="true" type="java.lang.String" %>
<c:if test="${pagedListHolder.pageCount > 1}">
  <ul class="pagination">
<c:if test="${!pagedListHolder.firstPage}">
    <li><a href="<%= StringUtils.replace(pagedLink, "~", String.valueOf(pagedListHolder.getPage()-1)) %>">Prev</a></li>
</c:if>
<c:if test="${pagedListHolder.firstLinkedPage > 0}">
    <li><a href="<%= StringUtils.replace(pagedLink, "~", "0") %>">1</a></li>
</c:if>
<c:if test="${pagedListHolder.firstLinkedPage > 1}">
    <li><a href="#">...</a></li>
</c:if>

<c:forEach begin="${pagedListHolder.firstLinkedPage}" end="${pagedListHolder.lastLinkedPage}" var="i">
<c:choose>
<c:when test="${pagedListHolder.page == i}">
    <li class="active"><a>${i+1}</a></li>
</c:when>
<c:otherwise>
    <li><a href="<%= StringUtils.replace(pagedLink, "~", String.valueOf(jspContext.getAttribute("i"))) %>">${i+1}</a></li>
</c:otherwise>
</c:choose>
</c:forEach>

<c:if test="${pagedListHolder.lastLinkedPage < pagedListHolder.pageCount - 2}">
    <li><a href="#">...</a></li>
</c:if>
<c:if test="${pagedListHolder.lastLinkedPage < pagedListHolder.pageCount - 1}">
    <li><a href="<%= StringUtils.replace(pagedLink, "~", String.valueOf(pagedListHolder.getPageCount()-1)) %>">${pagedListHolder.pageCount}</a></li>
</c:if>
<c:if test="${!pagedListHolder.lastPage}">
    <li><a href="<%= StringUtils.replace(pagedLink, "~", String.valueOf(pagedListHolder.getPage()+1)) %>">Next</a></li>
</c:if>
  </ul>
</c:if>

Pagenationの呼び出し

作成したPagenationを呼び出す方法ですが、

<%@ taglib prefix="tg" tagdir="/WEB-INF/tags" %>
<c:url value="/sample/pagenation/" var="pagedLink">
	<c:param name="p" value="~"/>
</c:url>
<tg:pagenation pagedListHolder="${pagedListHolder}" pagedLink="${pagedLink}"/>

これだけです。
冒頭でpageLinkを宣言しております。pに設定している”~”は置換用の文字列となっており、先ほどのpagenation.tgでURL生成時にページ数に置換しております。

まとめ

コントローラー側でPagedListHolderを用意してビュー側で呼び出し処理を行うだけで、Pagenationを作成してくれるのは本当に簡単だと思います。
課題としてはデータベース接続を行いリストが大量にある場合、ページ単位で表示できるかっていうことですね。
リスト数が限られているページでは、非常に簡単に使用できるので有効価値はあると思います。

参考ページ

A Pagination Technique Using Spring

今回のプロジェクト

https://github.com/beeete2/springmvc-testwebapp

-Java
-

執筆者:


comment

メールアドレスが公開されることはありません。

関連記事

JUnitのアサーションにAssertJを使う

Junit3時代はassertEqualsでアサーションしてJunit4になると当初はhamcrestでアサーションしておりましたが最近はAssertJを使っております。 AssertJはFluent …

Tomcatのメモリ使用量をjconsoleを使って監視する方法

まれに、Tomcatのメモリ使用量をリアルタイムで知りたいということが無いでしょうか。 管理人はたまにあります・・・。 JDK5か6以降jconsoleという便利なツールが追加されまして、それを使って …

no image

WindowsのAntでJDKのバージョンを変更する方法

先日のMavenでコンパイル時のJDKバージョンを指定する方法のAnt版っていう感じです。 Mavenは先日の記事のように、プラグインで用意されているみたいなのですがAntには無さそう。 という訳で、 …

no image

Windows7でSeleniumServer(RC)を使ってFireFoxを起動する方法

ちょうどWEBアプリを作っているので複雑な画面をSeleniumでテストケース作っておけばいいかなーと思って作りました。 FireFoxDriverを起動しています。 Jenkinsでテストとテストサ …

Spring MVCのコントローラーで任意のステータスコードを返す方法

Spring MVCにかぎらずなんですが、URIリソースが見つからない場合は、適切なステータスコードを返してブラウザにお知らせする必要があると思います。 例えば、マッピングには一致したが指定された条件 …