교육 54일차

권재현·2021년 6월 7일
0

교육

목록 보기
39/49

검색

페이징 - 데이터를 분할하여 제공


페이지 시작 : (현재p-1)* 보여질 개수 + 1

페이지 종료 : 현재 p * 보여질 개수

최대 p 개수 : 총게시글 수 %(나머지) 보여질 개수

  • 총 게시글 수 0일때 : 총 게시글 수 / 보여질 개수
  • 0 이 아닐때 : (총 게시글 수 / 보여질 개수) +1
  • 0일때 : 1페이지에 남는다.
    현재 P 기준 시작 P 현재 % 보여질 P
  • 0일때 : 현재 p - 보여질P +1
  • 0이 아닐 때 : (현재 P/ 보여질 P) + 보여질P + 1
    현재 P 기준 종료 P
    시작 P + 보여질 P -1
    단, 구한 값이 최대P보다 크면 종료 P = 최대 P

페이징 동작순서

너무어렵다....익숙하지 않다. 익숙 해 질 까지 반복학습 !!!

코드
TestController

package com.spring.sample.web.test.controller;

import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.spring.sample.common.bean.PagingBean;
import com.spring.sample.common.service.IPagingService;
import com.spring.sample.web.test.service.ITestService;

@Controller
public class TestController {

	//객체주입 받겠다.
	@Autowired
	public IPagingService iPagingService;
	
	@Autowired
	public ITestService iTestService;
	
	@RequestMapping(value="/test1")
	
	public ModelAndView test1(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) throws Throwable {
		
		//현재 페이지
		
		int page = 1; 
		if(params.get("page") != null) {
			page = Integer.parseInt(params.get("page"));
		}
		// 총 게시글 수
		int cnt = iTestService.getBCnt(params);
		
		//페이징 정보 취득
		PagingBean pb = iPagingService.getPagingBean(page, cnt);
		//글번호 P 없으면 글번호
		//게시글 시작번호, 종료 번호 할당
		params.put("startCnt", Integer.toString(pb.getStartCount()));
		params.put("endCnt" , Integer.toString(pb.getEndCount()));
		
		//목록 취득
		List<HashMap<String, String>>list
					= iTestService.getBList(params);
		
		mav.addObject("list", list);
		mav.addObject("pb", pb);
		mav.addObject("page", page);
		mav.addObject("cnt", cnt);
		mav.setViewName("test/test1");
	
		return mav;
		
	}
	
	
//	@RequestMapping(value="/testMList")
//	public ModelAndView testMList(ModelAndView mav) throws Throwable{
//		
//		List<HashMap<String, String>>list1
//							= iTestService.getMList();
//		
//		mav.addObject("list", list1);
//		
//		mav.setViewName("test/testMList");
//		
//		return mav;
//	}
	//상세보기
	@RequestMapping(value="/test2")
	public ModelAndView tes2(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) throws Throwable{
		if(params.get("bNo") !=null) {
			//단일 컬럼은 해쉬맵으로 갖고온다
			HashMap<String, String> data
			=iTestService.getB(params);
			
			mav.addObject("data", data);
			
			mav.setViewName("test/test2");
			
		} else {
			//redirect: 주소 => 해당주소로 이동. 즉, 컨트롤러에서 컨트롤러로 이동
			//					get방식만 적용됨
			mav.setViewName("redirect:test1");
		}
		
		return mav;
	}

	@RequestMapping(value="/ajaxTest")
	public  ModelAndView ajaxtest(ModelAndView mav) {
		
		mav.setViewName("test/ajaxTest");
		return mav;
	}
	//등록
	@RequestMapping(value="/test3")
	public ModelAndView test3(ModelAndView mav) {
		mav.setViewName("test/test3");
		
		return mav;
	}
	
