<목표>
<Controller>
@RequestMapping(value="listPage", method=RequestMethod.GET)
public String listPage(Criteria cri, Model model) throws Exception{
model.addAttribute("list", service.listCriteria(cri));
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(cri);
pageMaker.setTotalCount(service.listCount());
model.addAttribute("pageMaker", pageMaker);
return "board/listPage";
}
controller에서 listPage는 listCri와 비슷한 부분은
model.addAttribute("list", service.listCriteria(cri));
다른 부분은
PageMaker pageMaker = new PageMaker();
pageMaker.setCri(cri);
pageMaker.setTotalCount(service.listCount());
model.addAttribute("pageMaker", pageMaker);
PageMaker.java가 추가 !!
※perPageNum은 한 페이지에 출력될 행의 개수이고 displayPageNum은 클릭할 수 있는 페이지 개수를 말함
PageMaker에는 endPage 구하기, startPage 구하기, tempEndPage실제 데이터 수에 필요한 페이지 구하기,
prev&next 이전 버튼 생성여부, UriComponents를 볼 수 있다.
<PageMaker>
public class PageMaker {
private int totalCount;
private int startPage;
private int endPage;
private boolean prev;
private boolean next;
private int displayPageNum=10;
private Criteria cri;
public void setCri(Criteria cri) {
this.cri= cri;
}
public void setTotalCount(int totalCount) {
this.totalCount=totalCount;
calcData();
}
private void calcData() {
endPage = (int) (Math.ceil (cri.getPage()/ (double) displayPageNum) * displayPageNum);
startPage = (endPage - displayPageNum)+1;
int tempEndPage = (int) (Math.ceil(totalCount/ (double) cri.getPerPageNum()));
if(endPage > tempEndPage) {
endPage = tempEndPage;
}
prev = startPage == 1 ? false : true;
next = endPage * cri.getPerPageNum() >= totalCount ? false: true;
}
public String makeQuery(int page) {
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.queryParam("page", page)
.queryParam("perPageNum", cri.getPerPageNum())
.build();
return uriComponents.toUriString();
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
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 getDisplayPageNum() {
return displayPageNum;
}
public void setDisplayPageNum(int displayPageNum) {
this.displayPageNum = displayPageNum;
}
public int getTotalCount() {
return totalCount;
}
public Criteria getCri() {
return cri;
}
@Override
public String toString() {
return "PageMaker [totalCount=" + totalCount + ", startPage=" + startPage + ", endPage=" + endPage + ", prev="
+ prev + ", next=" + next + ", displayPageNum=" + displayPageNum + ", cri=" + cri + "]";
}
}
<listPage.jsp>
페이지 번호 클릭 시 이동 방법 2가지를 제시
- PageMaker.java에 makeQuery 메소드를 이용하는 방법
- Jquery를 이용하는 방법
※실행하면 페이지번호 div가 2개 나오니 하나를 선택해서 사용해야 한다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c"%>
<%@ taglib prefix="fmt" uri="<http://java.sun.com/jsp/jstl/fmt>"%>
<%@ page session="false"%>
<%@include file="../include/header.jsp"%>
<!-- Main content -->
<section class="content">
<div class="row">
<!-- left column -->
<div class="col-md-12">
<!-- general form elements -->
<div class='box'>
<div class="box-header with-border">
<h3 class="box-title">Board List</h3>
</div>
<div class='box-body'>
<button id='newBtn'>New Board</button>
</div>
</div>
<div class="box">
<div class="box-header with-border">
<h3 class="box-title">LIST PAGING</h3>
</div>
<div class="box-body">
<table class="table table-bordered">
<tr>
<th style="width: 10px">BNO</th>
<th>TITLE</th>
<th>WRITER</th>
<th>REGDATE</th>
<th style="width: 40px">VIEWCNT</th>
</tr>
<c:forEach items="${list}" var="boardVO">
<tr>
<td>${boardVO.bno}</td>
<td><a
href='/board/readPage${pageMaker.makeQuery(pageMaker.cri.page) }&bno=${boardVO.bno}'>
${boardVO.title}</a></td>
<td>${boardVO.writer}</td>
<td><fmt:formatDate pattern="yyyy-MM-dd HH:mm"
value="${boardVO.regdate}" /></td>
<td><span class="badge bg-red">${boardVO.viewcnt }</span></td>
</tr>
</c:forEach>
</table>
</div>
<!-- /.box-body -->
<div class="box-footer">
<div class="text-center">
<ul class="pagination">
<c:if test="${pageMaker.prev}">
<li><a
href="listPage${pageMaker.makeQuery(pageMaker.startPage - 1) }">«</a></li>
</c:if>
<c:forEach begin="${pageMaker.startPage }"
end="${pageMaker.endPage }" var="idx">
<li
<c:out value="${pageMaker.cri.page == idx?'class =active':''}"/>>
<a href="listPage${pageMaker.makeQuery(idx)}">${idx}</a>
</li>
</c:forEach>
<c:if test="${pageMaker.next && pageMaker.endPage > 0}">
<li><a
href="listPage${pageMaker.makeQuery(pageMaker.endPage +1) }">»</a></li>
</c:if>
</ul>
</div>
<%-- <div class="text-center">
<ul class="pagination numMove">
<c:if test="${pageMaker.prev}">
<li><a href="${pageMaker.startPage - 1}">«</a></li>
</c:if>
<c:forEach begin="${pageMaker.startPage }"
end="${pageMaker.endPage }" var="idx">
<li
<c:out value="${pageMaker.cri.page == idx?'class =active':''}"/>>
<a href="${idx}">${idx}</a>
</li>
</c:forEach>
<c:if test="${pageMaker.next && pageMaker.endPage > 0}">
<li><a
href="${pageMaker.endPage +1}">»</a></li>
</c:if>
</ul>
</div> --%>
</div>
<!-- /.box-footer-->
</div>
</div>
<!--/.col (left) -->
</div>
<!-- /.row -->
</section>
<!-- /.content -->
<form id="jobForm">
<input type='hidden' name="page" value=${pageMaker.cri.perPageNum}>
<input type='hidden' name="perPageNum" value=${pageMaker.cri.perPageNum}>
</form>
<script>
var result = '${msg}';
if (result == 'SUCCESS') {
alert("처리가 완료되었습니다.");
}
$(".numMove li a").on("click", function(event){
event.preventDefault();
var targetPage = $(this).attr("href");
var jobForm = $("#jobForm");
jobForm.find("[name='page']").val(targetPage);
jobForm.attr("action","/board/listPage").attr("method", "get");
jobForm.submit();
});
</script>
<%@include file="../include/footer.jsp"%>
제목 클릭시 이동하게 되면
<a href='/board/readPage${pageMaker.makeQuery(pageMaker.cri.page) }&bno=${boardVO.bno}'>${boardVO.title}</a>
readPage를 컨트롤러에 설정 안 해주었기 때문에 설정해주어야 한다
<Controller>
@RequestMapping(value="readPage", method=RequestMethod.GET)
public String readPage(int bno, @ModelAttribute("cri") Criteria cri, Model model) throws Exception{
model.addAttribute("boardVO",service.read(bno));
return "board/readPage";
}
<readPage.jsp>
Criteria cri를 form태그 안 hidden에 넣어주니 page와 perPageNum을 알 수 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<!-- Main content -->
<section class="content">
<div class="row">
<!-- left column -->
<div class="col-md-12">
<!-- general form elements -->
<div class="box box-primary">
<div class="box-header">
<h3 class="box-title">READ BOARD</h3>
</div><!-- /.box-header -->
<form role="form" action="modifyPage" method="post">
<input type='hidden' name='bno' value ="${boardVO.bno}">
<input type='hidden' name='page' value ="${cri.page}">
<input type='hidden' name='perPageNum' value ="${cri.perPageNum}">
</form>
<div class="box-body">
<div class="form-group">
<label for="exampleInputEmail1">Title</label>
<input type="text" name='title' class="form-control"
value="${boardVO.title}" readonly="readonly">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Content</label>
<textarea class="form-control" name="content" rows="3"
readonly="readonly">${boardVO.content}</textarea>
</div>
<div class="form-group">
<label for="exampleInputEmail1" >Writer</label>
<input type="text" name="writer" class="form-control"
value="${boardVO.writer}" readonly="readonly">
</div>
</div><!-- /.box-body -->
<div class="box-footer">
<button type="submit" class="btn btn-warning">Modify</button>
<button type="submit" class="btn btn-danger">REMOVE</button>
<button type="submit" class="btn btn-primary">GO LIST </button>
</div>
<script>
$(document).ready(function(){
var formObj = $("form[role='form']");
console.log(formObj);
$(".btn-warning").on("click", function(){
formObj.attr("action", "/board/modifyPage");
formObj.attr("method", "get");
formObj.submit();
});
$(".btn-danger").on("click", function(){
formObj.attr("action", "/board/removePage");
formObj.submit();
});
$(".btn-primary").on("click", function(){
formObj.attr("method", "get");
formObj.attr("action", "/board/listPage");
formObj.submit();
});
});
</script>
</div><!-- /.box -->
</div><!--/.col (left) -->
</div> <!-- /.row -->
</section><!-- /.content -->
</div><!-- /.content-wrapper -->
<%@include file="../include/footer.jsp" %>
GO LIST를 클릭하면
$(".btn-primary").on("click", function(){
formObj.attr("method", "get");
formObj.attr("action", "/board/listPage");
formObj.submit();
});
readPage.jsp의 form태그 내용이 아래와 같이 바뀌고 제목 클릭하기 전 페이지로 돌아간다
<form role="form" action="/board/listPage" method="get">
<input type='hidden' name='bno' value ="${boardVO.bno}">
<input type='hidden' name='page' value ="${cri.page}">
<input type='hidden' name='perPageNum' value ="${cri.perPageNum}">
</form>
'Spring' 카테고리의 다른 글
"Spring DAO와 Service 메소드 명은 왜 다를까?" (0) | 2018.09.06 |
---|---|
"Spring DTD mapper와 config 설정할 수 있을까? (4) | 2018.09.04 |
"Spring에서는 어떻게 예외처리 하죠?" (0) | 2018.09.03 |
"내가 원하는대로 페이징 구현할 수 있을까?" (0) | 2018.09.03 |
"Spring 프로젝트 모든 설정 한 번에 그림으로 끝내기2" (0) | 2018.08.30 |