[MVC2 게시판] 4. 페이징(Paging)

2016. 11. 28. 17:13Programming/JSP

<작동 순서>

1) memList.do 호출

page, totalCount(전체 게시물 수) 세팅

세팅과 동시에 paging()가 실행되며 prev,next,beginPage,endPage가 결정됨


2) dao.selectAllMember(page)

page에 맞춰 startNum, endNum(마지막 게시글번호)이 결정됨.

이것을 SQL에 넣어 startNum ~ endNum에 해당하는 게시글만 리스트에 저장


3) MemberList.jsp에 받아온 paging 객체 정보(page,begin,end,prev,next)를

<jsp:param>을 이용해 paging.jsp로 넘김


4) paging.jsp 구현

paging 객체 정보에 맞게 출력하는 페이지



<memList.do>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@WebServlet("/memList.do")
public class MemberListController extends HttpServlet{
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, IOException {
        MemberDao dao = MemberDao.getInstance();
        int page = 1;
        if(req.getParameter("page")!=null){
            page = Integer.parseInt(req.getParameter("page"));
        }
        Paging paging = new Paging();
        paging.setPage(page);
        paging.setTotalCount(44);
        List<Member> list = dao.selectAllMember(page);
        
        req.setAttribute("memList", list);
        req.setAttribute("paging", paging);
        RequestDispatcher dispatcher = req.getRequestDispatcher("./member/MemberList.jsp");
        dispatcher.forward(req, resp);
    }
}
cs



<Paging 빈>

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
31
32
33
34
35
36
37
38
public class Paging {
    private int page=1//현재 페이지
    private int totalCount; //전체 게시글수
    private int beginPage;    //출력 시작
    private int endPage;    //출력 끝
    private int displayRow = 10;    //한 페이지에 몇 개 row
    private int displayPage = 10;    //한 페이지에 몇 개 페이지
    boolean prev; //prev 버튼이 보일지/안 보일지
    boolean next; //총 페이지 수가 10개 넘는 경우만 true
    
    public void setTotalCount(int totalCount) {
        //이걸 꼭 호출해야 paging이 가능하기 때문에
        //이걸 호출하면 자동으로 paging() 함수 호출하도록 설정
        this.totalCount = totalCount;
        paging();
    }
    private void paging(){
        //displayPage = 10(고정값)
        //prev,next,beginPage,endPage 를 계산해서 만든다.
        endPage = ((page+(displayPage-1))/displayPage)*displayPage;
        beginPage = endPage - (displayPage-1);
        
        //글이 32개라면 필요한 페이지는 4개
        //32/10 = 3.2 올림해서 4
        int totalPage = (int)Math.ceil(totalCount/(double)displayRow);
        if(totalPage<endPage){
            endPage = totalPage;
            next=false;
        }else{
            next=true;
        }
        prev=(beginPage == 1)?false:true
    }
    //나머지는 get/set 메소드는 생략

cs




<MemberDao.멤버 리스트>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public List<Member> selectAllMember(int page){
        //1번 페이지 1~10
        //2번 페이지 11~20
        int startNum = (page-1)*10+1;
        int endNum = page*10;
        System.out.println(startNum+"//"+endNum);
        String sql="SELECT * FROM ("
                +         "SELECT * FROM ("
                +             "SELECT ROWNUM row_num, MEMBER.* FROM "
                +            "MEMBER ORDER BY NUM DESC"
                +         ")PAGING_MEMBER WHERE row_num>=?"
                + ") WHERE row_num <=?";
        List<Member> list = new ArrayList<Member>();
        try {
            System.out.println("DB에 접근하였습니다");
            conn = DBManager.getConnection();
            pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, startNum);
            pstmt.setInt(2, endNum);
            rs = pstmt.executeQuery();
cs



<MemberList.jsp>

1
2
3
4
5
6
7
<jsp:include page="/paging/paging.jsp">
        <jsp:param value="${paging.page}" name="page"/>
        <jsp:param value="${paging.beginPage}" name="begin"/>
        <jsp:param value="${paging.endPage}" name="end"/>
        <jsp:param value="${paging.prev}" name="prev"/>
        <jsp:param value="${paging.next}" name="next"/>
</jsp:include>
cs



<paging.jsp: 게시판 아래 페이지 번호 뷰>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 1~10까지 있는 페이지의 페이징 -->
<c:url var="action" value="/memList.do"/>
<c:if test="${param.prev}">
<a href="${action}?page=1">prev</a>
</c:if>
<c:forEach begin="${param.begin}" end="${param.end}" step="1" var="index">
    <c:choose>
        <c:when test="${param.page==index}">
            ${index}
        </c:when>
        <c:otherwise>
            <a href="${action}?page=${index}">${index}</a>
        </c:otherwise>
    </c:choose>
</c:forEach>
<c:if test="${param.next}">
<a href="${action}?page=11">next</a>
</c:if>
cs


<조인+페이징 결합시 SQL문>

1
2
3
4
5
6
7
SELECT * FROM (" //끝 페이지
        +         "SELECT * FROM (" //시작 페이지
        +             "SELECT ROWNUM row_num, P_B.* FROM (" //페이지 SELECT
        +                 "SELECT b.*, m.name from board b join member m on b.mem_num = m.num //출력할 내용 SELECT
        +             ") P_B WHERE sort=?"
        +         ")PAGING_BOARD  WHERE row_num >= ? "
        + "WHERE row_num <= ?";
cs



'Programming > JSP' 카테고리의 다른 글

[MVC2 게시판] 6. 접근 제한 걸기(Filter 이용)  (0) 2016.12.06
[MVC2 게시판] 5. 파일 업로드  (0) 2016.12.01
[MVC2 게시판] 3. 회원관리  (0) 2016.11.25
[MVC2 게시판] 2. 로그인  (0) 2016.11.25
[MVC2 게시판] 1. 개요  (0) 2016.11.21