알고보면코딩천재
게시판 만들기 - Paging (2) 본문
테스트 할때
매개변수 값 given
테스트 하는 것 when
SELECT totalCount,
totalPage,
currentPage,
decode(currentPage, 0, 1, 0) first,
decode(currentPage, totalPage-1, 1, 0) last
FROM
(
select count(*) totalCount, ceil(count(*)/10) totalPage, 0 currentPage, 0 first, 0 last
FROM boards
);
이거를 내가 짤 줄 알아야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="site.metacoding.red.domain.boards.BoardsDao">
<select id="paging" resultType="site.metacoding.red.web.dto.response.boards.PagingDto">
SELECT totalCount,
totalPage,
currentPage,
decode(currentPage, 0, 1, 0) first,
decode(currentPage, totalPage-1, 1, 0) last
FROM
(
select count(*) totalCount, ceil(count(*)/10) totalPage, #{page} currentPage, 0
first, 0 last
FROM boards
)
</select>
<insert id="insert">
INSERT INTO boards(id, title, content, usersId,
createdAt)
VALUES(boards_seq.nextval, #{title}, #{content}, #{usersId},
sysdate)
</insert>
<select id="findById"
resultType="site.metacoding.red.domain.boards.Boards">
SELECT id, title, content FROM boards WHERE id=#{id}
</select>
<select id="findAll"
resultType="site.metacoding.red.web.dto.response.boards.MainDto">
SELECT b.id, b.title, u.username
FROM boards b
INNER JOIN
users u
ON b.usersId = u.id
ORDER BY b.id DESC
OFFSET #{startNum} ROWS
FETCH NEXT 10 ROWS ONLY
</select>
<update id="update">
</update>
<delete id="delete">
</delete>
</mapper>
boolean은 is를 붙인다 -> el에서는 last로 찾아진다
package site.metacoding.red.web.dto.response.boards;
public class PagingDto {
private Integer totalCount; // 23
private Integer totalPage; // 3
private Integer currentPage; // 0
private boolean isLast; // false
private boolean isFirst; // true
}
package site.metacoding.red.domain.boards;
import java.util.List;
import site.metacoding.red.web.dto.response.boards.MainDto;
import site.metacoding.red.web.dto.response.boards.PagingDto;
public interface BoardsDao {
public PagingDto paging(Integer page);
public void insert(Boards boards); // DTO 생각해보기
public Boards findById(Integer id);
public List<MainDto> findAll(int startNum);
public void update(Boards boards); // DTO 생각해보기
public void delete(Integer id);
}
package site.metacoding.red.web.dto.response.boards;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class PagingDto {
private Integer totalCount; // 23
private Integer totalPage; // 3
private Integer currentPage; // 0
private boolean isLast; // false
private boolean isFirst; // true
}
package site.metacoding.red.web;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import lombok.RequiredArgsConstructor;
import site.metacoding.red.domain.boards.BoardsDao;
import site.metacoding.red.domain.users.Users;
import site.metacoding.red.web.dto.request.boards.WriteDto;
import site.metacoding.red.web.dto.response.boards.MainDto;
import site.metacoding.red.web.dto.response.boards.PagingDto;
@RequiredArgsConstructor
@Controller
public class BoardsController {
private final HttpSession session;
private final BoardsDao boardsDao;
// @PostMapping("/boards/{id}/delete")
// @PostMapping("/boards/{id}/update")
@PostMapping("/boards")
public String writeBoards(WriteDto writeDto) {
// 1번 세션에 접근해서 세션값을 확인한다. 그때 Users로 다운캐스팅하고 키값은 principal로 한다.
Users principal = (Users) session.getAttribute("principal");
// 2번 pricipal null인지 확인하고 null이면 loginForm 리다이렉션해준다.
if(principal == null) {
return "redirect:/loginForm";
}
// 3번 BoardsDao에 접근해서 insert 메서드를 호출한다.
// 조건 : dto를 entity로 변환해서 인수로 담아준다.
// 조건 : entity에는 세션의 principal에 getId가 필요하다.
boardsDao.insert(writeDto.toEntity(principal.getId()));
return "redirect:/";
}
// http://localhost:8000/
// http://localhost:8000/?page=0
@GetMapping({"/", "/boards"}) // 메인페이지
public String getBoardList(Model model, Integer page) { // 0 -> 0, 1->10, 2->20
if(page == null) page = 0;
int startNum = page * 10;
List<MainDto> boardsList = boardsDao.findAll(startNum);
PagingDto paging = boardsDao.paging(page);
model.addAttribute("boardsList", boardsList);
model.addAttribute("paging", paging);
return "boards/main";
}
@GetMapping("/boards/{id}") // 상세보기
public String getBoardList(@PathVariable Integer id, Model model) {
model.addAttribute("boards", boardsDao.findById(id));
return "boards/detail";
}
@GetMapping("/boards/writeForm")
public String writeForm() {
Users principal = (Users) session.getAttribute("principal");
if(principal == null) {
return "redirect:/loginForm";
}
return "boards/writeForm";
}
}
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>
<div class="container">
<table class="table table-striped">
<thead>
<tr>
<th>번호</th>
<th>게시글제목</th>
<th>작성자이름</th>
</tr>
</thead>
<tbody>
<c:forEach var="boards" items="${boardsList }">
<tr>
<td>${boards.id }</td>
<td><a href="/boards/${boards.id }">${boards.title }</a></td>
<td>${boards.username }</td>
</tr>
</c:forEach>
</tbody>
</table>
<a href="?page=${paging.currentPage+1 }">다음페이지</a>
<div style="background-color: grey;">
<h3>totalCount:${paging.totalCount }</h3>
<h3>totalPage:${paging.totalPage }</h3>
<h3>currentPage:${paging.currentPage }</h3>
<h3>isLast:${paging.last }</h3>
<h3>isFirst:${paging.first }</h3>
</div>
<ul class="pagination">
<li class="page-item"><a class="page-link" href="?page=${paging.currentPage-1 }">Previous</a></li>
<c:forEach var="i" begin="1" end="${paging.totalPage }">
<li class="page-item"><a class="page-link" href="?page=${i-1}">${i }</a></li>
<!-- <li class="page-item active"><a class="page-link" href="#">2</a></li>
<li class="page-item"><a class="page-link" href="#">3</a></li> -->
</c:forEach>
<li class="page-item"><a class="page-link" href="?page=${paging.currentPage+1}">Next</a></li>
</ul>
</div>
<%@ include file="../layout/footer.jsp"%>
'spring' 카테고리의 다른 글
게시판 만들기 - 삭제 (0) | 2022.09.07 |
---|---|
게시판 만들기 - Paging (3) (0) | 2022.09.07 |
게시판 만들기 - Paging (1) 오라클 offset, limit (0) | 2022.09.05 |
STS-라인수 늘이기 (0) | 2022.09.02 |
게시판 만들기 - 회원가입/ 로그인 (0) | 2022.09.02 |
Comments