[Spring] 23.SpringProject-페이징 처리(5)
페이징 처리 - 목록 페이지와 정보 유지하기
저번 장에서 페이징 기능을 구현해봤었는데요!
이제 마무리 작업만 남았습니다~!
현재 페이지에서 어떤 글을 보고 목록으로 돌아왔을 때 , 글을 수정하고 목록으로 돌아왔을 때, 글을 삭제 하고 목록으로 이동될 때 페이지 정보 (page,perPageNum)를 그대로 유지하게 하는 것입니다!
하나씩 해보죠!
조회 후 현재 페이지 정보 유지
먼저, 글을 읽고 나서도 현재페이지가 유지되게 해보겠습니다!
페이지 정보가 유지되려면 page와 perPageNum의 값이 계속 유지되어야합니다!
다음과 같이 BoardController의 read 메소드의 매개변수에 Criteria를 추가해줍니다!
//BoardController.java
package com.gguri.swp.controller;
...
@Controller
@RequestMapping("/board/*")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
@Inject
private BoardService service;
...
@RequestMapping(value = "/read", method = RequestMethod.GET)
public void read(@RequestParam("bno") Integer bno,
@ModelAttribute("cri") Criteria cri,
Model model) throws Exception{
logger.info("read GET...");
BoardVO board = service.read(bno);
model.addAttribute(board);
}
}
그리고 read.jsp 도 수정해주겠습니다!
<!-- read.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<div id="saveOK" class="alert alert-warning hidden" role="alert">글이 수정되었습니다.</div>
<div class="box-body">
<span><b>글번호:</b> ${boardVO.bno}</span>
<div class="form-group">
<label for="title">Title</label>
<input type="text" id="title" name="title" class="form-control" value="${boardVO.title}" readonly="readonly"/>
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea name="content" id="content" class="form-control" rows="3" readonly="readonly">${boardVO.content}</textarea>
</div>
<div class="form-group">
<label for="writer">Writer</label>
<input type="text" id="writer" name="writer" class="form-control" value="${boardVO.writer}" readonly="readonly"/>
</div>
</div>
<div>
<!-- 목록 버튼 링크 수정 -->
<a href="/board/listPage${cri.makeQuery()}" class="btn btn-primary">LIST ALL</a>
<!-- 수정 버튼 링크 수정 -->
<a href="/board/update${cri.makeQuery()}&bno=${boardVO.bno}" class="btn btn-warning">update</a>
<button id="btn-remove" class="btn btn-danger">delete</button>
</div>
<script>
var result = '${result}';
$(function(){
$('#btn-remove').click(function(){
if(confirm("Are u sure?")){
//삭제 버튼 링크 수정
self.location.href = "/board/remove${cri.makeQuery()}&bno=${boardVO.bno}";
}
});
if(result === 'saveOK'){
$('#saveOK').removeClass('hidden');
$('#saveOK').fadeOut(2000);
}
});
</script>
<%@include file="../include/footer.jsp" %>
와우! 글을 읽고 와도 현재 페이지가 유지되네요!
수정 후 현재페이지 정보 유지
이번에는 수정 후에도 현재 페이지 정보를 유지하게 하겠습니다!
BoardController 의 update 메소드를 수정해줍니다!
//BoardController.java
package com.gguri.swp.controller;
...
@Controller
@RequestMapping("/board/*")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
@Inject
private BoardService service;
...
@RequestMapping(value = "/update", method = RequestMethod.GET)
public void updateGET(@RequestParam("bno") Integer bno,
@ModelAttribute("cri") Criteria cri,
Model model) throws Exception{
logger.info("update GET");
BoardVO board = service.read(bno);
model.addAttribute(board);
}
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String updatePOST(BoardVO board,
Criteria cri,
RedirectAttributes rttr) throws Exception{
logger.info("update POST");
service.modify(board);
rttr.addFlashAttribute("result","saveOK");
rttr.addAttribute("page", cri.getPage());
rttr.addAttribute("perPageNum", cri.getPerPageNum());
rttr.addAttribute("bno", board.getBno());
return "redirect:/board/read";
}
}
그리고 update.jsp도 수정해주겠습니다!
<!-- update.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<form role="form" method="post">
<div class="box-body">
<span><b>글번호:</b> ${boardVO.bno}</span>
<input type="hidden" name="bno" value="${boardVO.bno }" />
<!-- page와 perPageNum 추가 -->
<input type="hidden" name="page" value="${cri.page}" />
<input type="hidden" name="perPageNum" value="${cri.perPageNum}" />
<div class="form-group">
<label for="title">Title</label>
<input type="text" id="title" name="title" class="form-control" value="${boardVO.title}"/>
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea name="content" id="content" class="form-control" rows="3" >${boardVO.content}</textarea>
</div>
<div class="form-group">
<label for="writer">Writer</label>
<input type="text" id="writer" name="writer" class="form-control" value="${boardVO.writer}" readonly="readonly"/>
</div>
</div>
<div>
<button type="submit" class="btn btn-primary">Save</button>
<!-- 취소 링크 수정-->
<a href="/board/read${cri.makeQuery()}&bno=${boardVO.bno}" class="btn btn-danger">Cancel</a>
</div>
</form>
<%@include file="../include/footer.jsp" %>
한 번 제대로 되는지 확인해볼까요?
수정을 해도 페이지 정보가 유지되네요!
삭제 후 현재 페이지 정보 유지
삭제 후에도 현재 페이지가 유지되도록 하겠습니다!
BoardController 의 remove 메소드 수정!
//BoardController.java
package com.gguri.swp.controller;
...
@Controller
@RequestMapping("/board/*")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
@Inject
private BoardService service;
...
@RequestMapping(value = "/remove", method = RequestMethod.GET)
public String remove(@RequestParam("bno") Integer bno,
Criteria cri,
RedirectAttributes rttr) throws Exception{
logger.info("remove");
service.remove(bno);
rttr.addFlashAttribute("result","removeOK");
rttr.addAttribute("page", cri.getPage());
rttr.addAttribute("perPageNum", cri.getPerPageNum());
return "redirect:/board/listPage";
}
...
}
삭제 후에도 현재 페이지 정보 유지 완료!
등록 후 perPageNum 정보 유지
게시물을 등록했을 때는 1페이지로 이동하는 것이 자연스럽죠! perPageNum만 유지하게 하겠습니다!
먼저, BoardController register 메소드 수정해줍니다!
//BoardController.java
package com.gguri.swp.controller;
...
@Controller
@RequestMapping("/board/*")
public class BoardController {
private static final Logger logger = LoggerFactory.getLogger(BoardController.class);
@Inject
private BoardService service;
@RequestMapping(value = "/register", method = RequestMethod.GET)
public void registerGET(BoardVO board,
@ModelAttribute("cri") Criteria cri,
Model model) throws Exception{
logger.info("register get.....");
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String registerPOST(BoardVO board,
Criteria cri,
RedirectAttributes rttr) throws Exception{
logger.info("register post.....");
logger.info(board.toString());
service.regist(board);
rttr.addFlashAttribute("result", "registerOK");
//등록 후에는 1페이지로 이동해야하므로 page 값으로 1 전달
rttr.addAttribute("page", 1);
rttr.addAttribute("perPageNum", cri.getPerPageNum());
return "redirect:/board/listPage";
}
...
}
그리고 register.jsp 수정! 취소버튼이 없더라구요~! 취소버튼도 추가해줬습니다~!
<!-- register.jsp -->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<form role="form" method="post">
<div class="box-body">
<!-- page와 perPageNum 추가 -->
<input type="hidden" name="page" value="${cri.page}" />
<input type="hidden" name="perPageNum" value="${cri.perPageNum}" />
<div class="form-group">
<label for="title">Title</label>
<input type="text" id="title" name="title" class="form-control" placeholder="Enter Title"/>
</div>
<div class="form-group">
<label for="content">Content</label>
<textarea name="content" id="content" class="form-control" rows="3" placeholder="Enter"></textarea>
</div>
<div class="form-group">
<label for="writer">Writer</label>
<input type="text" id="writer" name="writer" class="form-control" placeholder="Enter Writer"/>
</div>
</div>
<div>
<button type="submit" class="btn btn-primary">Submit</button>
<!-- 취소 버튼 추가 -->
<a href="/board/listPage${cri.makeQuery()}" class="btn btn-danger">Cancel</a>
</div>
</form>
<%@include file="../include/footer.jsp" %>
그리고 listPage.jsp의 새글등록 버튼의 링크를 수정해줍니다!
<!-- listPage.jsp -->
...
<div>
<!--새글 등록 버튼 링크 수정-->
<a href="/board/register${pageMaker.makeQuery(pageMaker.cri.page)}"><button class="btn btn-primary">새글등록</button></a>
<a href="/board/dummy"><button class="btn btn-danger">dummy생성</button></a>
</div>
...
잘 동작하나보죠!
성공입니다! 이로써 페이지 기능을 완벽히 구현했습니다~!