Last Modified 10.11.2022
Pagination
NumbersForPagination.java
package net.java_school.commons; public class NumbersForPagination { private int prevBlock; private int firstPage; private int lastPage; private int nextBlock; private int totalPage; private int listItemNo; private int startRecord; private int endRecord; public int getPrevBlock() { return prevBlock; } public void setPrevBlock(int prevBlock) { this.prevBlock = prevBlock; } public int getFirstPage() { return firstPage; } public void setFirstPage(int firstPage) { this.firstPage = firstPage; } public int getLastPage() { return lastPage; } public void setLastPage(int lastPage) { this.lastPage = lastPage; } public int getNextBlock() { return nextBlock; } public void setNextBlock(int nextBlock) { this.nextBlock = nextBlock; } public int getTotalPage() { return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public int getListItemNo() { return listItemNo; } public void setListItemNo(int listItemNo) { this.listItemNo = listItemNo; } public int getStartRecord() { return startRecord; } public void setStartRecord(int startRecord) { this.startRecord = startRecord; } public int getEndRecord() { return endRecord; } public void setEndRecord(int endRecord) { this.endRecord = endRecord; } }
Paginator.java
/* * ----------------Design-------------------------------------------- * [First] [Prev] 11 12 13 14 15 16 17 18 19 20 [Next] [Last] * * ----------------Numbers for pagination-------------------------------------- * [First] -- 1 * [Prev] -- prevBlock * 11 -- firstPage (within current block) * 20 -- lastPage (within current block) * [Next] -- nextBlock * [Last] -- totalPage (totalPage is equal to the final page number) * * -----------------Number for design------------------------------------- * listItemNo -- The number to append to the first item in the list (Not persistent data) * * ------------------Numbers for fetch query------------------- * startRecord -- First record number on the current page * endRecord -- Last record number on the current page */ package net.java_school.commons; import java.util.List; public interface Paginator { public int getTotalRecordCount(String searchWord); public List<?> getItems(String searchWord, int startRecord, int endRecord); public default NumbersForPagination getNumbersForPagination(int totalRecordCount, int page, int recordsPerPage, int pagesPerBlock) { NumbersForPagination numbers = new NumbersForPagination(); int totalPage = totalRecordCount / recordsPerPage; if (totalRecordCount % recordsPerPage != 0) totalPage++; int totalBlock = totalPage / pagesPerBlock; if (totalPage % pagesPerBlock != 0) totalBlock++; int block = page / pagesPerBlock; if (page % pagesPerBlock != 0) block++; int firstPage = (block - 1) * pagesPerBlock + 1; int lastPage = block * pagesPerBlock; int prevBlock = 0; if (block > 1) prevBlock = firstPage - 1; int nextBlock = 0; if (block < totalBlock) nextBlock = lastPage + 1; if (block >= totalBlock) lastPage = totalPage; int listItemNo = totalRecordCount - (page - 1) * recordsPerPage; int startRecord = (page - 1) * recordsPerPage + 1; int endRecord = page * recordsPerPage; numbers.setPrevBlock(prevBlock); numbers.setFirstPage(firstPage); numbers.setLastPage(lastPage); numbers.setNextBlock(nextBlock); numbers.setTotalPage(totalPage); numbers.setListItemNo(listItemNo); numbers.setStartRecord(startRecord); numbers.setEndRecord(endRecord); return numbers; } }
Usage
@Controller public class HomeController implements Paginator { @Autowired private SomeService service; @Override public int getTotalRecordCount(String searchWord) { return service.getTotalRecordCount(searchWord); } @Override public List<Item> getItems(String searchWord, int startRecord, int endRecord) { return service.getItems(searchWord, startRecord, endRecord); } @GetMapping("/") public String index(Integer page, String searchWord, Model model) { if (page == null) return "redirect:/?page=1"; //1. Get total record count (A total of the number of records) int totalRecordCount = getTotalRecordCount(searchWord); //2. Get numbers for pagination int recordsPerPage = 4; int pagesPerBlock = 10; NumbersForPagination numbers = getNumbersForPagination(totalRecordCount, page, recordsPerPage, pagesPerBlock); //3. Get items to list on the page List<Item> items = getItems(searchWord, numbers.getStartRecord(), numbers.getEndRecord()); model.addAttribute("items", items); model.addAttribute("prevBlock", numbers.getPrevBlock()); model.addAttribute("nextBlock", numbers.getNextBlock()); model.addAttribute("firstPage", numbers.getFirstPage()); model.addAttribute("lastPage", numbers.getLastPage()); model.addAttribute("totalPage", numbers.getTotalPage()); return "index"; } }