본문 바로가기
Spring Framework

jsp 게시글 페이징 처리 / 페이지네이션

by 자유코딩 2018. 2. 23.

 

 

소스 코드 첨부 (페이지 클래스)

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.dbtest.dao;
 
public class PageMaker {
    private int totalcount;//전체 게시물 개수
    private int countlist;
    private int pagenum;//첫페이지를 표시하기 위함, 페이지 번호를 나타낸다
    private int contentnum=10;//한페이지에 몇개 보일지
    private int startPage=1;//beginpage 디폴트 1
    private int endPage=5;//endpage 디폴트 5
    private boolean prev=false;//이전 페이지 화살표
    private boolean next;//다음 페이지 화살표
    private int currentblock=1;
    private int lastblock;
    
    public boolean isPrev() {
        return prev;
    }
 
    public void setPrev(boolean prev) {
        this.prev = prev;
    }
 
    public boolean isNext() {
        return next;
    }
 
    public void setNext(boolean next) {
        this.next = next;
    }
 
    public int getStartPage() {
        return startPage;
    }
 
    public void setStartPage(int currentblock) {
        this.startPage = (currentblock*5)-4;
        //한 페이지에 5개씩 보여지므로
        //현재 페이지 블록의 번호 * 블록당 페이지의 개수(5) - 4를 하면 시작 페이지 번호를 정할 수 있다
    }
 
    public int getEndPage() {
        return endPage;
    }
 
    public void setEndPage(int getlastblock,int getcurrentblock) {
        if (getlastblock==getcurrentblock) {
            this.endPage = calcpage(getTotalcount(),getContentnum());
        }
        else {
            this.endPage = getStartPage()+4;
        }
        //기본 시작페이지 +4
        //조건 , 마지막 페이지 블록이면 마지막 페이지 번호
    }
    
 
    public int getCurrentblock() {
        return currentblock;
    }
 
    public void setCurrentblock(int pagenum) {//현재 페이지 블록의 번호가 몇번인지 지정해주는 함수
//        페이지번호 / 페이지 그룹 안의 페이지 개수(5)
//        ->나머지 있으면 더하기 1한다. -> 이 결과를 현재 블록 번호라고 부른다. cblock
 
        this.currentblock = pagenum/5;
        if (pagenum%5>0) {
            this.currentblock++;
        }
    }
 
    public int getLastblock() {
        return lastblock;
    }
 
    public void setLastblock(int totalcount) {//마지막 페이지 블록의 번호가 뭔지 지정해주는 함수
        //전체 글 개수를 사용해서 지정한다
        this.lastblock = totalcount / (5*this.contentnum);
        if (totalcount%(5*this.contentnum)>0) {
            this.lastblock++;
        }
//        전체 글 개수(128) / 페이지 그룹 안의 페이지 개수(5) * 한페이지당 글 개수(10)
//        ->나머지 있으면 더하기 1한다. -> 이 결과를 마지막 블록 번호라고 부른다. last block
    }
 
    public void prevnext(int pagenum) {
        
        if (pagenum>0 && pagenum<6) {
            setPrev(false);
            setNext(true);
        }
        else if(getLastblock()==getCurrentblock()) {//5개씩 페이지의 그룹번호를 지정한다.
            //그룹 번호가 3이라는 것은 해당 페이지 그룹이 마지막이라는 것이기에 이전 화살표만 활성화한다

            //이 두개가 같다면 마지막 블록이므로 이전만 있고 이후가 없다.

            setPrev(true);
            setNext(false);        
        }
        else {
            setPrev(true);
            setNext(true);
        }
    }
    public int calcpage(int totalcount,int contentnum) {//전체 몇페이지까지 있을지 함수로 계산한다
        int totalpage = totalcount/contentnum;//전체 게시물 수를 한 페이지당 몇개 보이는지로 나눈다
        if (totalcount % contentnum>0) {//그리고 나머지가 있다면 1을 더해서 한 페이지 증가 시킨다
            totalpage++;
        }
        if (totalpage<this.pagenum) {
            this.pagenum=totalpage;
        }
        return totalpage;//페이지 개수를 리턴한다
    }
 
    public int getTotalcount() {
        return totalcount;
    }
 
    public void setTotalcount(int totalcount) {
        this.totalcount = totalcount;
    }
    public int getCountlist() {
        return countlist;
    }
 
    public void setCountlist(int countlist) {
        this.countlist = countlist;
    }
 
    public int getPagenum() {
        return pagenum;
    }
 
    public void setPagenum(int pagenum) {
        this.pagenum = pagenum;
    }
 
    public int getContentnum() {
        return contentnum;
    }
 
