Dev/JSP & Servlet

JSP 게시판 (1) - 페이징, 리스트페이지

창문닦이 2019. 2. 21. 13:40

리스트 페이지(list.jsp)

리스트 페이지 하단에 페이징 처리, 상단에는 게시물 검색 기능을 추가하여 구현했다.

<%@page import="com.util.DBCPConn"%>

<%@page import="java.net.URLEncoder"%>

<%@page import="java.net.URLDecoder"%>

<%@page import="com.util.MyUtil"%>

<%@page import="com.board.BoardDTO"%>

<%@page import="java.util.List"%>

<%@page import="com.board.BoardDAO"%>

<%@page import="com.util.DBConn"%>

<%@page import="java.sql.Connection"%>

<%@ page contentType="text/html; charset=UTF-8"%>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

Connection conn = DBCPConn.getConnection();

BoardDAO dao = new BoardDAO(conn);

MyUtil myutil = new MyUtil();

//넘어온 페이지 번호(MyUtil,article,update,delete)

String pageNum = request.getParameter("pageNum");

//첫시작시 현재페이지 1

int currentPage = 1;

//넘어온 페이지 번호가 존재할 경우 현재페이지에 값 넣어주기

if(pageNum!=null)

currentPage = Integer.parseInt(pageNum);

//검색키와 값

String searchKey = request.getParameter("searchKey");

String searchValue = request.getParameter("searchValue");

//검색어가 있을 경우

if(searchValue!=null){

if(request.getMethod().equalsIgnoreCase("GET")){

searchValue = URLDecoder.decode(searchValue,"UTF-8");

}

}else{//검색어가 없을 경우

searchKey="subject";

searchValue = "";

}

//전체데이터 갯수 구하기

int dataCount = dao.getDataCount(searchKey, searchValue);

//한페이지에 표시할 데이터의 갯수

int numPerPage = 5;

//전체 페이지수 구하기

int totalPage = myutil.getPageCount(numPerPage, dataCount);

//전체페이지수가 표시할 페이지수보다 큰 경우(삭제로 인해)

if(currentPage>totalPage)

currentPage = totalPage;


//데이터베이스에서 가져올 rownum의 시작과 끝

int start = (currentPage-1)*numPerPage+1;

int end = currentPage*numPerPage;

//데이터베이스에서 해당 페이지를 가져온다.

List<BoardDTO> lists = dao.getLists(start, end, searchKey, searchValue);

//검색(기능을 사용할 경우 get방식의 주소에 추가로 적용시켜주겠다. 사용자정의)

String param = "";

if(!searchValue.equals("")){

param = "?searchKey="+searchKey;

param+= "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");

}

//페이징 처리

String listUrl = "list.jsp"+param;

String pageIndexList = myutil.pageIndexList(currentPage, totalPage, listUrl);

//글내용 보기 주소 정리(html에서 onclick의 주소가 너무 기니까 한번에 정리)

String articleUrl = cp+"/board/article.jsp";

if(param.equals("")){

articleUrl += "?pageNum="+currentPage;

//board/article.jsp?pageNum=5

}else{

articleUrl += param + "&pageNum="+currentPage;

//board/article.jsp?searchKey=name&searchValue=suzi&pageNum=5

}

DBCPConn.close();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>게 시 판</title>

<link rel="stylesheet" href="<%=cp %>/board/css/style.css" type="text/css" />

<link rel="stylesheet" href="<%=cp %>/board/css/list.css" type="text/css" />

<script type="text/javascript">

function sendIt(){

var f = document.searchForm;

f.action = "<%=cp %>/board/list.jsp"; 검색버튼을 누를경우 리스트페이지로 이동

f.submit();

}

</script>

</head>

<body>

<div id="bbsList">

<div id="bbsList_title">

게 시 판(JSP)

</div>

<div id="bbsList_header">

<div id="leftHeader">

<form action="" name="searchForm" method="post">

<select name="searchKey" class="selectField">

<option value="subject">제목</option>

<option value="name">작성자</option>

<option value="content">내용</option>

</select>

<input type="text" name="searchValue" value="<%=searchValue %>" class="textField"/>

<input type="button" value="검  색" class="btn2" onclick="sendIt()"/>

</form>

</div>

<div id="rightHeader">

<input type="button" value=" 글올리기 " class="btn2"

onclick="javascript:location.href='<%=cp %>/board/created.jsp';" />

</div>

</div>

<div id="bbsList_list">

<div id="title">

<dl>

<dt class="num">번호</dt>

<dt class="subject">제목</dt>

<dt class="name">작성자</dt>

<dt class="created">작성일</dt>