	@RequestMapping(value="/test3s")
	public ModelAndView test3s(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) {
	
			
			try {
				int cnt = iTestService.addB(params);
				
				if(cnt > 0 ) {
					 mav.setViewName("redirect:test1");
				} else {
					 mav.addObject("msg", "등록실패");
					 mav.setViewName("test/test3s");
				}
				
			} catch (Throwable e) {
				e.printStackTrace();
				 mav.addObject("msg", "오류발생");
				 mav.setViewName("test/test3s");
			}
			
		
		return mav;
	}
	//수정
	@RequestMapping(value="/test4")
	public ModelAndView test4(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) throws Throwable{
		if(params.get("bNo") !=null) {
			//단일 컬럼은 해쉬맵으로 갖고온다
			HashMap<String, String> data=iTestService.getB(params);
			
			mav.addObject("data", data);
			
			mav.setViewName("test/test4");
			
		} else {
			//redirect: 주소 => 해당주소로 이동. 즉, 컨트롤러에서 컨트롤러로 이동
			//					get방식만 적용됨
			mav.setViewName("redirect:test1");
		}
		
		return mav;
	}
	
	@RequestMapping(value="/test4s")
	public ModelAndView test4s(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) {
	
			
			try {
				int cnt = iTestService.updateB(params);
				
				mav.addObject("cnt", cnt);
					
			} catch (Throwable e) {
				e.printStackTrace();
				mav.addObject("msg", "오류발생");
			}
			
			mav.setViewName("test/test4s");
		
		return mav;
	}
	
	@RequestMapping(value="/test5s")
	public ModelAndView test5s(
			@RequestParam HashMap<String, String> params,
			ModelAndView mav) {
	
			
			try {
				int cnt = iTestService.deleteB(params);
				
				if(cnt > 0 ) {
					 mav.setViewName("redirect:test1");
				} else {
					 mav.addObject("msg", "등록실패");
					 mav.setViewName("test/test5s");
				}
				
			} catch (Throwable e) {
				e.printStackTrace();
				 mav.addObject("msg", "오류발생");
				 mav.setViewName("test/test5s");
			}
			
		
		return mav;
	}
}

ITestService

package com.spring.sample.web.test.service;

import java.util.HashMap;
import java.util.List;

public interface ITestService {

	public List<HashMap<String, String>> getBList(HashMap<String, String> params) throws Throwable;

	public HashMap<String, String> getB(HashMap<String, String> params) throws Throwable;

	public int addB(HashMap<String, String> params) throws Throwable;

	public int updateB(HashMap<String, String> params) throws Throwable;

	public int deleteB(HashMap<String, String> params) throws Throwable;

	public int getBCnt(HashMap<String, String> params) throws Throwable;
}

TestService

import java.util.HashMap;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.spring.sample.web.test.dao.ITestDao;

@Service
public class TestService implements ITestService {

	//객체 주입 받겠다.
	@Autowired
	public ITestDao iTestDao;
	
	@Override
	public List<HashMap<String, String>> getBList(HashMap<String, String> params) throws Throwable {
		
		return iTestDao.getBList(params);
	}

	@Override
	public HashMap<String, String> getB(HashMap<String, String> params) throws Throwable {
		
		return iTestDao.getB(params);
	}

	@Override
	public int addB(HashMap<String, String> params) throws Throwable {
		
		return iTestDao.addB(params);
	}

	@Override
	public int updateB(HashMap<String, String> params) throws Throwable {
		// TODO Auto-generated method stub
		return iTestDao.updateB(params);
	}

	@Override
	public int deleteB(HashMap<String, String> params) throws Throwable {
		return iTestDao.deleteB(params);
	}

	@Override
	public int getBCnt(HashMap<String, String> params) throws Throwable {
		return iTestDao.getBCnt(params);
	}

}

ITestDao

package com.spring.sample.web.test.dao;

import java.util.HashMap;
import java.util.List;

public interface ITestDao {
	
	public List<HashMap<String, String>> getBList(HashMap<String, String> params) throws Throwable;

	public HashMap<String, String> getB(HashMap<String, String> params) throws Throwable;

	public int addB(HashMap<String, String> params) throws Throwable;

	public int updateB(HashMap<String, String> params) throws Throwable;

	public int deleteB(HashMap<String, String> params) throws Throwable;

