보라코딩

Day72_230410_ JSP, MyBatis 게시판 페이징처리 본문

코딩/Servlet, JSP, MyBatis

Day72_230410_ JSP, MyBatis 게시판 페이징처리

new 보라 2023. 4. 10. 18:01

bbs.sql
0.00MB

 

 

 

 

 

 

paging.java

package com.mystudy.bbs.common;

//게시판의 페이징 처리를 위한 값을 저장 관리
public class Paging {
private int nowPage = 1; //현재페이지
private int nowBlock = 1; //현재 블록(페이지 담는 단위)

private int numPerPage = 3; //하나의 페이지에 표시할 게시글 수
private int pagePerBlock = 3; //블록당 표시하는 페이지 갯수

private int totalRecord = 0; //총 게시물 갯수(원본 게시글 수)
private int totalPage = 0; //전체 페이지 갯수
private int totalBlock = 0; //전체 블록 갯수

private int begin = 0; //현재 페이지상의 시작 번호
private int end = 0; //현재 페이지상의 마지막 번호

private int beginPage = 0; //현재 블록의 시작 페이지 번호
private int endPage = 0; //현재 블록의 끝 페이지 번호

//전체 페이지 갯수 구하기
//totalRecord 값을 페이지당 표시할 글의 개수 값을 나누고,
//나머지가 있으면 페이지 하나 더 추가
public void setTotalPage() {
totalPage = totalRecord / numPerPage;
if (totalRecord % numPerPage > 0) totalPage++;
}

public int getNowPage() {
return nowPage;
}
public void setNowPage(int nowPage) {
this.nowPage = nowPage;
}
public int getNowBlock() {
return nowBlock;
}
public void setNowBlock(int nowBlock) {
this.nowBlock = nowBlock;
}
public int getNumPerPage() {
return numPerPage;
}
public void setNumPerPage(int numPerPage) {
this.numPerPage = numPerPage;
}
public int getPagePerBlock() {
return pagePerBlock;
}
public void setPagePerBlock(int pagePerBlock) {
this.pagePerBlock = pagePerBlock;
}
public int getTotalRecord() {
return totalRecord;
}
public void setTotalRecord(int totalRecord) {
this.totalRecord = totalRecord;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalBlock() {
return totalBlock;
}
public void setTotalBlock(int totalBlock) {
this.totalBlock = totalBlock;
}
public int getBegin() {
return begin;
}
public void setBegin(int begin) {
this.begin = begin;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}

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;
}

@Override
public String toString() {
return "Paging [nowPage=" + nowPage + ", nowBlock=" + nowBlock + ", numPerPage=" + numPerPage
+ ", pagePerBlock=" + pagePerBlock + ", totalRecord=" + totalRecord + ", totalPage=" + totalPage
+ ", totalBlock=" + totalBlock + ", begin=" + begin + ", end=" + end + ", beginPage=" + beginPage
+ ", endPage=" + endPage + "]";
}

}
















 

 

BbsVO.java

package com.mystudy.bbs.vo;

import java.sql.Date;


public class BbsVO {

private int bbs_idx;
private String subject;
private String writer;
private String content;
private String file_name;
private String ori_name;
private String pwd;
private Date write_date;
private String ip;
private int hit;




public int getBbs_idx() {
return bbs_idx;
}




public void setBbs_idx(int bbs_idx) {
this.bbs_idx = bbs_idx;
}




public String getSubject() {
return subject;
}




public void setSubject(String subject) {
this.subject = subject;
}




public String getWriter() {
return writer;
}




public void setWriter(String writer) {
this.writer = writer;
}




public String getContent() {
return content;
}




public void setContent(String content) {
this.content = content;
}




public String getFile_name() {
return file_name;
}




public void setFile_name(String file_name) {
this.file_name = file_name;
}




public String getOri_name() {
return ori_name;
}




public void setOri_name(String ori_name) {
this.ori_name = ori_name;
}




public String getPwd() {
return pwd;
}




public void setPwd(String pwd) {
this.pwd = pwd;
}




public Date getWrite_date() {
return write_date;
}




public void setWrite_date(Date write_date) {
this.write_date = write_date;
}




public String getIp() {
return ip;
}




public void setIp(String ip) {
this.ip = ip;
}




public int getHit() {
return hit;
}




public void setHit(int hit) {
this.hit = hit;
}




@Override
public String toString() {
return "BbsVO [bbs_idx=" + bbs_idx + ", subject=" + subject + ", writer=" + writer + ", content=" + content
+ ", file_name=" + file_name + ", ori_name=" + ori_name + ", pwd=" + pwd + ", write_date=" + write_date
+ ", ip=" + ip + ", hit=" + hit + "]";
}



}

 

 

commentVO.java

package com.mystudy.bbs.vo;

import java.sql.Date;

public class CommentVO {

private int comment_idx;
private String writer;
private String content;
private String pwd;
private Date write_date;
private String ip;
private int bbs_idx;
public int getComment_idx() {
return comment_idx;
}
public void setComment_idx(int comment_idx) {
this.comment_idx = comment_idx;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Date getWrite_date() {
return write_date;
}
public void setWrite_date(Date write_date) {
this.write_date = write_date;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getBbs_idx() {
return bbs_idx;
}
public void setBbs_idx(int bbs_idx) {
this.bbs_idx = bbs_idx;
}
@Override
public String toString() {
return "CommentVO [comment_idx=" + comment_idx + ", writer=" + writer + ", content=" + content + ", pwd=" + pwd
+ ", ip=" + ip + ", bbs_idx=" + bbs_idx + "]";
}


}

 

 

 

 

 

list.jsp

<%@page import="com.mystudy.bbs.vo.BbsVO"%>
<%@page import="java.util.List"%>
<%@page import="com.mystudy.bbs.dao.BbsDAO"%>
<%@page import="com.mystudy.bbs.common.Paging"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
   
<%-- 현재 페이지에 표시할 데이터를 구해서 화면에 표시 
1. 페이징 처리를 위한 객체(Paging) 생성해서 필요한 데이터 참조
2. 페이징 객체에 설정할 데이터 저장
3. (DB) 전체 데이터 건수 조회
4. (DB) 현재 페이지에 표시할 게시글 데이터 조회
5. 데이터 화면 표시(화면컨트롤 - 스타일 지정)
--%>
<%
//0. 페이징 처리를 위한 객체(Paging) 생성
Paging p = new Paging();

//1. 전체 게시물 수량 구하기
p.setTotalRecord(BbsDAO.getTotalCount());
p.setTotalPage();

System.out.println("> 전체 게시글 수 : " + p.getTotalRecord());
System.out.println("> 전체 페이지 수 : " + p.getTotalPage());

//2. 현재 페이지 구하기
String cPage = request.getParameter("cPage");
if (cPage != null) {
p.setNowPage(Integer.parseInt(cPage));
}
System.out.println("> cPage : " + cPage);
System.out.println("> Paging nowPage : " + p.getNowPage());

//3. 현재 페이지에 표시할 게시글 시작번호(begin), 끝번호(end) 구하기
p.setEnd(p.getNowPage() * p.getNumPerPage());
p.setBegin(p.getEnd() - p.getNumPerPage() + 1);

//3-1. (선택적) 끝번호가 데이터 건수보다 크면 데이터 건수와 동일하게 처리
if (p.getEnd() > p.getTotalRecord()) {
p.setEnd(p.getTotalRecord());
}
System.out.println(">> 시작번호(begin) : " + p.getBegin());
System.out.println(">> 끝번호(end) : " + p.getEnd());

//------- 블록(Block) 계산하기 ---------
//4. 블록 시작페이지, 끝페이지 구하기(현재 페이지 번호 사용)
//4-1. 시작페이지, 끝페이지 구하기
int beginPage = (p.getNowPage() - 1) / p.getPagePerBlock() * p.getPagePerBlock() + 1;
p.setBeginPage(beginPage);
p.setEndPage(beginPage + p.getPagePerBlock() - 1);

//4-2. 끝페이지(endPage)가 전체 페이지 수(totalPage) 보다 크면
// 끝페이지를 전체페이지 수로 변경 처리
if (p.getEndPage() > p.getTotalPage()) {
p.setEndPage(p.getTotalPage());
}

System.out.println(">> beginPage : " + p.getBeginPage());
System.out.println(">> endPage : " + p.getEndPage());

//=========================
// 현재 페이지 기준으로 DB 데이터(게시글) 가져오기
List<BbsVO> list = BbsDAO.getList(p.getBegin(), p.getEnd());
System.out.println(">> 현재페이지 글목록(list) : " + list);

// 데이터를 화면에 표시(출력)
pageContext.setAttribute("list", list); //게시글 데이터
pageContext.setAttribute("pvo", p); //페이지 관련 데이터
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글목록</title>
<style>
#bbs table {
width: 600px;
border-collapse: collapse;
font-size: 14px;
}
#bbs table caption {
font-size: 20px;
font-weight: bold;
}
#bbs th, #bbs td {
border: 1px solid black;
padding: 4px 10px;
text-align: center;
}
#bbs .align-left { text-align: left; }