    public void setContentnum(int contentnum) {
        this.contentnum = contentnum;
    }
    
 
}
 
cs

 

 

 

 

컨트롤러 클래스

 

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
@RequestMapping("/list")
    public String list(HttpServletRequest request) {
        PageMaker pagemaker = new PageMaker();
        String pagenum = request.getParameter("pagenum");//페이지 값을 입력 받는다.
        String contentnum = request.getParameter("contentnum");//한 페이지에 몇개 보일지
        System.out.println(contentnum);
        int cpagenum = Integer.parseInt(pagenum);//int 형으로 몇 번 페이지인지 페이지 값 형변환
        int ccontentnum = Integer.parseInt(contentnum);//int 형으로 한 페이지에 몇개 보일지 값 형변환
        
    /*---------페이지 객체에 새로운 정보 다시 지정해주는 부분------------------*/
        pagemaker.setTotalcount(mapper.testcount());//전체 게시글 개수 지정한다
        pagemaker.setPagenum(cpagenum-1);//현재 페이지를 페이지 객체에 다시 지정해준다//몇번 페이지인지 PageMaker에 세팅한다
        pagemaker.setContentnum(ccontentnum);//한 페이지에 몇개씩 보여줄지 세팅한다
        pagemaker.setCurrentblock(cpagenum);//현재 페이지블록이 몇번인지 현재 페이지 번호를 통해서 지정한다
        pagemaker.setLastblock(pagemaker.getTotalcount());//마지막 블록 번호를 전체 게시글 수를 통해서 정한다
    /*---------페이지 객체에 새로운 정보 다시 지정해주는 부분------------------*/
        
        pagemaker.prevnext(cpagenum);//현재 페이지 번호로 화살표 나타낼지 결정한다
        pagemaker.setStartPage(pagemaker.getCurrentblock());//시작페이지 번호를 현재 페이지 블록으로 정한다
        pagemaker.setEndPage(pagemaker.getLastblock(),pagemaker.getCurrentblock());
        //현재 블록 번호와 마지막 블록 번호를 보내서 대조하고 페이지 블록의 마지막 번호를 지정한다
        
        List<Test> testlist = new ArrayList<Test>();//게시글 담을 리스트 선언
        testlist = mapper.testlist(pagemaker.getPagenum()*10, pagemaker.getContentnum());//리스트에 저장
        //매퍼로 한 페이지에 몇개 보일지 ,몇번 페이지 인지 전달//매퍼.xml 에서 사용하기 위해서 곱하기 10을 한다
 
        request.setAttribute("list", testlist);//sql로 얻은 리스트를 .jsp페이지로 전달
        request.setAttribute("page", pagemaker);//페이지 번호 객체 .jsp페이지로 전달
        return "list";
        
    }    
cs

 

 

jsp부분 (간략하게 작성했습니다)

 

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
    function page(idx){
        var pagenum = idx;
        var contentnum = $("#contentnum option:selected").val();                
        location.href="${pageContext.request.contextPath}/list?pagenum="+pagenum+"&contentnum="+contentnum;    
    }
</script>
</head>
<body>
    <select name="contentnum" id="contentnum">
    <!-- 10개씩 , 20개씩 , 30개씩 사용자가 원하는 만큼 게시글을 볼 수 있도록 작성했으나 , 추후 구현 예정입니다 -->
        <option value="10">10</option>
        <option value="20">20</option>
        <option value="30">30</option>
    </select>
    <table>
        <thead>
            <tr>
                <th>tid</th>
                <th>content</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach var="k" items="${list}">
                <tr>
                    <td>${k.tid}</td>
                    <td>${k.content}</td>
                </tr>
            </c:forEach>
        </tbody>
        <tfoot>
            <tr>
                <td colspan="2">
                    <!-- 왼쪽 화살표 -->
                    <c:if test="${page.prev}">
                        <a style="text-decoration:none;" href="javascript:page(${page.getStartPage()-1});">&laquo;</a>
                    </c:if>
                    
                    <!-- 페이지 숫자 표시 -->
                    <c:forEach begin="${page.getStartPage()}" end="${page.getEndPage()}" var="idx">
                        <a style="text-decoration: none;" href="javascript:page(${idx});">${idx}</a>
                    </c:forEach>
                    
                    <!-- 오른쪽 화살표 -->
                    <c:if test="${page.next}">
                        <a style="text-decoration:none;" href="javascript:page(${page.getEndPage()+1});">&raquo;</a>
                    </c:if>
                    
                </td>
            </tr>
        </tfoot>
    </table>
</body>
</html>
 
cs

 

 


댓글