본문 바로가기
혼자서 개발새발

Spring) 게시판 페이지와 읽기 기능을 만들어보자!

by 휴일이 2022. 11. 22.

 

 

게시판의 읽기 기능을 만들어보려고 한다

1) 게시판을 만들고

2) 게시판 페이지도 만들고

3) 제목을 클릭하면 내용을 볼 수 있게 한다

4) 목록을 클릭하면 이전 목록을 보여준다

5) 게시판을 들어가면 로그인을 꼭 해야하는데, 로그인을 완료하면 게시판으로 바로 올 수 있게 한다

 

 

 

페이지를 만들기 위한

Page 클래스

package com.holiday.hi.domain;

public class Page {
    private int totalCnt; //총 게시물 갯수
    private int pageSize; //한 페이지 크기
    private int naviSize = 10; // 페이지 네비게이션 크기
    private int totalPage; // 전체 페이지 갯수
    private int page; // 현재 페이지
    private int beginPage; // 네이게이션 첫번째 페이지
    private int endPage; // 네비게이션 마지막 페이지
    private boolean showPrev; // 이전페이지로 이동하는 링크 보여줄것?
    private boolean showNext; //다음 페이지로 이동하는 링크 보여줄것?

    public Page(int totalCnt, int page) {
        this(totalCnt, page, 10);
    }

    public Page(int totalCnt, int page, int pageSize) {
        this.totalCnt = totalCnt;
        this.page = page;
        this.pageSize = pageSize;

        totalPage = (int)Math.ceil(totalCnt / (double)pageSize);
        beginPage = (page-1) / naviSize * naviSize + 1;
        endPage = Math.min(beginPage + naviSize -1, totalPage);
        showPrev = beginPage != 1;
        showNext = endPage != totalPage;
    }

    public void print() {
        System.out.println("page = " + page);
        System.out.println(showPrev ? "[PREV]" : "");
        for(int i = beginPage; i <= endPage; i++) {
            System.out.println(i+" ");
        }
        System.out.println(showNext ? " [NEXT]" : " ");
    }

    @Override
    public String toString() {
        return "Page{" +
                "totalCnt=" + totalCnt +
                ", pageSize=" + pageSize +
                ", naviSize=" + naviSize +
                ", totalPage=" + totalPage +
                ", page=" + page +
                ", beginPage=" + beginPage +
                ", endPage=" + endPage +
                ", showPrev=" + showPrev +
                ", showNext=" + showNext +
                '}';
    }

    public int getTotalCnt() {
        return totalCnt;
    }

    public void setTotalCnt(int totalCnt) {
        this.totalCnt = totalCnt;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getNaviSize() {
        return naviSize;
    }

    public void setNaviSize(int naviSize) {
        this.naviSize = naviSize;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getPage() {
        return page;
    }

    public void setPage(int page) {
        this.page = page;
    }

    public int getBeginPage() {
        return beginPage;
    }

    public void setBeginPage(int beginPage) {
        this.beginPage = beginPage;
    }

    public int getEndPage() {
        return endPage;
    }

    public void setEndPage(int endPage) {
        this.endPage = endPage;
    }

    public boolean isShowPrev() {
        return showPrev;
    }

    public void setShowPrev(boolean showPrev) {
        this.showPrev = showPrev;
    }

    public boolean isShowNext() {
        return showNext;
    }

    public void setShowNext(boolean showNext) {
        this.showNext = showNext;
    }
}

 

 

 

BoardController ( list와 read만 )

 

    @GetMapping("/list") //pageSize와 page는 기본이 1로
    public String list(@RequestParam(defaultValue = "10") Integer pageSize,
                       @RequestParam(defaultValue = "1") Integer page, HttpSession session,Model m, HttpServletRequest request) throws Exception {
        //로그인 안하면 로그인페이지로
        if(loginCheck(request)) {
            return "login";
//            return "redirect:/login?URL="+request.getRequestURL();
        }

        // 페이지마다 게시물
        int offset = (page-1)*pageSize;
        // 게시물들 가져오기
        List<BoardDto> list = service.page(offset, pageSize);
        m.addAttribute("list", list);

        int totalCnt = service.getCount();
        // 페이지 정보 가져오기
        Page p = new Page(totalCnt,page,pageSize);
        m.addAttribute("p", p);
        return "boardList";
    }

    @GetMapping("/read")
    public String read(Integer no, Integer page, Integer pageSize, Model m,HttpServletRequest request) {

        //로그인 체크
        if(loginCheck(request)) {
            return "login";
        }

        String URL = "";
        try {
            BoardDto boardDto = service.read(no);
            if(boardDto == null) {
                throw new Exception("페이지를 찾을 수 없습니다");
            }
            m.addAttribute(boardDto);
            m.addAttribute("page", page);
            m.addAttribute("pageSize", pageSize);
            URL =request.getHeader("referer");
            m.addAttribute("URL", URL);
        } catch (Exception e) {
            e.printStackTrace();
            return "redirect:/board/list";
        }

        return "board";
    }

 

 

boardList.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>게시판</title>
</head>
<body>
<table border="1">
    <tr>
        <th class="no">번호</th>
        <th class="title">제목</th>
        <th class="id">아이디</th>
        <th class="regdate">등록일</th>
        <th class="viewcnt">조회수</th>
    </tr>
    <c:forEach var="boardDto" items="${list}">
    <tr>
        <th class="no">${boardDto.no}</th>
        <th class="title"><a href="/board/read?no=${boardDto.no}&page=${p.page}&pageSize=${p.pageSize}">${boardDto.title}</a></th>
        <th class="id">${boardDto.id}</th>
        <th class="regdate">${boardDto.reg_date}</th>
        <th class="viewcnt">${boardDto.view_cnt}</th>
    </tr>
    </c:forEach>
</table>
<br>
<div>
    <c:if test="${p.showPrev}">
        <a href="/board/list?page=${p.beginPage-1}&pageSize=${p.pageSize}"> [PREV] </a></c:if>
    <c:forEach var="i" begin="${p.beginPage}" end="${p.endPage}">
        <a href="/board/list?page=${i}&pageSize=${p.pageSize}">${i}</a>
    </c:forEach>
    <c:if test="${p.showNext}">
        <a href="/board/list?page=${p.endPage+1}&pageSize=${p.pageSize}"> [NEXT] </a></c:if>
</div>

<button type="button" id = "write" onclick="location.href='/board/write'">글쓰기</button>
</body>
</html>

 

 

 

board.jsp

<%--
  Created by IntelliJ IDEA.
  User: admin
  Date: 2022-11-18
  Time: 오후 12:54
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>게시판</title>
</head>
<body>
<div>

    <input type="text" value="${fromURL}" hidden>
    <table>
        <tr>
            <th>제목 <input type="text" id="title" value="${boardDto.title}" readonly></th>
        </tr>
        <tr>
            <th>ID <input type="text" id="id" value="${boardDto.id}" readonly></th>
        </tr>
        <tr>
            <td><textarea id="content" rows="20" readonly>${boardDto.content}</textarea></td>
        </tr>
        <tr>이전 글</tr><tr></tr>
    </table>
    <button type="button" id = "list" onclick="location.href='/board/list?page=${p.page}&pageSize=${p.pageSize}'">목록</button>
</div>
</body>
</html>

 

 

 

 

게시판

 

다음 페이지
읽기

 

목록 클릭

 

읽기는 readonly로 작성이 아니라 읽을 수만 있게 만들었다

 

ㄷㅏ음엔 쓰기를 도전해보자!

728x90