AJAX로 페이징 구현하기
2016. 12. 27. 16:04ㆍProgramming/Spring
순서:
1) 매퍼(SQL문)
2) DAO
3) 컨트롤러
4) 페이징.jsp
5) 뷰.jsp
1) 매퍼(SQL문)
<select id="selectAllComments" resultType="com.spring.vo.Comments"> <![CDATA[ SELECT * FROM ( SELECT * FROM ( SELECT ORDER_COMMENTS.*, ROWNUM row_num FROM ( SELECT c.*, m.id mem_id, m.name mem_name FROM COMMENTS c LEFT JOIN MEMBER m ON c.mem_num = m.num WHERE board_num = #{board_num} ORDER BY c.num DESC )ORDER_COMMENTS )PAGING_COMMENTS WHERE row_num >= #{paging.startNum} ) WHERE row_num <= #{paging.endNum} ]]> </select> //코멘트 숫자(페이지수 정하기 위한) <select id="totalCount" resultType="int"> SELECT count(*) FROM COMMENTS WHERE board_num = #{board_num} </select>
2) DAO
CommentsDao.java
public List<Comments> list(Map map){ return sqlSession.selectList(CommentsMapper+".selectAllComments", map); } public int totalCount(int board_num) { return sqlSession.selectOne(CommentsMapper+".totalCount",board_num); }
3) 컨트롤러
CommentsRestController.java
@RequestMapping(value="{board_num}/{page}") public ResponseEntity<Map<String,Object>> list(@PathVariable("board_num") int board_num, @PathVariable("page") int page){ //ResponseEntity 쓰면 list는물론 HttpStatus(접속 상태)도 같이 보낼 수 있다. ResponseEntity<Map<String,Object>> entity = null; Paging paging = new Paging(); paging.setPage(page); paging.setTotalCount(dao.totalCount(board_num)); try{ Map<String,Object> map = new HashMap<String,Object>(); //map 구조: {board_num:1, paging:{startNum:1, endNum:10,...}, list:{} } map.put("paging", paging); map.put("board_num", board_num); map.put("list", dao.list(map)); entity = new ResponseEntity<Map<String,Object>>(map,HttpStatus.OK); }catch(Exception e){ entity = new ResponseEntity<Map<String,Object>>(HttpStatus.BAD_REQUEST); } return entity; }
4) 페이징.jsp
scriptPaging.jsp
<c:url var="action" value="${param.action}"/> <c:if test="${param.prev}"> <a href="javascript:${action}(${param.begin-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="javascript:${action}(${index})">${index}</a> </c:otherwise> </c:choose> </c:forEach> <c:if test="${param.next}"> <a href="javascript:${action}(${param.end+1})">next</a> </c:if>
5) 뷰.jsp
Comments.jsp
var contextPath ="${requestScope['javax.servlet.include.context_path']}"; var loadComments = function(page_param){//ajax 구현 var page = null; if(page_param){ page = page_param; }else{ page = 1; } var http; var url = contextPath+"/comments/${param.board_num}/"+page; if(window.XMLHttpRequest){ http=new XMLHttpRequest(); }else if(window.ActiveXObject){ http=new ActiveXObject("Microsoft.XMLHTTP"); } http.onreadystatechange = function(){ if(this.readyState==4 && this.status==200){ var comlist = JSON.parse(this.responseText); commentList(comlist.list); pagingLoad(comlist.paging); }else if(this.status == 400){ alert("comments를 읽어오지 못했습니다."); } } http.open("GET",url,true); http.send(); console.log("통신완료!"); } //콜백함수1(코멘트 목록) function commentList(comlist){ var tableList = document.querySelector("#commentsList .list"); var htmlList = ""; for(var i=0;i<comlist.length;i++){ htmlList +="<tr>"; htmlList +="<td>"+comlist[i]["num"]+"</td>"; htmlList +="<td>"+comlist[i]["mem_num"]+"</td>"; htmlList +="<td>"+comlist[i]["mem_id"]+"</td>"; htmlList +="<td>"+comlist[i]["mem_name"]+"</td>"; htmlList +="<td>"+comlist[i]["content"]+"</td>"; htmlList +="<td>"+comlist[i]["indate"]+"</td>"; htmlList +="<td><a href='javascript:deleteComments("+comlist[i]["num"]+")'>삭제</a></td>"; htmlList +="</tr>"; } tableList.innerHTML = htmlList; } //콜백함수2(페이지 목록) var pagingLoad = function(pagingJson){ var pagingDiv = document.querySelector("#pagingDiv"); var http; if(window.XMLHttpRequest){ http=new XMLHttpRequest(); }else if(window.ActiveXObject){ http=new ActiveXObject("Microsoft.XMLHTTP"); } var url = contextPath+"/paging/scriptPaging"; url+= "?action=loadComments"; url+= "&page="+pagingJson["page"]; url+= "&begin="+pagingJson["beginPage"]; url+= "&end="+pagingJson["endPage"]; url+= "&prev="+pagingJson["prev"]; url+= "&next="+pagingJson["next"]; http.onreadystatechange = function(){ if(this.readyState==4 && this.status==200){ var pagingHtml = this.responseText; pagingDiv.innerHTML = pagingHtml; } } http.open("GET",url,true); http.send(); }
'Programming > Spring' 카테고리의 다른 글
Spring으로 파일 업로드 (0) | 2016.12.28 |
---|---|
AJAX로 인터셉터 구현하기 (0) | 2016.12.27 |
AJAX로 댓글 기능 구현 (0) | 2016.12.23 |
스프링에서 AJAX 사용하기(+JSON) (0) | 2016.12.22 |
Interceptor, Cookie(+JSON) (0) | 2016.12.20 |