	public int getBCnt(HashMap<String, String> params)throws Throwable;
}

TestDao

package com.spring.sample.web.test.dao;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

//저장소에 접근한다.
@Repository
public class TestDao implements ITestDao {

	@Autowired
	public SqlSession sqlSession;

	@Override
	public List<HashMap<String, String>> getBList(HashMap<String, String> params) throws Throwable {
		
		return sqlSession.selectList("B.getBList", params);
	}

	@Override
	public HashMap<String, String> getB(HashMap<String, String> params) throws Throwable {
		//단일row selectOne
		return sqlSession.selectOne("B.getB",params);
	}

	@Override
	public int addB(HashMap<String, String> params) throws Throwable {
		
		return sqlSession.insert("B.addB",params);
	}

	@Override
	public int updateB(HashMap<String, String> params) throws Throwable {
		return sqlSession.update("B.updateB", params);
	}

	@Override
	public int deleteB(HashMap<String, String> params) throws Throwable {
		return sqlSession.delete("B.deleteB", params);
	}

	@Override
	public int getBCnt(HashMap<String, String> params) throws Throwable {
		return sqlSession.selectOne("B.getBCnt", params);
	}
	
}

B_SQL

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="B"><!-- namespace: 클래스명과동일 -->
	<!-- id: 메소드명과 동일 -->
	<!-- resultType: row 1줄의 형태를 지정 -->
	<!-- 쿼리 작성 시 ; 이 들어가면 실행 되지 않음 -->
	<select id="getBCnt" parameterType="hashmap" resultType="Integer">
	SELECT COUNT(*) AS CNT
	FROM B
	<!-- where은 무조건 붙이고 시작, 조건에 따라서 쿼리가 바뀌기 때문에 동적sql -->
	WHERE 1 = 1
	<if test="searchTxt !=null and searchTxt != ''">
		<choose>
			<when test="searchGbn == 0">
				AND B_TITLE LIKE '%' || #{searchTxt} || '%'
			</when>
			<when test="searchGbn == 1">
				AND B_WRITER LIKE '%' ||  #{searchTxt} || '%'
			</when>
			<when test="searchGbn == 2">
				AND B_NO LIKE '%' ||  #{searchTxt} || '%'
			</when>
		</choose>
	</if>
	</select>
	
	<select id="getBList" parameterType="hashmap" resultType="hashmap">
		SELECT B.B_NO, B.B_TITLE,B.B_WRITER,B.B_DT
		FROM (SELECT B_NO, B_TITLE, B_WRITER, TO_CHAR(B_DT, 'YYYY-MM-DD')AS B_DT,
	             ROW_NUMBER() OVER(ORDER BY B_NO DESC) AS RNUM
	     	  FROM B
	    WHERE 1 = 1
	<if test="searchTxt != null and searchTxt != ''">
		<choose>
			<when test="searchGbn == 0">
				AND B_TITLE LIKE '%' || #{searchTxt} || '%'
			</when>
			<when test="searchGbn == 1">
				AND B_WRITER LIKE '%' || #{searchTxt} || '%'
			</when>
			<when test="searchGbn == 2">
				AND B_NO LIKE '%' || #{searchTxt} || '%'
			</when>
		</choose>
	</if>
	  ) B
	  WHERE B.RNUM BETWEEN #{startCnt} AND #{endCnt}
	</select>
	
	<!-- parameterType은 받는 값타입에 대한 것 resultType: 쿼리결과타입에 대한 것 -->
	<select id="getB" parameterType="hashmap" resultType="hashmap">
		SELECT B_NO, B_TITLE, B_WRITER, B_CON, TO_CHAR(B_DT, 'YYYY--MM--DD') AS B_DT
		FROM B
		WHERE B_NO = #{bNo}
	</select>
	<!-- 값만 넣어주면 되기 때문에 resultType이 필요없음  -->
	<insert id="addB" parameterType="hashmap">
		INSERT INTO B(B_NO, B_TITLE,B_WRITER, B_CON)
		VALUES(B_SEQ.NEXTVAL, #{bTitle}, #{bWriter}, #{bCon})
	</insert>
	
	<update id="updateB" parameterType="hashmap">
		UPDATE B SET B_TITLE= #{bTitle}, B_CON = #{bCon}
		WHERE B_NO = #{bNo}
	</update>
	
	<delete id="deleteB" parameterType="hashmap">
		DELETE FROM B
		WHERE B_NO = #{bNo}
	</delete>
</mapper>

test1

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%> 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
thead{
	background-color: orange;
}
</style>
<script type="text/javascript"
		src="resources/script/jquery/jquery-1.12.4.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){
	$("tbody").on("click", "tr", function(){
		$("#bNo").val($(this).attr("name")); //여기서 this는 클릭한 tr
		$("#goForm").submit();
	}); //tbody end
	
	$("#addBtn").on("click", function(){
		location.href = "test3";
	});//addBtn end
	
	$("#searchBtn").on("click",function(){
			$("#page").val(1);
			$("#searchForm").submit();
	});
	
	$("#pagingWrap").on("click", "span",function(){
		$("#page").val($(this).attr("name"));
		$("#searchForm").submit();
	});
}); //ready end
</script>
</head>
<body>
<form action="test2" id="goForm" method="post">
	<input type="hidden" id="bNo" name="bNo"/>
