티스토리 뷰

JSP

JSP paging(pagenation) 페이징 소스

개발로퍼 2017. 3. 11. 12:38

참조

  • http://blog.whitelife.co.kr/215


JSP에서 게시판을 만들때 등등 pagination을 해야할 때가 많다.

은근히 까다로운 부분이 많아서 만든 기회를 통해 정리를 해보고자 한다.

page가 변동될때마다 get방식으로 "page"라는 변수명으로 url에 전달해준다.


paging.java


public class Paging {     private int pageSize; // 게시 글 수 private int firstPageNo; // 첫 번째 페이지 번호 private int prevPageNo; // 이전 페이지 번호 private int startPageNo; // 시작 페이지 (페이징 네비 기준) private int pageNo; // 페이지 번호 private int endPageNo; // 끝 페이지 (페이징 네비 기준) private int nextPageNo; // 다음 페이지 번호 private int finalPageNo; // 마지막 페이지 번호 private int totalCount; // 게시 글 전체 수 /** * @return the pageSize */ public int getPageSize() { return pageSize; } /** * @param pageSize the pageSize to set */ public void setPageSize(int pageSize) { this.pageSize = pageSize; } /** * @return the firstPageNo */ public int getFirstPageNo() { return firstPageNo; } /** * @param firstPageNo the firstPageNo to set */ public void setFirstPageNo(int firstPageNo) { this.firstPageNo = firstPageNo; } /** * @return the prevPageNo */ public int getPrevPageNo() { return prevPageNo; } /** * @param prevPageNo the prevPageNo to set */ public void setPrevPageNo(int prevPageNo) { this.prevPageNo = prevPageNo; } /** * @return the startPageNo */ public int getStartPageNo() { return startPageNo; } /** * @param startPageNo the startPageNo to set */ public void setStartPageNo(int startPageNo) { this.startPageNo = startPageNo; } /** * @return the pageNo */ public int getPageNo() { return pageNo; } /** * @param pageNo the pageNo to set */ public void setPageNo(int pageNo) { this.pageNo = pageNo; } /** * @return the endPageNo */ public int getEndPageNo() { return endPageNo; } /** * @param endPageNo the endPageNo to set */ public void setEndPageNo(int endPageNo) { this.endPageNo = endPageNo; } /** * @return the nextPageNo */ public int getNextPageNo() { return nextPageNo; } /** * @param nextPageNo the nextPageNo to set */ public void setNextPageNo(int nextPageNo) { this.nextPageNo = nextPageNo; } /** * @return the finalPageNo */ public int getFinalPageNo() { return finalPageNo; } /** * @param finalPageNo the finalPageNo to set */ public void setFinalPageNo(int finalPageNo) { this.finalPageNo = finalPageNo; } /** * @return the totalCount */ public int getTotalCount() { return totalCount; } /** * @param totalCount the totalCount to set */ public void setTotalCount(int totalCount) { this.totalCount = totalCount; this.makePaging(); } /** * 페이징 생성 */ private void makePaging() { if (this.totalCount == 0) return; // 게시 글 전체 수가 없는 경우 if (this.pageNo == 0) this.setPageNo(1); // 기본 값 설정 if (this.pageSize == 0) this.setPageSize(10); // 기본 값 설정 int finalPage = (totalCount + (pageSize - 1)) / pageSize; // 마지막 페이지 if (this.pageNo > finalPage) this.setPageNo(finalPage); // 기본 값 설정 if (this.pageNo < 0 || this.pageNo > finalPage) this.pageNo = 1; // 현재 페이지 유효성 체크 boolean isNowFirst = pageNo == 1 ? true : false; // 시작 페이지 (전체) boolean isNowFinal = pageNo == finalPage ? true : false; // 마지막 페이지 (전체) int startPage = ((pageNo - 1) / 10) * 10 + 1; // 시작 페이지 (페이징 네비 기준) int endPage = startPage + 10 - 1; // 끝 페이지 (페이징 네비 기준) if (endPage > finalPage) { // [마지막 페이지 (페이징 네비 기준) > 마지막 페이지] 보다 큰 경우 endPage = finalPage; } this.setFirstPageNo(1); // 첫 번째 페이지 번호 if (isNowFirst) { this.setPrevPageNo(1); // 이전 페이지 번호 } else { this.setPrevPageNo(((pageNo - 1) < 1 ? 1 : (pageNo - 1))); // 이전 페이지 번호 } this.setStartPageNo(startPage); // 시작 페이지 (페이징 네비 기준) this.setEndPageNo(endPage); // 끝 페이지 (페이징 네비 기준) if (isNowFinal) { this.setNextPageNo(finalPage); // 다음 페이지 번호 } else { this.setNextPageNo(((pageNo + 1) > finalPage ? finalPage : (pageNo + 1))); // 다음 페이지 번호 } this.setFinalPageNo(finalPage); // 마지막 페이지 번호 } /*@Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); }*/ }


Paing.java 클래스를 통해서 페이지 관련 변수들을 불러들이는 함수를 만들어둔다.


페이지를 나눌때 고려할 부분은 "한 페이지에 몇개의 리스트를 불러오느냐" 인데, 이 부분을 SQL 쿼리문으로 조절을 해주어야 한다.



BoardAction.java

public class BoardAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) { // TODO Auto-generated method stub BoardDAO dao = new BoardDAO(); ArrayList list;

int totalCount = dao.getTotalCount(); int page = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page")); Paging paging = new Paging(); paging.setPageNo(page); //get방식의 parameter값으로 반은 page변수, 현재 페이지 번호 paging.setPageSize(10); // 한페이지에 불러낼 게시물의 개수 지정 paging.setTotalCount(totalCount); page = (page - 1) * 10; //select해오는 기준을 구한다. list = dao.getList(page, paging.getPageSize()); request.setAttribute("list", list); request.setAttribute("paging", paging); } }



Action 부분에서 DAO에 값을 지정해주고 View페이지에 값을 전달해주는 역할을 한다. Controller 역할



Action.java


public interface Action {
	public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException;
}



BoardDAO.java


public class BoardDAO {
	DBCP dbcp = new DBCP();
	Connection conn = null;
	PreparedStatement pstmt = null;
	Statement stmt = null;
	ResultSet rs = null;
	String sql = null;
	
