List

월요일, 12월 21, 2015

spring 환경에서 게시판 구축 - Paging 처리

  • paging 처리
    • rownum ? : data list 의 고유 numbering
    • 페이지 처리는 이것을 이용해서 전체데이터를 가져온뒤 처리하는 것이 아니라 rownum을 활용하여 특정 범위의 데이터를 가져 오는것
      • ex) page 글의 갯수가 5일때 page 1일떈 1~5번째 글 page 2일땐 6~10번째 글 이런식으로 처리
      • db단 rownum between 1 and 5
  • 필요 변수들
    • rnum : 쿼리문에서 rownum으로 보여지는 수를 속성값으로 선언 
    • pageSize : 한페이장 보여질 페이지의 크기
    • curPageNum : 현재 보여질 페이지 번호
    • pageCnt : 전체 페이지수
    • startNum : 시작번호
    • endNum : 끝번호
  • VO단에 변수들을 선언
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    //기본 변수들
    private int no;
    private String title;
    private String content;
    private String writer;
    private Date regdte;
    private Date uptdte;
    private int refno;
    private int readcnt;
    
    //paging 처리를 위한 변수들
    private int rnum;//rownum을 속성값으로 받기 위해
    private int pageSize;//한페이당 보여질 글 수
    private int pageCnt;//전체 페이지수
    private int tot;//전체 글 수
    private int curPageNum;//현재 페이지 번호
    private int startNum;//페이지 글 시작 번호
    private int endNum;//페이지 글 끝 번호
cs
  • 처리 프로세스
    • 현재 번호를(curPageNum) Ctrl단에 전달하면 , 페이지크기 (pageSize)를 통해서 시작번호 (startNum)와 마지막 번호(endNum)을 처리해서 db에 전달
  • 게시판
  • 총건수 : @@        페이지크기(select)
  • 데이터  list (시작번호 , 끝 번호 ) 
  •   [ 1 ] [ 2 ] [ 3 ]  
  • 총건수 : db 검색된 (page 처리가 되지않은 ) total
  • 페이지 처리 변수 proc
    • 총건수 : DB
    • 페이지 크기 : 화면에서 선택
    • 전체 페이지 크기 : 총건수 / 페이지 크기 - > 현재 page 수?
    • 시작번호, 마지막 번호  : 현재 page수와 페이지 크기

  • Query
    • startNum과 endNum을 변수로 주어서 해당하는 페이지의 내용만 읽어오기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <select id="boardlist" resultMap="boardRst" parameterType="board">
    select * from 
   (select rownum rnum,a.no,a.refno, a.TITLE,a.CONTENT,a.writer,
a.readcnt,a.regdte,a.uptdte from
    HP_BOARD a 
         where 1=1 
        <if test="title !=null">
            and  title like '%'||#{title}||'%'
        </if>
          <if test="writer !=null">
            and writer like '%'||#{writer}||'%'
        </if>
          start WITH refno=0
          connect by PRIOR no=refno
          order SIBLINGS by no desc
          ) where rnum between #{startNum} and #{endNum}     
  </select>
    
