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 投稿