</form>
<form action="test1" id="searchForm" method="post">
<input type="hidden" id="page" name="page" value="${page}"/>
<select name="searchGbn">
	<c:choose>
		<c:when test="${param.searchGbn eq 0 }">
			<option value="0" selected="selected">제목</option>
		</c:when>
		<c:otherwise>
			<option value="0">제목</option>
		</c:otherwise>
	</c:choose>
	<c:choose>
		<c:when test="${param.searchGbn eq 1 }">
			<option value="1" selected="selected">작성자</option>
		</c:when>
		<c:otherwise>
			<option value="1">작성자</option>
		</c:otherwise>
	</c:choose>
	<c:choose>
		<c:when test="${param.searchGbn eq 2 }">
			<option value="2" selected="selected">글번호</option>
		</c:when>
		<c:otherwise>
			<option value="2">글번호</option>
		</c:otherwise>
	</c:choose>
</select>
<input type="text" name="searchTxt" value="${param.searchTxt}"/>
<input type="button" value="검색" id="searchBtn"/>
<input type="button" value="작성" id="addBtn"/>
</form>
<table>
	<thead>
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach var="data" items="${list}">
			<tr name="${data.B_NO}">
				<td>${data.B_NO}</td>
				<td>${data.B_TITLE}</td>
				<td>${data.B_WRITER}</td>
				<td>${data.B_DT}</td>
			</tr>
		</c:forEach>
	</tbody>
</table>
<div id="pagingWrap">
<!-- 이전페이지 -->
<span name="1">처음</span>
<c:choose>
	<c:when test="${page eq 1}">
		<span name="1">이전</span>
	</c:when>
	<c:otherwise>
		<span name="${page-1}">이전</span>
	</c:otherwise>
</c:choose>
<!-- 페이지들 -->
<c:forEach var="i" begin="${pb.startPcount}" end="${pb.endPcount}" step="1">
	<!-- 현재 페이지인 경우 볼드 처리 -->
	<c:choose>
		<c:when test="${i eq page}">
			<span name="${i}"><b>${i}</b></span>
		</c:when>
		<c:otherwise>
			<span name="${i}">${i}</span>
		</c:otherwise>
	</c:choose>
</c:forEach>
<!-- 다음페이지 -->
<c:choose>
	<c:when test="${page eq pb.maxPcount}">
		<span name="${pb.maxPcount}"><b>다음</b></span>	
	</c:when>
	<c:otherwise>
		<span name="${page+ 1}">다음</span>
	</c:otherwise>
</c:choose>
<span name="${pb.maxPcount}">마지막</span>
</div>
</body>
</html>

출력 결과


profile
호텔리어 출신 비전공자

0개의 댓글