01/14ページング処理コード
52673 ワード
common > pagingConst
テストコード
https://postitforhooney.tistory.com/entry/HTML-HTML-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%BD%94%EB%93%9C%ED%91%9C-%EC%A0%95%EB%A6%AC
package com.icia.board.common;
public class PagingConst {
public static final int PAGE_LIMIT = 5; // 한 페이지에 보여줄 글 갯수
public static final int BLOCK_LIMIT = 3; // 한 화면에 보여줄 페이지 갯수
}
pagingDTO@Data
@NoArgsConstructor
@AllArgsConstructor
public class BoardPagingDTO {
private Long boardId;
private String BoardWriter;
private String BoardTitle;
}
さんこうえんざんしテストコード
@Autowired
private BoardService bs;
@Autowired
private BoardRepository br;
@Test
@DisplayName("삼항연산자")
public void test1(){
int num = 10;
int num1 = 0;
if(num == 10) {
num1 = 5;
}else {
num1 = 100;
}
num1 = (num==10)? 5 : 100;
// 조건 ? t참일 때 : f 거짓일 때 좌변에 대입시킴.
}
@Test
@Transactional
@DisplayName("페이징테스트")
public void pagingTest(){
int page = 5;
Page<BoardEntity> boardEntities = br.findAll(PageRequest.of(page, PagingConst.PAGE_LIMIT, Sort.by(Sort.Direction.DESC, "id")));
//page 객체가 제공해 주는 메서드 확인
System.out.println("boardEntities.getContent() = "+boardEntities.getContent()); //요청페이지에 들어있는 데이터
System.out.println("boardEntities.getTotalElements() = " + boardEntities.getTotalElements()); //전체 글 갯수
System.out.println("boardEntities.getNumber() = " + boardEntities.getNumber()); //요청페이지 JPA 기준
System.out.println("boardEntities.getTotalPages() = " + boardEntities.getTotalPages()); // 전체 페이지 갯수
System.out.println("boardEntities.getSize() = " + boardEntities.getSize()); //한 페이지에 보여지는 글 갯수
System.out.println("boardEntities.hasPrevious() = " + boardEntities.hasPrevious()); // 이전 페이지 존재여부
System.out.println("boardEntities.isFirst() = " + boardEntities.isFirst()); // 첫페이지인지 여부
System.out.println("boardEntities.isLast() = " + boardEntities.isLast()); // 마지막페이지인지 여부
//map() : 엔티티가 담긴 페이지 객체를 dto 가 담긴 페이지 객체로 변환해주는 역할
Page<BoardPagingDTO> boardList = boardEntities.map(
//board(엔티티 객체) : 엔티티 객체를 담기 위한 반복용 변수
// Page<BoardEntity> -> Page<BoardPagingDTO>
board -> new BoardPagingDTO(board.getId(),
board.getBoardWriter(),
board.getBoardTitle())
);
System.out.println("boardList.getContent() = "+boardList.getContent()); //요청페이지에 들어있는 데이터
System.out.println("boardList.getTotalElements() = " + boardList.getTotalElements()); //전체 글 갯수
System.out.println("boardList.getNumber() = " + boardList.getNumber()); //요청페이지 JPA 기준
System.out.println("boardList.getTotalPages() = " + boardList.getTotalPages()); // 전체 페이지 갯수
System.out.println("boardList.getSize() = " + boardList.getSize()); //한 페이지에 보여지는 글 갯수
System.out.println("boardList.hasPrevious() = " + boardList.hasPrevious()); // 이전 페이지 존재여부
System.out.println("boardList.isFirst() = " + boardList.isFirst()); // 첫페이지인지 여부
System.out.println("boardList.isLast() = " + boardList.isLast()); // 마지막페이지인지 여부
}
Controllerimport org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
//페이징처리(/board?page=5)
//5번글(/board/5) 주소만으로 무엇을 요청하는 지 알자
//주소값을 query String 방식으로 보내주기
@GetMapping
public String paging(@PageableDefault(page = 1)Pageable pageable, Model model){
// @PageableDefault(page = 1) /board?page=5 무조건 page 라는 파라미터로 요청
// 페이지 객체
Page<BoardPagingDTO> boardList = bs.paging(pageable);
model.addAttribute("boardList", boardList);
int startPage = (((int) (Math.ceil((double) pageable.getPageNumber() / PagingConst.BLOCK_LIMIT))) - 1) * PagingConst.BLOCK_LIMIT + 1;
int endPage = ((startPage + PagingConst.BLOCK_LIMIT - 1) < boardList.getTotalPages()) ? startPage + PagingConst.BLOCK_LIMIT - 1 : boardList.getTotalPages();
model.addAttribute("startPage",startPage);
model.addAttribute("endPage",endPage);
return "board/paging";
}
ServiceImplimport org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@Override
public Page<BoardPagingDTO> paging(Pageable pageable) {
int page = pageable.getPageNumber();
//페이징처리를 JPA 로 하는데 요구하는 파라미터를 잘 써야함
//요청한 페이지가 1이면 페이지값을 0으로 하고 1이 아니면 요청 페이지에서 1을 뺸다.
// page = page - 1;
page = (page==1)? 0 : (page-1);
Page<BoardEntity> boardEntities = br.findAll(PageRequest.of(page, PagingConst.PAGE_LIMIT, Sort.by(Sort.Direction.DESC, "id")));
// Entity 필드이름 "id" order by board_id desc
//Page<BoardEntity> => Page<BoardPagingDTO>
Page<BoardPagingDTO> boardList = boardEntities.map(
//board(엔티티 객체) : 엔티티 객체를 담기 위한 반복용 변수
// Page<BoardEntity> -> Page<BoardPagingDTO>
board -> new BoardPagingDTO(board.getId(),
board.getBoardWriter(),
board.getBoardTitle())
);
return boardList;
}
paging.html<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
<body class="container">
<h2>회원제 게시판</h2>
<table class="table table-hover">
<thead>
<tr>
<th scope="col">글 번호</th>
<th scope="col">글쓴이</th>
<th scope="col">글 제목</th>
</tr>
</thead>
<tbody>
<tr th:each="board: ${boardList}">
<td th:text="${board.boardId}"></td>
<td th:text="${board.boardWriter}"></td>
<td><a th:href="@{|/board/${board.boardId}|}" th:text="${board.boardTitle}">제목</a></td>
</tr>
</tbody>
</table>
<!--
브라우저 주소창에 보이는 주소값 : /board?page=1
html 에서 타임리프로 작성하는 주소 값 : /board(page=1)
/board
/board/* => /board/(page=1)
-->
<div class="container">
<ul class="pagination">
<li class="page-item">
<!--첫 페이지로 가는 링크-->
<a class="page-link" th:href="@{/board(page=1)}">
<span>First</span>
</a>
</li>
<li th:class="${boardList.first} ? 'page-item disabled'">
<!--boardList.first = isFirst() 링크값 # : 그 자리에 머무름
boardList.number = getNumber() 내가 현재 3페이지 , getNumber 는 2페이지 이전으로 가려면 getNumber 를 그대로 가져가면 됨-->
<a class="page-link" th:href="${boardList.first} ? '#' : @{/board(page=${boardList.number})}">
<span><</span>
<!-- = '<' html 에서는 < 로 써야함-->
</a>
</li>
<!--startPage ~ endPage 까지 숫자를 만들어주는 역할-->
<li th:each="page: ${#numbers.sequence(startPage, endPage)}"
th:class="${page == boardList.number + 1} ? 'page-item active'">
<a class="page-link" th:text="${page}" th:href="@{/board(page=${page})}"></a>
</li>
<!--다음 페이지 요청
현재 3페이지를 보고 있다면 다음 페이지는 4페이지임.
getNumber() 값은 2임
따라서 4페이지를 보고 싶다면 getNumber()+2를 해야 컨트롤러에 4를 요청할 수 있음음-->
<li th:class="${boardList.last} ? 'disabled'">
<a class="page-link" th:href="${boardList.last} ? '#' : @{/board(page=${boardList.number + 2})}">
<span>></span> <!--삼항연산자 사용-->
</a>
</li>
<li class="page-item">
<a class="page-link" th:href="@{/board(page=${boardList.totalPages})}">
<span>Last</span>
</a>
</li>
</ul>
</div>
</body>
</html>
html特殊文字コードの整理https://postitforhooney.tistory.com/entry/HTML-HTML-%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90-%EC%BD%94%EB%93%9C%ED%91%9C-%EC%A0%95%EB%A6%AC
Reference
この問題について(01/14ページング処理コード), 我々は、より多くの情報をここで見つけました https://velog.io/@hellocdpa/페이징-처리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol