# 게시판 목록 구현하기(이전, 다음, 페이지 이동)
- 이전, 다음 버튼으로 페이지간 이동 구현
- 페이지 클릭 시 해당 페이지 구현
- 제목 클릭 시 내용보기 기능 (미구현)
- 10개 단위로 출력기능 (마지막 페이지는 10개 아니어도 됨)
* 구현설명
게시물 10개씩 불러올때 전체 데이터를 가져오지 않고 인덱스값만 전체 불러온 뒤,
해당 페이지에 맞는 글만 10개 출력하도록 수정 (DB 서버의 작업부담을 덜기 위함)
소스코드
qnaList.jsp 파일
<%@page import="java.util.Collections"%>
<%@page import="java.util.Arrays"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.ArrayList"%>
<%@page import="bbs.QnABBS"%>
<%@ page import="java.sql.*" language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
ArrayList<QnABBS> list = null;
Integer[] itemIndexs = null;
ArrayList<Integer[]> pages = null;
ArrayList<Integer> pageNums = null;
int maxPageNum = 5;
int maxIdx = 10;
int currentPage = 1;
boolean isRestExist = true;
boolean isNextExist = false;
boolean isPrevExist = false;
%>
<%
list = new ArrayList<QnABBS>();
itemIndexs = new Integer[maxIdx];
pages = new ArrayList<Integer[]>();
pageNums = new ArrayList<Integer>();
request.setCharacterEncoding("UTF-8");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String db_id = "hr";
String db_pw = "1111";
String tableName = "QNA";
Connection con = null;
Statement st = null;
ResultSet rs = null;
try{
String sql = "SELECT id FROM " + tableName + " ORDER BY id DESC";
Class.forName("oracle.jdbc.OracleDriver");
con = DriverManager.getConnection(url, db_id, db_pw);
st = con.createStatement();
rs = st.executeQuery(sql);
pageNums.add(1);
int index = 0;
int pageNum = 1;
int totalIndex = 1;
while(rs.next()){
if(totalIndex % maxIdx == 1 && totalIndex != 1){// 페이지 당 글 수가 11개되는 순간 페이지 수 증가
pageNums.add(++pageNum);
}
String temp = rs.getString("id"); // 글번호만 로드 (선택 페이지의 글목록은한 번 만 하기 위해)
int idx = Integer.parseInt(temp);
itemIndexs[index] = idx;
index++; // 페이지 당 글번호 증가
if(index == maxIdx) // 글(index)가 10이 되면 페이지 수 1개 증가
{
pages.add(itemIndexs);
itemIndexs = null;
itemIndexs = new Integer[maxIdx];
index = 0;
}
totalIndex++; // 총 글(totalIndex) 번호 증가
if(index == 10){// 글이 10개가 되면 마지막 페이지의 글이 0개가 됨
isRestExist = false;
}
}
if(isRestExist){ // 마지막 페이지가 글 수가 10개 미만일때에 대한 조치
Integer[] tempArray;
tempArray = Arrays.copyOfRange(itemIndexs, 0, index);
pages.add(tempArray);
}
// 현재 페이지 로딩
String temp = request.getParameter("page");
if(temp == null){ // 페이지 번호를 클릭안한 경우 기본페이지(1페이지) 로딩
currentPage = 1;
}
else // 페이지 번호 클릭 시 해당번호 페이지 로딩
{
currentPage = Integer.parseInt(temp);
}
itemIndexs = null;
itemIndexs = pages.get(currentPage - 1); // 현재 페이지의 글번호 가져오기
int minIndex = itemIndexs[itemIndexs.length - 1]; // 최근 글번호(큰 수)
int maxIndex = itemIndexs[0]; // 나중 글번호(작은 수)
sql = "SELECT * FROM " + tableName + " WHERE id >= " +
minIndex + " AND id <= " + maxIndex + " ORDER BY id DESC";
rs = st.executeQuery(sql);
while(rs.next()){// 현재 페이지의 글에 대한 정보 리스트에 담기
QnABBS qna = new QnABBS();
qna.setId(rs.getString("id"));
qna.setName(rs.getString("name"));
qna.setSubject(rs.getString("subject"));
qna.setContent(rs.getString("content"));
qna.setDate(rs.getString("write_date"));
list.add(qna);
}
for(QnABBS q : list){// 리스트에 있는 글 정보 모두 출력하기
out.println("<p>");
out.println("<tr>");
out.println("<td>");
out.print(q.getId());// 글번호
out.println("</td>");
out.println("<td>");
/* out.println("<a href=memoView.jsp?idx=" + m.getId() + ">") */
out.print(q.getSubject());// 글제목
out.print("</a>");
out.println("</td>");
out.println("<td>");
out.print(q.getName());// 작성자 이름
out.println("</td>");
out.println("<td>");
out.println(q.getDate().substring(0, 10));// 날짜만 가져오기
out.println("</td>");
out.println("</tr>");
out.println("</p>");
}
// 페이지 표시를 위한 세팅값
int pageMaxLimit = pageNums.get(pageNums.size() - 1);
int pageMinLimit = pageNums.get(0);
int tempNum = 0;
int limitPage = 0;
// 이전버튼 표시
isPrevExist = false;
String strPrev = "[이전]";
limitPage = maxPageNum + pageMinLimit; // 이전버튼이 존재하기 위한 조건
if(currentPage >= limitPage){ // 뒷페이지 보다 앞설 경우
if(currentPage % maxPageNum == 1 && currentPage != 1){ // 이전 버튼 바로뒷페이지 인 경우 다음버튼 누르면 5페이지 감소
tempNum = maxPageNum; // 1페이지는 제외
isPrevExist = true;
}
else if(currentPage > maxPageNum + 1){// 기본 출력 6번째 페이지보다 큰 경우 잔여페이지 + 4페이지 만큼 감소
if(currentPage % maxPageNum == 0){
tempNum = maxPageNum * 2 - 1;
}
else{
tempNum = currentPage % maxPageNum + maxPageNum - 1;
}
isPrevExist = true;
}
int pagePrevNum = currentPage - tempNum; // 링크 누르면 이동할 페이지 설정
if(isPrevExist) out.print("<a href=qnaList.jsp?page=" + pagePrevNum +">" + strPrev + "</a>" );
else out.print(strPrev);
}
// 페이지 번호 출력
ArrayList<Integer> tempNums = new ArrayList<Integer>();
int i = 0;
int j = 0;
// 현재 페이지가 한 화면에 보여지는 최대 페이지 수 중 몇번째인지 검사
if(currentPage % maxPageNum == 0) // 현재페이지가 한화면에 보여질 수 있는 마지막페이지인 경우
{
int quotient = currentPage / maxPageNum; // 현재페이지를 나눈 몫 예) 5페이지면 몫이 1이다.
int tempIndex = quotient * maxPageNum - maxPageNum + 1; // 몫 1 * 최대페이지수 5 - 가중치(최대페이지수) 5 + 1(글번호 시작숫자)
for(i = 0, j=tempIndex; i < maxPageNum; i++, j++){// 계산하면 1페이지부터5페이지까지 저장함
tempNums.add(j);
}
}
else if(currentPage > maxPageNum){ // 현재페이지가 6페이지 이상이면서 한화면에 보여질 수 있는 마지막페이지가 아닌 경우
int quotient = currentPage / maxPageNum; // 현재페이지를 나눈 몫 예) 10페이지면 몫이 2이다.
int tempIndex = quotient * maxPageNum + 1; // 몫 2 * 최대페이지수 5 + 1(글번호 시작숫자)
for(i = 0, j=tempIndex; i < maxPageNum; i++, j++){// 계산하면 11페이지부터15페이지까지 저장함
tempNums.add(j);
if(j==pageMaxLimit) break; // 최대 페이지이면 그만 저장
}
}
else if(currentPage < maxPageNum){ // 현재페이지가 5페이지 미만인 경우
for(i=0; i < maxPageNum; i++){
tempNums.add(i + 1);// 1페이지부터 5페이지까지 저장함
}
}
for(Integer num : tempNums){// 저장된 페이지 숫자 출력
if(currentPage != num) out.print("<a href=qnaList.jsp?page=" + num +">"); // 현재 페이지는 링크안건다.
out.print(new Integer(num).toString());
if(currentPage != num) out.println("</a>");
}
tempNums.removeAll(tempNums); // 초기화
// 다음버튼 표시
isNextExist = false;
String strNext = "[다음]";
limitPage = pageMaxLimit - pageMaxLimit % maxPageNum; // 다음버튼이 존재하기 위한조건
if(currentPage <= limitPage){ // 뒷페이지 보다 앞설 경우
if(currentPage % maxPageNum == 0){ // 다음 버튼 바로 앞페이지 인 경우 다음버튼 누르면 1페이지 증가
tempNum = 1;
isNextExist = true;
}
else if(currentPage > maxPageNum){// 기본 출력 5페이지보다 큰 경우 잔여페이지 만큼 증가
tempNum = maxPageNum - currentPage % maxPageNum + 1;
isNextExist = true;
}
else if(currentPage < maxPageNum){ // 기본 출력 5페이지보다 작은 경우 역시잔여 페이지 만큼 증가
tempNum = maxPageNum - currentPage + 1;
isNextExist = true;
}
int pageNextNum = currentPage + tempNum; // 링크 누르면 이동할 페이지 설정
if(isNextExist) out.print("<a href=qnaList.jsp?page=" + pageNextNum +">" + strNext + "</a>" );
else out.print(strNext);
}
} catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e){
e.printStackTrace();
}
finally{
try{
if(rs != null) rs.close();
if(st != null) st.close();
if(con != null) con.close();
} catch(SQLException e){
e.printStackTrace();
}
}
%>
QnABBS.java 파일
package bbs;
public class QnABBS {
private String id;
private String name;
private String subject;
private String content;
private String date;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}