[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" %>




image



와우! 글을 읽고 와도 현재 페이지가 유지되네요!


수정 후 현재페이지 정보 유지




이번에는 수정 후에도 현재 페이지 정보를 유지하게 하겠습니다!


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" %>




한 번 제대로 되는지 확인해볼까요?


image




수정을 해도 페이지 정보가 유지되네요!


삭제 후 현재 페이지 정보 유지



삭제 후에도 현재 페이지가 유지되도록 하겠습니다!


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";
	}
	...
}




image



삭제 후에도 현재 페이지 정보 유지 완료!


등록 후 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>
...






잘 동작하나보죠!


image




성공입니다! 이로써 페이지 기능을 완벽히 구현했습니다~!