cs

  • Service
    • parameter로 board 객체를 받아서
    • 해당객체의 pageSize , curPageNum 을 활용해 startNum과 endNum을 세팅
    • 해준뒤에 해당 객체로 쿼리문 실행
    • 초기페이지인 경우 : pageSize가 0인경우, curPageNum이 0인경우 
    • 기본 값으로 세팅
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
public ArrayList<BoardVO> boardlist(BoardVO sch){
        
        
        /*게시판 paging처리 로직
         * 1.전체 건수 처리*/
        sch.setTot(dao.getTot(sch));
//쿼리문에서 리스트의 전체사이즈를 count 해옴
        
        // 2.한번에 보여질 데이터 건수
        
        if(sch.getPageSize()==0){
            sch.setPageSize(5);
        }
        
        //3.총 페이지 수 데이터 건수 /  페이지 크기
        // 11/5==3이 나올수 있도록 올림처리
        sch.setPageCnt
((int)Math.ceil(sch.getTot()/(double)sch.getPageSize()));
        if(sch.getCurPageNum()==0){
            sch.setCurPageNum(1);
        }
        
        //시작 번호 끝번호 처리
        sch.setStartNum(sch.getCurPageNum()*sch.getPageSize()-(sch.getPageSize()-1));
        sch.setEndNum(sch.getCurPageNum()*sch.getPageSize());
        return dao.boardlist(sch);    
    };
        
        



  • View단

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
<script type="text/javascript">
function go(obj){//페이지 이동처리
//curPageNum과 pageSize를 넘겨줌
//hidden에 숨겨져있음
    $("#curPageNum").val(obj);
    $size=$("select[name='pageSize']").val();
    $("#pageSize").val($size);
    $("form").submit();
}
$(document).ready(function(){
    //해당 pageSize가 유지되도록 board 객체의 pageSize값으로
//select문을 유지
    forvar i = 0 ; i < $("option").size(); i ++){
        if($("option").eq(i).val() == "${board.pageSize}"){
            $("option").eq(i).attr("selected","selected");
        }
    }
    
    $("#reg").click(function(){
        $(location).attr("href","${path}/board.do?key=goIns");
    })
    
    $("tr[name='goDetail']").click(function(){
        $no=$(this).attr("class");
        $(location).attr("href","${path}/board.do?key=detail1&no="+$no);
    })
    
    $("select").change(function(){//select change function
        $no=$(this).val();
        $(location).attr("href","${path}/board.do?key=sch&pageSize="+$no);
    })
    
})
</script>
</head>
<body>
<center>
<h1>게시판에 어서오세요</h1>
<table style="board-color:white;" id="topTab"> 
    <tr>
        <td align="left">글 갯수 : ${board.tot}</td>
        <td align="left">페이지당 글 갯수 : ${board.pageSize}</td>
        <td align="right">
            <select name="pageSize">
                <option value="1">1</option>
                <option value="2">2</option>
                <option value="5">5</option>
                <option value="10">10</option>
            </select>
        </td>
    </tr>
</table>
<table id="mainTab">
    <tr>
        <td>no</td>
        <td>title</td>
        <td>content</td>
        <td>writer</td>
        <td>regdte</td>
        <td>uptdte</td>
        <td>refno</td>
        <td>readcnt</td>
    </tr>
        <c:forEach var = "list" items="${alllist}">
            <tr  name="goDetail" class="${list.no}">
                <td>${list.rnum}</td>
                <td>${list.title}</td>
                <td>${list.content}</td>
                <td>${list.writer}</td>
                <td>${list.regdte}</td>
                <td>${list.uptdte}</td>
                <td>${list.refno}</td>
                <td>${list.readcnt}</td>
            </tr>
        </c:forEach>
</table>
<form method="post" action="${path}/board.do?key=sch">
    <c:forEach var="pnum" begin="1" end="${board.pageCnt }">
        <a href="javascript:go(${pnum });">
        <c:choose>
            <c:when test="${board.curPageNum == pnum }">
                <b style="font-size: 22pt">[${pnum}]</b>
            </c:when>
            <c:otherwise>
                [${pnum}]
            </c:otherwise>
        </c:choose>
        </a>        
    </c:forEach>
    <input type="hidden" id="pageSize" name="pageSize"/>
    <input type="hidden" id="curPageNum" name="curPageNum"/>
</form>
<table>
cs


  • Ctrl
    • 간단함 별거없음..
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    @RequestMapping(params="key=list")//초기페이지
    public String boardList(@ModelAttribute("board")BoardVO sch,Model d){
        
        //sch.setPageSize(no);
        
        d.addAttribute("alllist", service.boardlist(sch));
        
        return "board/a01_List";
    }
    @RequestMapping(params="key=sch")//그어떤 페이지이동이나 리스트변경이 있을시..
    public String schBoard(@ModelAttribute("board")BoardVO sch,Model d){
        
        d.addAttribute("alllist", service.boardlist(sch));
        
        return "board/a01_List";
    }
    
cs


s

댓글 없음:

댓글 쓰기