게시판 쿼리
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)
댓글 남기기