.title { background-color: pink; }
.no { width: 10%; }
.writer { width: 15%; }
.regdate { width: 20%; }
.hit { width: 15%; }

/*** 페이지 표시 영역 스타일(시작) ****/
.paging { list-style: none; }
.paging li {
float: left;
margin-right: 8px;
}
.paging li a {
text-decoration: none;
display: block;
padding: 3px 7px;
border: 1px solid #00B3DC;
font-weight: bold;
color: black;
}
.paging .disable {
border: 1px solid #aaa;
color: #aaa;
padding: 3px 7px;
}
.paging .now {
border: 1px solid #ff4aa5;
background-color: tomato;
padding: 3px 7px;
}
</style>
</head>
<body>

<div id="bbs">
<table>
<caption>게시글 목록</caption>
<thead>
<tr class="title">
<th class="no">번호</th>
<th class="subject">제목</th>
<th class="writer">글쓴이</th>
<th class="regdate">날짜</th>
<th class="hit">조회수</th>
</tr>
</thead>
<tbody>
<c:forEach var="vo" items="${list }">
<tr>
<td>${vo.bbsIdx }</td>
<td class="align-left">
<a href="view.jsp?bbsIdx=${vo.bbsIdx }&cPage=${pvo.nowPage}">${vo.subject }</a>
</td>
<td>${vo.writer }</td>
<td>${vo.writeDate }</td>
<td>${vo.hit }</td>
</tr>
</c:forEach>
<c:if test="${empty list }">
<tr>
<td colspan="5">현재 등록된 글이 없습니다</td>
</tr>
</c:if>
</tbody>
<tfoot>
<tr>
<td colspan="4">
<ol class="paging">
<%-- [이전으로]에 대한 사용가능 여부 처리 --%>
<c:if test="${pvo.beginPage == 1 }">
<li class="disable">이전으로</li>
</c:if>
<c:if test="${pvo.beginPage != 1 }">
<li>
<a href="list.jsp?cPage=${pvo.beginPage - 1 }">이전으로</a>
</li>
</c:if>

<%--블록내에 표시할 페이지 태그 작성(시작~끝 페이지) --%>
<c:forEach var="pageNo" begin="${pvo.beginPage }" end="${pvo.endPage }">
<c:if test="${pageNo == pvo.nowPage}">
<li class="now">${pageNo }</li>
</c:if>
<c:if test="${pageNo != pvo.nowPage}">
<li><a href="list.jsp?cPage=${pageNo }">${pageNo }</a></li>
</c:if>

</c:forEach>

<%-- [다음으로]에 대한 사용가능 여부 처리 --%>
<c:if test="${pvo.endPage < pvo.totalPage }">
<li>
<a href="list.jsp?cPage=${pvo.endPage + 1 }">다음으로</a>
</li>
</c:if>
<c:if test="${pvo.endPage >= pvo.totalPage }">
<li class="disable">다음으로</li>
</c:if>
</ol>
</td>
<td>
<button onclick="javascript:location.href='write.jsp'">
글쓰기
</button>
</td>
</tr>
</tfoot>
</table>
</div>


</body>
</html>

 

 

BbsDAO.java

package com.mystudy.bbs.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import com.mystudy.bbs.mybatis.DBService;
import com.mystudy.bbs.vo.BbsVO;

public class BbsDAO {

//게시글의 전체 데이터 건수 조회
public static int getTotalCount() {
SqlSession ss = DBService.getFactory().openSession();
int totalCount = ss.selectOne("BBS.totalCount");
ss.close();
return totalCount;
}

//페이지에 해당하는 글목록(게시글) 가져오기
public static List<BbsVO> getList(Map<String, Integer> map) {
SqlSession ss = DBService.getFactory().openSession();
List<BbsVO> list = ss.selectList("BBS.list", map);
ss.close();
return list;
}

public static List<BbsVO> getList(int begin, int end) {
Map<String, Integer> map = new HashMap<>();
map.put("begin", begin);
map.put("end", end);

SqlSession ss = DBService.getFactory().openSession();
List<BbsVO> list = ss.selectList("BBS.list", map);
ss.close();
return list;
}


}



 

 

 

 

 

진행중

11_BBS.zip
6.55MB