CAFE

A조

[예제] 게시판 목록 기능 (다음, 이전 버튼 및 페이지 클릭 기능)

작성자최주호|작성시간12.05.29|조회수897 목록 댓글 1

게시판 목록 구현하기(이전, 다음, 페이지 이동)

- 이전, 다음 버튼으로 페이지간 이동 구현

- 페이지 클릭 시 해당 페이지 구현

- 제목 클릭 시 내용보기 기능 (미구현)

- 10개 단위로 출력기능 (마지막 페이지는 10개 아니어도 됨)


* 구현설명

게시물 10개씩 불러올때 전체 데이터를 가져오지 않고 인덱스값만 전체 불러온 뒤,

해당 페이지에 맞는 글만 10개 출력하도록 수정 (DB 서버의 작업부담을 덜기 위함)



소스코드

첨부파일 AndroidServer.zip










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;

           }

}





다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자최주호 작성자 본인 여부 작성자 | 작성시간 12.05.29 실력부족으로 최적화 따위는 엄두를 못냈다. 반나절 만에 끝내긴 했다만 웹프로그래밍도 만만치 않음을 느꼈다. ㅡ_ㅡ;
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