Spring.ページング、検索

56548 ワード

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";
    	}
  • view
  • <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>
    出力時に番号を入力する方法
  • for eachランダム出力
  • vo、出力
  • // cusVO에 순번 추가 부탁~
    	private int rnum;
  • mapper
  • 	<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の作成-検索とページ処理
  • には2つのクエリー文が必要です.なぜですか.
  • <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/service
    package 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);
    	}
    
    
    }
    
    
    
    せいぎょそうち
  • @RequestParam(デフォルト=「1」)int currentPage=>currentPageが受信され、値がない場合は1に設定されます.

  • 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>
                
                  &nbsp;<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-->