ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 게시판 페이징 만들기
    개발 2011. 6. 1. 00:58
    게시판 페이징을 구성할 때 클래스로 미리 만들어 놓고 간단하게 호출해서 사용하곤 했는데, 그렇게 쓰다 보니 점차 불편한 점이 보였다.

    1. 페이징을 클래스로 만들다 보니 적용후에는 웹서버를 재시작할 필요가 생겼다. 개발서버라면 크게 문제가 되지 않지만 실서버일 경우 함부로 서버를 내릴 수 없다.
    2. 디자인을 포함하다보니 디자인을 수정하기가 쉽지 않다.

    그래서 jsp로 재편을 했다. 다른 라이브러리를 사용할 수 없는 경우가 있을 수도 있어서 JSTL은 사용하지 않았다.

    페이징을 구성하기 위해서는 우선 게시물의 총 갯수를 알아야 한다. 그래서 페이지를 나눌 수 있다.
    한 페이지에 표시할 목록의 갯수가 필요하고, 페이지를 이동할 수 있도록 현재 페이지 번호가 필요하다.
    또 검색을 포함한 경우 페이지를 이동했을때 검색어에 대한 정보도 필요하다.
    페이지가 너무 많으면 단락별로 이동이 가능하도록 한 단락에 표시할 수 있는 페이지의 갯수도 필요하다.

    [페이징을 위한 변수선언]
    <%
    String tmpPage = request.getParameter("pageNum");
    int pageNum = tmpPage == null || tmpPage.equals("") ? 1 : Integer.parseInt(tmpPage);
    int listRow = 10;
    int pageRow = 10;
    String link = "";

    String keyword = request.getParameter("keyword");
    String search = request.getParameter("search");
    HashMap<String, Object> param = new HashMap<String, Object>();

    if(keyword != null && !keyword.equals("")){
        param.put("keyword", keyword);
        link = "&amp;keyword="+keyword;
    }
    if(search != null && !search.equals("")){
        param.put("search", search);
        link = "&amp;search="+search;
    }
    param.put("offset", (pageNum-1) * listRow);
    param.put("limit", listRow);
    List memberList = mManager.getMemberList(param);
    int total = mManager.getMemberListCount(param);
    %>


    [페이징 구현부분]
    <%
            int page_total = (int)Math.ceil((float)total/listRow);
           
            StringBuilder sb_page = new StringBuilder();
            String uri = request.getRequestURI();
           
            int co = (int)((float)pageNum/pageRow);
            if((pageNum % pageRow) != 0)
                co++;
           
            int start_page = ((co-1) * pageRow) + 1;
            int end_page = start_page + pageRow - 1;
           
            // 맨처음
            sb_page.append("<a href=\""+uri+"?pageNum=1"+link+"\" >첫페이지</a>");
           
            // 이전단락
            if(pageNum > pageRow){
                int pre = end_page - pageRow;
                sb_page.append("&nbsp;<a href=\""+uri+"?pageNum="+pre+link+"\" class='prev'>이전단락</a>");
            }
           
            // 페이지
            if(page_total < end_page)
                end_page = page_total;
           
            for(int i = start_page; i <= end_page; i++){
                if(i == pageNum){
                    sb_page.append("&nbsp;<span style=\"color:red;\">"+i+"</span>");
                }
                else{
                    sb_page.append("&nbsp;<a href=\""+uri+"?pageNum="+i+link+"\" class='page_type'>"+i+"</a>");
                }
               
                // 마지막 페이지에는 페이지 구분문자('|')를 붙이지 않는다.
                if(i != end_page){
                    //sb_page.append(" | ");
                }
            }
           
            // 다음단락
            if(end_page < page_total){
                int next = end_page+1;
                sb_page.append("&nbsp;<a href=\""+uri+"?pageNum="+next+link+"\" class='prev'>다음단락</a>");
            }
           
            // 맨마지막
            sb_page.append("&nbsp;<a href=\""+uri+"?pageNum="+page_total+link+"\" >마지막페이지</a>");
           
            // 페이징이 필요한 경우에만 표시
            if(start_page <= end_page){
                out.println(sb_page.toString());
            }
    %>

    mysql 경우  limit 쿼리를 이용해 페이징을 분리할 수 있는데,
    분리가 되는 오프셋은 (pageNum-1) * listRow 로 구할 수 있다.
    즉, 현재 페이지가 1이면 오프셋은 0이 되고 1페이지이면 오프셋이 listRow가 된다.

    반응형

    댓글

Designed by Tistory.