JSP

 

 

 

게시판 쿼리

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">
			 		 	&nbsp;
			 		 </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'>"
   				+ "  &laquo;</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'>"
   				+ "  &raquo;</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 방식의 처리에는 다르게 나올 수도 있습니다.

 

 

 

 

 

about author

PHRASE

Level 60  라이트

모든 사람들이 원망하고 번민하고 탐욕하는 속에서 나 혼자만이라도 벗어나 마음 편히 살자. -법구경

댓글 ( 4)

댓글 남기기

작성