Spring.ページング、検索
56548 ワード
1.リスト出力
クエリー コントローラ view for eachランダム出力 vo、出力 mapper
ページング処理用のクラスの作成は、投稿データおよびページング情報 を含む.には2つのクエリー文が必要です.なぜですか. @RequestParam(デフォルト=「1」)int currentPage=>currentPageが受信され、値がない場合は1に設定されます.
// 1
SELECT T.RNUM, CUS_NUM, CUS_NM, ADDR, PNE
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY CUS_NUM) RNUM, CUS_NUM, CUS_NM, ADDR, PNE
FROM CUS)T;
// 2
SELECT CUS_NUM, CUS_NM, ADDR, PNE, ROW_NUMBER() OVER(ORDER BY CUS_NUM) RNUM
FROM CUS
ORDER BY CUS_NUM;
// 1
@GetMapping("/list")
public ModelAndView list(ModelAndView mav) {
List<CusVO> cusVO = new ArrayList<CusVO>();
cusVO = this.cusService.select();
mav.addObject("data", cusVO);
mav.setViewName("cus/list");
return mav;
}
// 2
@RequestMapping(value="/list", method=RequestMethod.GET)
public String list(Model model) {
model.addAttribute("pageHeader", pageHeader);
//고객 목록
List<CusVO> list = this.cusService.select();
model.addAttribute("list", data);
//forwarding
return "cus/list";
}
<c:forEach items="${data}" var="data">
<tr>
<td>${data.rnum}</td>
<td>${data.cusNum}</td>
<td>${data.cusNm}</td>
<td>${data.pne}</td>
<td>${data.addr}</td>
</tr>
</c:forEach>
出力時に番号を入力する方法// cusVO에 순번 추가 부탁~
private int rnum;
<select id="select" resultType="cusVO">
SELECT T.RNUM, T.CUS_NUM,T.CUS_NM,T.ADDR,T.PNE
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY CUS_NUM) RNUM, CUS_NUM,CUS_NM,ADDR,PNE
FROM CUS
) T
</select>
2.ページング処理&検索ページング処理用のクラスの作成
package kr.or.ddit;
import java.util.List;
import kr.or.ddit.cus.vo.CusVO;
//페이징 처리를 위한 클래스
//게시글 데이터와 페이징 관련 정보를 담고 있음
public class ArticlePage {
//페이징 관련 멤버변수
//전체 글의 행의 수
private int total;
//현재 페이지 번호
private int currentPage;
//전체 페이지 개수
private int totalPages;
//시작 페이지 번호
private int startPage;
//종료 페이지 번호
private int endPage;
//페이징의 개수
private int pagingCount;
//게시글 데이터
private List<CusVO> content;
//생성자//
//size : 한 화면에 보여질 행의 수
public ArticlePage(int total, int currentPage, int size, int pagingCount,
List<CusVO> content) {
this.total = total;
this.currentPage = currentPage;
this.content = content;
this.pagingCount = pagingCount;
if(total == 0) {//select 결과가 없다면..
totalPages = 0;
startPage = 0;
endPage = 0;
}else { //select 결과가 있을 때..
//전체 페이지 개수 구하기(전체 글의 수 / 한 화면에 보여질 행의 수)
//정수와 정수의 나눗셈의 결과는 정수이므로 13 / 7 => 1
totalPages = total / size;
//보정해줘야 할 경우는? 15 / 7 = 2 경우 처럼 나머지가 0보다 클 때
if(total % size>0) {
//전체 페이지수를 1 증가 처리
totalPages++;
}
//startPage : 이전 [1] [2] [3] [4] [5] 다음 일 때 1을 의미
//공식 : startPage = 현재페이지 / 페이징의 개수 * 페이징의 개수 + 1;
startPage = currentPage / pagingCount * pagingCount + 1;
//보정해줘야 할 경우는? 5 / 5 * 5 + 1 => 6 경우처럼
// 현재페이지 % pagingCount == 0 일 때
if(currentPage%pagingCount==0) {
//startPage = startPage - 5(페이징의 개수);
startPage -= pagingCount;
}
//endPage : 이전 [1] [2] [3] [4] [5] 다음 일 때 5을 의미
endPage = startPage + (pagingCount-1);
//보정해줘야 할 경우는? endPage 5 > totalPages 3 일 때
// endPage 5를 totalPages 3로 바꿔줘야 함
if(endPage > totalPages) {
endPage = totalPages;
}
}//end outer if
}
//전체 행의 수를 리턴
public int getTotal() {
return this.total;
}
//select결과가 없는가? 체킹 : true면 결과가 없다는 의미
public boolean hasNoArticles() {
return this.total == 0;
}
//select결과가 있는가? 체킹 : true면 결과가 있다는 의미
public boolean hasArticles() {
return this.total > 0;
}
//현재 페이지 번호 리턴
public int getCurrentPage() {
return this.currentPage;
}
//전체 페이지의 개수 리턴
public int getTotalPages() {
return totalPages;
}
//데이터 VO List 리턴
public List<CusVO> getContent(){
return this.content;
}
//목록 하단의 시작 번호를 리턴
public int getStartPage() {
return this.startPage;
}
//목록 하단의 종료 번호를 리턴
public int getEndPage() {
return this.endPage;
}
}
mapper.xmlの作成-検索とページ処理<select id="select" parameterType="hashMap" resultType="cusVO">
SELECT T.RNUM, CUS_NUM, CUS_NM, ADDR, PNE
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY CUS_NUM) RNUM, CUS_NUM, CUS_NM, ADDR, PNE
FROM CUS
WHERE 1 = 1
<if test="keyWord!=null and keyWord!=''">
AND (CUS_NUM LIKE '%'||#{keyWord}||'%'
OR CUS_NM LIKE '%'||#{keyWord}||'%'
OR ADDR LIKE '%'||#{keyWord}||'%'
OR PNE LIKE '%'||#{keyWord}||'%')
</if>
) T
WHERE T.RNUM BETWEEN #{currentPage}*7-6 AND #{currentPage}*7
</select>
<select id="selectCount" parameterType="hashMap" resultType="int">
SELECT COUNT(*)
FROM CUS
WHERE 1 = 1
<if test="keyWord!=null and keyWord!=''">
AND (CUS_NUM LIKE '%'||#{keyWord}||'%'
OR CUS_NM LIKE '%'||#{keyWord}||'%'
OR ADDR LIKE '%'||#{keyWord}||'%'
OR PNE LIKE '%'||#{keyWord}||'%')
</if>
</select>
mapper/servicepackage kr.or.ddit.cus.mapper;
import java.util.List;
import java.util.Map;
import kr.or.ddit.cus.vo.AttachFilesVO;
import kr.or.ddit.cus.vo.CusVO;
public interface CusMapper {
// 고객목록
public List<CusVO> select(Map<String, Object> map);
// 행의 수
public int selectCount(Map<String,Object> map) ;
}
package kr.or.ddit.cus.service.impl;
@Service
public class CusServiceImpl implements CusService {
@Autowired
CusMapper cusMapper;
@Override
public List<CusVO> select(Map<String, Object> map) {
return cusMapper.select(map);
}
@Override
public int selectCount(Map<String, Object> map) {
// TODO Auto-generated method stub
return cusMapper.selectCount(map);
}
}
せいぎょそうちpackage kr.or.ddit.cus.controller;
@RequestMapping("/cus")
@Controller
public class CusController {
private static final Logger logger =
LoggerFactory.getLogger(CusController.class);
@Autowired
CusService cusService;
@RequestMapping(value="/list", method=RequestMethod.GET)
public String list(Model model, @RequestParam(defaultValue="1") int currentPage
, @RequestParam(required=false) String keyWord
, @RequestParam(defaultValue="7",required=false) int size) {
Map<String,String> pageHeader = new HashMap<String, String>();
pageHeader.put("subtitle", "Customer");
pageHeader.put("title", "고객 목록");
model.addAttribute("pageHeader", pageHeader);
Map<String,Object> map = new HashMap<String, Object>();
map.put("keyWord", keyWord);
map.put("currentPage", currentPage);
map.put("size", size);
//고객 목록
List<CusVO> list = this.cusService.select(map);
int total = this.cusService.selectCount(map);
model.addAttribute("list",
new ArticlePage(total, currentPage, size, 5, list));
model.addAttribute("total", total);
model.addAttribute("data", list);
//forwarding
return "cus/list";
}
}
ビュー(jsp)<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script type="text/javascript">
function fn_submit(){
var frm = document.searchForm;
console.log("frm.size : " + frm.size.value);
console.log("frm.keyWord : " + frm.keyWord.value);
frm.submit();
}
</script>
<!-- Default Light Table-->
<div class="row">
<div class="col">
<div class="card card-small mb-4">
<div class="card-header border-bottom">
<h6 class="m-0">Active Users</h6>
</div>
<!-- 검색 폼 영역 시작 -->
<form name="searchForm" id="searchForm" action="/cus/list" method="get">
<div class="row"><div class="col-sm-12 col-md-6"><div class="dataTables_length" id="dataTable_length"><label>Show <select id="size" name="size" aria-controls="dataTable" class="custom-select custom-select-sm form-control form-control-sm"><option value="10">10</option><option value="25">25</option><option value="50">50</option><option value="100">100</option></select> entries</label></div></div><div class="col-sm-12 col-md-6"><div id="dataTable_filter" class="dataTables_filter">
<label>Search:
<input type="search" name="keyWord" id="keyWord" class="form-control form-control-sm" placeholder="검색어를 입력해주세요" aria-controls="dataTable" value="${param.keyWord}"></label>
<a href="#" class="btn btn-primary btn-icon-split" onclick="fn_submit()">
<span class="text">검색</span>
</a>
</div></div>
</div>
</form>
<!-- 검색 폼 영역 끝 -->
<div class="card-body p-0 pb-3 text-center">
<table class="table mb-0">
<thead class="bg-light">
<tr>
<th scope="col" class="border-0">번호</th>
<th scope="col" class="border-0">고객아이디</th>
<th scope="col" class="border-0">고객명</th>
<th scope="col" class="border-0">연락처</th>
<th scope="col" class="border-0">주소</th>
</tr>
</thead>
<tbody>
<c:set var="i" value="${list.currentPage*7-6-1}" />
<c:forEach items="${data}" var="data">
<tr>
<td>${data.rnum}</td>
<td>${data.cusNum}</td>
<td>${data.cusNm}</td>
<td>${data.pne}</td>
<td>${data.addr}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-5">
<div class="dataTables_info" id="dataTable_info" role="status" aria-live="polite">
<!-- A*7-6 A*7 -->
Showing ${list.currentPage*7-6} to ${list.currentPage*7} of ${total} entries
</div>
</div>
<div class="col-sm-12 col-md-7">
<div class="dataTables_paginate paging_simple_numbers" id="dataTable_paginate">
<!-- 페이징 처리 시작 -->
<ul class="pagination">
<!-- Previous 시작 -->
<li class="paginate_button page-item previous <c:if test='${list.startPage<6}'>disabled</c:if>" id="dataTable_previous"><a href="/cus/list?currentPage=${list.startPage-5}" aria-controls="dataTable" data-dt-idx="0" tabindex="0" class="page-link">Previous</a></li>
<!-- Previous 끝 -->
<!-- Page번호 시작 -->
<c:forEach var="pNo" begin="${list.startPage}" end="${list.endPage}" step="1">
<li class="paginate_button page-item <c:if test='${list.currentPage eq pNo}'>active</c:if>"><a href="/cus/list?currentPage=${pNo}" aria-controls="dataTable" data-dt-idx="1" tabindex="0" class="page-link">${pNo}</a></li>
</c:forEach>
<!-- Page번호 끝 -->
<!-- Next 시작 -->
<li class="paginate_button page-item next <c:if test='${list.endPage>=list.totalPages}'>disabled</c:if>" id="dataTable_next"><a href="/cus/list?currentPage=${list.startPage+5}" aria-controls="dataTable" data-dt-idx="7" tabindex="0" class="page-link">Next</a></li>
<!-- Next 끝 -->
</ul>
<!-- 페이징 처리 끝 -->
</div></div></div>
</div>
</div>
<a href="/cus/insret" class="mb-2 btn btn-sm btn-info mr-1" style="float:right;">등록데스까</a>
<!-- End Default Light Table-->
Reference
この問題について(Spring.ページング、検索), 我々は、より多くの情報をここで見つけました https://velog.io/@vgo_dongv/Spring-페이지-검색テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol