게시판 쿼리
CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1 MAXVALUE 9999999999999999999999 NOMINVALUE NOORDER NOCYCLE NOCACHE; -- 또다른 maxvalue 무한설정 CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT by 1 NOMAXVALUE nocache; drop table board; create table board( num number primary key, writer varchar2 (20), email varchar2(50), subject varchar2(50), password varchar2(10), reg_date Date, ref number, re_step number, re_level number, readcount number, content varchar2(3000) );
페이징 처리를 위한 더미 데이터 생성 하기 ORACLE
SQL
declare i number := 1; begin while i <=567 loop insert INTO BOARD (NUM, WRITER, EMAIL, SUBJECT, PASSWORD, REG_DATE, REF, RE_STEP, RE_LEVEL, READCOUNT, CONTENT) VALUES((select nvl(max(num)+1,1) from board), CONCAT ((select nvl(max(num)+1,1) from board), ' - writer'), ' - email', CONCAT ((select nvl(max(num)+1,1) from board), ' - subject'), '-0', sysdate, (select nvl(max(num)+1,1) from board), 0, 0, 0, CONCAT ((select nvl(max(num)+1,1) from board), ' - content')); i := i+1; end loop; end ; commit;
class BoardBean
public class BoardBean { private int num; private String writer; private String email; private String subject; private String password; private String reg_date; private int ref; private int re_step; private int re_level; private int readcount; private String content;
class BoardDAO
//모든 (화면에 보여질 데이터를 10개씩 추출해서 리턴하는 메소드 public Vector<BoardBean> getAllBoard(int startRow, int endRow) { //리넡할 객체 선언 Vector<BoardBean> v =new Vector<>(); getCon(); try{ //쿼리 준비 String sql ="select * from " + " (select A.* , Rownum Rnum from (select * from board order by ref desc, re_step asc) A ) " + " where Rnum >= ? and Rnum <= ?"; //쿼리를 실행할객체 선언 pstmt =con.prepareStatement(sql); //쿼리실행 후 결과 저장 pstmt.setInt(1, startRow); pstmt.setInt(2, endRow); rs=pstmt.executeQuery(); //데이터 개수가 몇개인지 모르기에 반복문을 이용하여 데이터를 추출 while(rs.next()){ //데이터를 패키징( 가방 = Boardbean 클래스를 이용)해줌 BoardBean bean =new BoardBean(); bean.setNum(rs.getInt("num")); bean.setWriter(rs.getString("WRITER")); bean.setEmail(rs.getString("EMAIL")); bean.setSubject(rs.getString("SUBJECT")); bean.setPassword(rs.getString("PASSWORD")); bean.setReg_date(rs.getDate("REG_DATE").toString()); bean.setRef(rs.getInt("ref")); bean.setRe_step(rs.getInt("RE_STEP")); bean.setRe_level(rs.getInt("RE_LEVEL")); bean.setReadcount(rs.getInt("READCOUNT")); bean.setContent(rs.getString("CONTENT")); //패키징한 데이터를 벡터에 저장 v.add(bean); } }catch(Exception e){ e.printStackTrace(); }finally{ //자원 반납 closed(); } return v; }
class BoardListCon
package control; import java.io.IOException; import java.util.Vector; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import model.BoardBean; import model.BoardDAO; import model.Paging; @WebServlet("/BoardListCon.do") public class BoardListCon extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { reqPro(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { reqPro(request, response); } protected void reqPro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.페이징 객체 생성 페이지의 넘버값을 읽어드림 Paging paging =new Paging(request.getParameter("pageNum")); BoardDAO bdao =new BoardDAO(); //2.페이징 객체에 전체페이지를 넘겨줌, Paging 클래스에서 페이지 계산 처리 됨 paging.setTotalCount(bdao.getAllCount()); //3.페이지가 넘어갈 url 주소 paging.paginHtml("BoardListCon.do"); //페이징 객체에서 계산 처린된 row 값 최신글 10개를 기준으로 게시글을 리턴 받아주는 메소드 호출 Vector<BoardBean> v =bdao.getAllBoard(paging.getStartRow(), paging.getEndRow()); /////// BoardList.jsp 쪽으로 request 객체에 담아서 넘겨줌 request.setAttribute("v",v); request.setAttribute("paging", paging); RequestDispatcher dis =request.getRequestDispatcher("BoardList.jsp"); dis.forward(request, response); } }
BoardList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <jsp:include page="Header.jsp"/> </head> <body> <!-- 게시글 보기에 카운터링을 설정하기위한 변수들을 선언 --> <div class="row"> <div class="col-xs-2"></div> <div class="col-xs-8 col-md-8"> <h2 class="text-center">전체 게시글 보기 </h2> <p class="text-right"> <input type="button" value="글쓰기" onclick="location.href='BoardWrite.jsp'" class="btn btn-warning"> </p> <div class="table-responsive"> <table class="table table-bordered table-striped" > <tr> <th>번호</th> <th>제목</th> <th>작성자</th> <th>작성일</th> <th>조회수</th> </tr> <c:set var="cnumber" value='${paging.number }' /> <c:forEach items="${v }" var="bean"> <tr> <td>${cnumber }</td> <td><a href="BoardInfo.jsp?num=${bean.num}" > <c:if test="${ bean.re_step >1}"> <c:forEach begin="${bean.re_step }" end="${(bean.re_step -1)*5 }" var="j"> </c:forEach> </c:if> ${bean.subject } </a></td> <td>${bean.writer }</td> <td>${bean.reg_date}</td> <td>${bean.readcount}</td> </tr> <c:set var="cnumber" value='${cnumber-1 }' /> </c:forEach> <tr> <td colspan="5" class="text-center"> <!-- 페이지징 처리 호출 --> ${paging.html } </td> </tr> </table> </div> </div> </div> <jsp:include page="Bottom.jsp"/> </body> </html>
class Paging
다음 소스는 macaronics.net 의 관리자이자 개발자인 제가 부트스트랩 환경에 맞게 만든 소스 입니다.
package model; public class Paging { //화면에 보여질 게시글의 개수를 지정 private int pageSize=10; private int count =0; //전체 글의 갯수를 저장하는 변수 private int number =0; //페이지 넘버링 변수 private String pageNum; private int startRow; private int endRow; private int currentPage; private int pageCount; private int startPage; private int pageBlock=10;//카운터링 처리 숫자 private int endPage; private int prev; //이전 private int next; //다음 private String html; public Paging(String pageNum) { //만약 처음 boardList.jsp를 클릭하거나 수정 삭제 등 다른 게시글에서 이 페이지로 넘어오면 pageNum값이 없기에 null 처리를 해줌 if(pageNum==null){ pageNum="1"; } this.pageNum=pageNum; //전체 보고자 하는 페이지숫자를 저장 currentPage =Integer.parseInt(pageNum); } public void setTotalCount(int count){ this.count=count; //현재 페이지에 보여줄 시작 번호를 설정 = 데이터 베이스에서 불러올 시작번호 startRow =(currentPage-1) *pageSize+1; endRow =currentPage * pageSize; //테이블에 표시할 번호를 지정 this.number =count - (currentPage -1 ) * pageSize; //페이지 계산 pageCaculator(); } public void pageCaculator(){ if(count >0){ pageCount =count /pageSize + (count%pageSize == 0 ? 0 :1) ; //카우터링 숫자를 얼마까지 보여줄건지 결정 //시작 페이지 숫자를 설정 startPage =1; if(currentPage %10 !=0){ startPage =(int)(currentPage/10)*10+1; }else{ startPage =((int)(currentPage/10)-1)*10+1; } endPage =startPage+pageBlock-1;//화면에 보여질 페이지의 마지막 숫자 if(endPage > pageCount) endPage =pageCount; //이전 다음 if(startPage >pageSize) prev =startPage-10; //다음 if(endPage < pageCount) next=startPage+10; } } public void paginHtml(String url){ String html= "<nav><ul class='pagination'>"; //처음 if(startPage >pageSize){ html +="<li><a href='"+url+"?pageNum="+1+"' aria-label='Previous'><span aria-hidden='true'>" + " 처음</span></a></li>"; } //이전이라는 링크를 만들건지 파악 if(startPage >pageSize){ html +="<li><a href='"+url+"?pageNum="+prev+"' aria-label='Previous'><span aria-hidden='true'>" + " «</span></a></li>"; } //페이징 처리 String active=""; for(int i=startPage; i<endPage; i++){ if(i==Integer.parseInt(pageNum)) active ="class='active'"; else active=""; html +="<li " +active+" ><a href='"+url+"?pageNum="+i+"'>"+i+"<span class='sr-only'>(current)</span></a></li>"; } //다음 이라는 링크를 만들건지 파악 if(endPage < pageCount ){ html +="<li><a href='"+url+"?pageNum="+next+"' aria-label='next'><span aria-hidden='true'>" + " »</span></a></li>"; } //다음 이라는 링크를 만들건지 파악 if(endPage < pageCount ){ html +="<li><a href='"+url+"?pageNum="+pageCount+"' aria-label='next'><span aria-hidden='true'>" + " 마지막</span></a></li>"; } html +="</ul></nav>"; this.html=html; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public int getStartRow() { return startRow; } public void setStartRow(int startRow) { this.startRow = startRow; } public int getEndRow() { return endRow; } public void setEndRow(int endRow) { this.endRow = endRow; } public String getHtml() { return html; } public void setHtml(String html) { this.html = html; } }
사용법은 간단 합니다. 위 클래스를 넣은 후
페리지 목록에서 순서에 맞게 다음과 같이 처리 하면 됩니다.
//1.페이징 객체 생성 페이지의 넘버값을 읽어드림 Paging paging =new Paging(request.getParameter("pageNum")); BoardDAO bdao =new BoardDAO(); //2.페이징 객체에 전체페이지를 넘겨줌, Paging 클래스에서 페이지 계산 처리 됨 paging.setTotalCount(bdao.getAllCount()); //3.페이지가 넘어갈 url 주소 paging.paginHtml("BoardListCon.do"); //페이징 객체에서 계산 처린된 row 값 최신글 10개를 기준으로 게시글을 리턴 받아주는 메소드 호출 Vector<BoardBean> v =bdao.getAllBoard(paging.getStartRow(), paging.getEndRow());
출력 할때에는 다음과 같이 EL 태그로 사용하면 됩니다.
${paging.html }
위 소스는 오라클 전용이고, 오라클에서도 다음과 같은 오라클 쿼리문으로 작성 할 경우에만 해당 됩니다.
String sql ="select * from "
+ " (select A.* , Rownum Rnum from (select * from board order by ref desc, re_step asc) A ) "
+ " where Rnum >= ? and Rnum <= ?";
즉, 오라클 에서 between A and B 방식의 처리에는 다르게 나올 수도 있습니다.
댓글 ( 4)
댓글 남기기