<dt class="hitCount">조회수</dt>

</dl>

</div>

<div id="lists">

<% for(BoardDTO dto: lists){ %>

<dl>

<dd class="num"><%=dto.getNum() %></dd>

<dd class="subject">

<a href="<%=articleUrl %>&num=<%=dto.getNum() %>">

<%=dto.getSubject() %>

</a>

</dd>

<dd class="name"><%=dto.getName() %></dd>

<dd class="created"><%=dto.getCreated() %></dd>

<dd class="hitCount"><%=dto.getHitCount() %></dd>

</dl>

<% } %>

</div>

<div id="footer">

<p>

<%=pageIndexList %>

<!-- 마우스를 올려놨을때 주황색으로 바뀌도록 a:hover에 스타일 부여함  -->

</p>

</div>

</div>

</div>

</body>

</html>


페이지 클래스(MyUtil.java)

package com.util;

public class MyUtil {

//전체페이지수 구하기

//numPerPage : 한화면에 표시할 데이터 갯수

//dataCount : 전체 데이터 갯수

public int getPageCount(int numPerPage, int dataCount){

int pageCount=0;

pageCount = dataCount/numPerPage;

if(dataCount % numPerPage!=0){ //나머지가 0이 아니면 페이지 하나 더 만듦

pageCount++;

}

return pageCount;

}

//페이징 처리 메소드

//currentPage : 현재 표시할 페이지

//totalPage : 전체 페이지 수

//listUrl : 링크를 설정할 URL(list.jsp)

public String pageIndexList(int currentPage, int totalPage, String listUrl){

int numPerBlock = 5; //리스트밑에 나오는 페이지번호 출력 갯수

int currentPageSetup; //표시할 첫 페이지의 -1 해준 값

int page; //하이퍼링크가 될 page index 숫자

StringBuffer sb = new StringBuffer();

if(currentPage==0 || totalPage==0){ //데이터 없을 경우

return "";

}

//list.jsp

//list.jsp?searchKey=name&searchValue=suzi 검색한내용의 인수와 변수값이 붙음

if(listUrl.indexOf("?")!=-1){//물음표가 있으면

listUrl = listUrl + "&";

//list.jsp?searchKey=name&searchValue=suzi&

}else{

listUrl = listUrl + "?";

//list.jsp?

}

//표시할 첫페이지에서 -1 한 값

currentPageSetup = (currentPage/numPerBlock)*numPerBlock;

//currentPage가 numPerBlock으로 나누어 떨어질 경우

if(currentPage % numPerBlock == 0)

currentPageSetup = currentPageSetup - numPerBlock ;

//◀이전 버튼

if(totalPage>numPerBlock && currentPageSetup>0){

sb.append("<a href=\""+listUrl + "pageNum=" + currentPageSetup + "\">◀이전</a>&nbsp;" );

//<a href="list.jsp?pageNum=5">◀이전</a>&nbsp; 역슬래시로 쌍따옴표가 문자로 인식되게함

}

//바로가기 페이지

page = currentPageSetup+1;//currentPageSetup에 +1한 값 부터 페이지번호가 시작됨

//바로가기 페이지는 전체페이지수보다 커질수없음

while(page<=totalPage && page<=(currentPageSetup+numPerBlock)){

if(page == currentPage){

sb.append("<font color=\"Fuchsia\">"+page+"</font>&nbsp;");

//<font color="Fuchsia">9</font>&nbsp;

}else{

sb.append("<a href=\""+ listUrl + "pageNum=" + page+ "\">"+page+"</a>&nbsp;");

//<a href="list.jsp?pageNum=10">10</a>&nbsp;

}

page++;

}

//다음▶,마지막페이지

if(totalPage - currentPageSetup > numPerBlock){

//총 페이지 12일때, 현재 페이지가 10페이지라면

//numPerBlock 5 보다 작으므로 다음버튼 생성하지않음

sb.append("<a href=\"" + listUrl +"pageNum=" +page + "\">다음▶</a>&nbsp;" );

//<a href="list.jsp?pageNum=11">다음▶</a>&nbsp;

}

return sb.toString();

}

}




인덱스 출력 html 태그

<a href="list.jsp?pageNum=5">◀이전</a>&nbsp;

<a href="list.jsp?pageNum=6">6</a>&nbsp;

<font color="Fuchsia">7</font>&nbsp;

<a href="list.jsp?pageNum=8">8</a>&nbsp;

<a href="list.jsp?pageNum=9">9</a>&nbsp;

<a href="list.jsp?pageNum=10">10</a>&nbsp;

<a href="list.jsp?pageNum=11">다음▶</a>&nbsp;