最近、SpringMVCを使って色々作っておりました。
今まで色々なフレームワークを触って、その度に挫折していましたが、SpringMVCは使えると思うように至りました。
業務ではないのですが、SpringMVCでPagenationを実装する機会があったので、いろいろ調べたところ、ありがたいことに実装してあるサンプルがありましたので、使わせていただきました。
ソースファイルはGitHubにアップロードしておきます。
Twitter Bootstrap3で画面を作成して、最終的な画面イメージはこんな感じになります。
PagedListHolder
SpringMVCにPagedListHolderというクラスがあるのでこちらを使います。
[java]
PagedListHolder<Blog> pagenation = new PagedListHolder<>(list);
pagenation.setPage(Integer.parseInt(p)); // 現在ページ(0から開始)
pagenation.setPageSize(12); // 1ページの表示数
[/java]
その他にも、getFirstPageやgetLastPageやgetPageなど各種必要なメソッドが用意されております。
Pagenationを実装したことがある人はわかると思いますが、予め計算してくれるのは楽ですね。
Pagenationの実装
サンプルが掲載されているページではtaglibとして実装してありました。
WEB-INF/tags/pagenation.tg
[html]
<%@ 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>
[/html]
Pagenationの呼び出し
作成したPagenationを呼び出す方法ですが、
[html]
<%@ 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}"/>
[/html]
これだけです。
冒頭でpageLinkを宣言しております。pに設定している"~"は置換用の文字列となっており、先ほどのpagenation.tgでURL生成時にページ数に置換しております。
まとめ
コントローラー側でPagedListHolderを用意してビュー側で呼び出し処理を行うだけで、Pagenationを作成してくれるのは本当に簡単だと思います。
課題としてはデータベース接続を行いリストが大量にある場合、ページ単位で表示できるかっていうことですね。
リスト数が限られているページでは、非常に簡単に使用できるので有効価値はあると思います。
参考ページ
A Pagination Technique Using Spring