Java Webアプリケーションにおけるページネーション実装
Java Webアプリケーションでデータ検索のページネーションを実装する方法
1. ページネーション用ユーティリティクラス
package com.example.pagination;
import java.util.List;
public class PaginationHelper<T> {
private int currentPage;
private List<T> items;
private int itemsPerPage;
private long totalItems;
public PaginationHelper(int currentPage) {
this.currentPage = currentPage;
}
public int getCurrentPage() {
if(currentPage < 1) return 1;
if(getTotalPages() == 0) return 1;
if(currentPage > getTotalPages())
return getTotalPages();
return currentPage;
}
public int getItemsPerPage() {
return itemsPerPage;
}
public void setItemsPerPage(int itemsPerPage) {
this.itemsPerPage = itemsPerPage;
}
public List<T> getItems() {
return items;
}
public void setItems(List<T> items) {
this.items = items;
}
public int getTotalPages() {
int total = (int)totalItems / itemsPerPage;
return (totalItems % itemsPerPage != 0) ? total + 1 : total;
}
public boolean hasNext() {
return getCurrentPage() < getTotalPages();
}
public boolean hasPrevious() {
return getCurrentPage() > 1;
}
public int getNextPage() {
return hasNext() ? getCurrentPage() + 1 : getCurrentPage();
}
public int getPreviousPage() {
return hasPrevious() ? getCurrentPage() - 1 : getCurrentPage();
}
}
2. 検索条件をカプセル化するクラス
package com.example.pagination;
public class SearchCriteria {
private int pageNumber;
private String searchField;
private String searchValue;
public SearchCriteria(int pageNumber) {
this.pageNumber = pageNumber;
}
public String getSearchField() {
return (searchField == null) ? "%%" : "%" + searchField + "%";
}
public String getSearchValue() {
return (searchValue == null) ? "%%" : "%" + searchValue + "%";
}
}
3. DAO層の実装
package com.example.dao;
import java.sql.Connection;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
public class DataAccessObject {
private QueryRunner queryRunner = new QueryRunner();
public <T> List<T> queryForList(String sql, Class<T> type, Object... params) {
try (Connection conn = DatabaseUtil.getConnection()) {
return queryRunner.query(conn, sql, new BeanListHandler<>(type), params);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public long countRecords(String sql, Object... params) {
try (Connection conn = DatabaseUtil.getConnection()) {
return queryRunner.query(conn, sql, new ScalarHandler<>(), params);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
}
4. ページネーション機能を実装したDAO
package com.example.dao;
import java.util.List;
import com.example.pagination.PaginationHelper;
import com.example.pagination.SearchCriteria;
public class PagedDataDao extends DataAccessObject {
public PaginationHelper<DataModel> getPagedData(SearchCriteria criteria, int pageSize) {
PaginationHelper<DataModel> page = new PaginationHelper<>(criteria.getPageNumber());
page.setItemsPerPage(pageSize);
long total = countRecords(
"SELECT COUNT(*) FROM data_table WHERE field LIKE ?",
criteria.getSearchValue()
);
page.setTotalItems(total);
List<DataModel> items = queryForList(
"SELECT * FROM data_table WHERE field LIKE ? LIMIT ?, ?",
DataModel.class,
criteria.getSearchValue(),
(page.getCurrentPage() - 1) * pageSize,
pageSize
);
page.setItems(items);
return page;
}
}
5. JSPでの表示例
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<div class="pagination">
<c:if test="${page.hasPrevious}">
<a href="?page=1">最初</a>
<a href="?page=${page.previousPage}">前へ</a>
</c:if>
<c:forEach begin="1" end="${page.totalPages}" var="i">
<c:choose>
<c:when test="${page.currentPage == i}">
<strong>${i}</strong>
</c:when>
<c:otherwise>
<a href="?page=${i}">${i}</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${page.hasNext}">
<a href="?page=${page.nextPage}">次へ</a>
<a href="?page=${page.totalPages}">最後</a>
</c:if>
</div>
タグ:
Java
Servlet
JSP
ページネーション
DAO
6月11日 16:05 投稿