	public void closeDB() {
		try {
			if(rs != null) rs.close();
			if(stmt != null) stmt.close();
			if(pstmt != null) pstmt.close();
			if(conn != null) conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public ArrayList getList(int startRow, int endRow) {

		ArrayList list = new ArrayList();
		
		try {
			conn = dbcp.getConnection();
			
			sql = "select *, (select u_name from user where idx = writer_fk) writer, (select idx from answer where idx = answer_fk) answer from board order by idx desc limit "+startRow+", "+endRow;
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			
			while(rs.next()) {
				int idx = rs.getInt("idx");
				String title = rs.getString("title");
				int count = rs.getInt("count");
				String writer = rs.getString("writer");
				String answer = rs.getString("answer");
				String enroll = rs.getString("enroll");
				
				BoardDTO dto = new BoardDTO();
				dto .setIdx(idx);
				dto .setTitle(title);
				dto .setCount(count);
				dto .setWriter(writer);
				dto .setAnswer(answer);
				dto .setEnroll(enroll);
				list.add(dto);
			}
			
		} catch (Exception e){
			e.printStackTrace();
		} finally {
			closeDB();
		}
		return list;
	}
	
	public int getTotalCount(){
		int total = 0;
		
		try {
			conn = dbcp.getConnection();
			
			sql = "select count(*) from board";
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			if(rs.next()){
				total = rs.getInt(1);
			}
		} catch (Exception e){
			e.printStackTrace();
		} finally {
			closeDB();
		}
		return total;
	}
}


BoardController.java


/**
 * Servlet implementation class BoardController
 */
@WebServlet("*.do")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public BoardController() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		String requestURI = request.getRequestURI();
		String[] URIList = requestURI.split("/");
		String cmdURI = URIList[URIList.length-1];
		
		Action action = null;
		
		if(cmdURI.equals("board.do")) {
			action = new BoardAction();
			action.execute(request, response);
			
			RequestDispatcher dis = request.getRequestDispatcher("board.jsp");
			dis.forward(request, response);
		}
	}
}



이제 View Page에서 어떻게 출력하느냐이다.

JSTL 문법을 이용해서 구현하였다.



board.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>



function PageMove(page){
				location.href = "board.do?page="+page;
			}

'JSP' 카테고리의 다른 글

Session 관리하기  (0) 2016.12.01
Http통신을 이용한 JSON 받아오기  (0) 2016.11.25
금액) 숫자 세자리마다 , 넣어주기  (0) 2016.10.25
다음 우편번호 주소 API 사용하기  (1) 2016.10.21
댓글
최근에 올라온 글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday