게시판 페이징 처리

메타플랫폼대표
|2024. 7. 12. 15:24
반응형

2024_0710_Visit_Ajax_Mybatis
[ADD] 20240712 1608 게시판 페이징 기능

 

GitHub - chaSunil/FirstProject: 1차 프로젝트

1차 프로젝트. Contribute to chaSunil/FirstProject development by creating an account on GitHub.

github.com

 

 

Mybatis 수정하기

	<!-- 검색조건별 조회 -->
	<select id="visit_list_condition" parameterType="Map" resultType="visit">
		<!-- 페이징 처리를 위해 no를 명시함 -->
		select * from
		(
			select
				rank() over(order by idx desc) as no,
				v.*
			from
			(
			select * from visit		
			<!-- Dynamic Query: 조건별 query -->
			<trim prefix="where" prefixOverrides="or"> <!-- prefixOverrides 지정한 문자열을 제거하여 재정의 => content만을 수행할 때 where or ... 가 나오는 상황 방지 -->
				<if test="name!=null"> <!-- DB에서 문자열 결합 연산 || -->
					name like '%' || #{ name } || '%'
				</if>
				<if test="content!=null">
					or content like '%' || #{ content } || '%'
				</if>
			</trim>	
			) v
		)
		where no between #{ start } and #{ end }
			
	</select>
	
	<!-- 검색 조건별 레코드 수 구하기 -->
	<select id="visit_row_total" parameterType="Map" resultType="int">
		select nvl(count(*),0) from visit_view		
		<!-- Dynamic Query: 조건별 query -->
		<trim prefix="where" prefixOverrides="or"> <!-- prefixOverrides 지정한 문자열을 제거하여 재정의 => content만을 수행할 때 where or ... 가 나오는 상황 방지 -->
			<if test="name!=null"> <!-- DB에서 문자열 결합 연산 || -->
				name like '%' || #{ name } || '%'
			</if>
			<if test="content!=null">
				or content like '%' || #{ content } || '%'
			</if>
		</trim>	
	</select>

 

 

 

Dao 수정하기

	public List<VisitVo> selectList(Map<String, Object> map) {
		
		List<VisitVo> list = null;
		
		// 1. SqlSession 얻어오기
		SqlSession sqlSession = factory.openSession(); // Connection 획득
		
		// 2. 작업수행                namespace
		list = sqlSession.selectList("visit.visit_list_condition", map);
		
		// 3. 닫기 : conn.close()과정 포함
		sqlSession.close();

		return list;
	}
    
    
    public int selectRowTotal() {
		// TODO Auto-generated method stub
		int total = 0;
		
		// 1. SqlSession 얻어오기
		SqlSession sqlSession = factory.openSession();

		// 2. 작업수행
		total = sqlSession.selectOne("visit.visit_row_total");

		// 3. 닫기 : conn.close() 과정 포함
		sqlSession.close();
		
		return total;
	}

 

 

 

MyCommon 작성하기

package action.util;

public class MyCommon {
	
	public static class Visit{
		
		public static final int BLOCK_LIST = 2; // 한화면에 보여줄 게시물수
		public static final int BLOCK_PAGE = 5; // 한화면에 보여줄 페이지수
	}

}

 

 

 

Paging.java 추가하기

package action.util;
/*
        nowPage:현재페이지
        rowTotal:전체데이터갯수
        blockList:한페이지당 게시물수
        blockPage:한화면에 나타낼 페이지 목록수
 */
public class Paging {
	public static String getPaging(String pageURL,int nowPage, int rowTotal,int blockList, int blockPage){
		
		int totalPage/*전체페이지수*/,
            startPage/*시작페이지번호*/,
            endPage;/*마지막페이지번호*/

		boolean  isPrevPage,isNextPage;
		StringBuffer sb; //모든 상황을 판단하여 HTML코드를 저장할 곳
		
		
		isPrevPage=isNextPage=false;
		//입력된 전체 자원을 통해 전체 페이지 수를 구한다..
		totalPage = rowTotal/blockList; // total 게시물 개수 / 한페이지 게시물 개수
		if(rowTotal%blockList!=0)totalPage++;
		

		//만약 잘못된 연산과 움직임으로 인하여 현재 페이지 수가 전체 페이지 수를
		//넘을 경우 강제로 현재페이지 값을 전체 페이지 값으로 변경
		if(nowPage > totalPage)nowPage = totalPage;
		

		//시작 페이지와 마지막 페이지를 구함.
		startPage = ((nowPage-1)/blockPage)*blockPage+1;
		endPage = startPage + blockPage - 1; //
		
		//마지막 페이지 수가 전체페이지수보다 크면 마지막페이지 값을 변경
		if(endPage > totalPage)endPage = totalPage;
		
		//마지막페이지가 전체페이지보다 작을 경우 다음 페이징이 적용할 수 있도록
		//boolean형 변수의 값을 설정
		if(endPage < totalPage) isNextPage = true;
		
		
		//시작페이지의 값이 1보다 작으면 이전페이징 적용할 수 있도록 값설정
		if(startPage > 1)isPrevPage = true;
		
		//HTML코드를 저장할 StringBuffer생성=>코드생성
		sb = new StringBuffer("<ul class='pagination'>");
//-----그룹페이지처리 이전 --------------------------------------------------------------------------------------------		
		if(isPrevPage){
			
			sb.append(String.format("<li><a href='list.do?page=%d'>🐈</a></li>", startPage-1));
			/*
			 * sb.append("<a href ='"+pageURL+"?page="); // sb.append(nowPage - blockPage);
			 * sb.append(startPage - 1); // startPage - 1은 이전 page의 마지막 번호로 가진다.
			 * sb.append("'>🐈</a>");
			 */
		}
		else
			sb.append("<li><a href='#'>🐈</a></li>");
		
//------페이지 목록 출력 -------------------------------------------------------------------------------------------------
		// sb.append("|");
		
		for(int i=startPage; i<= endPage ;i++){
			// if(i>totalPage)break;
			if(i == nowPage){ //현재 있는 페이지
				sb.append(String.format(" <li class='active'><a href='#'>%d</a></li>", i));
				/*
				 * sb.append("&nbsp;<b><font color='red'>"); sb.append(i);
				 * sb.append("</font></b>");
				 */
			}
			else{//현재 페이지가 아니면
				sb.append(String.format(" <li><a href='list.do?page=%d'>%d</a></li>", i, i));
				/*
				 * sb.append("&nbsp;<a href='"+pageURL+"?page="); sb.append(i); sb.append("'>");
				 * sb.append(i); sb.append("</a>");
				 */
			}
		}// end for
		
		// sb.append("&nbsp;|");
		
//-----그룹페이지처리 다음 ----------------------------------------------------------------------------------------------
		if(isNextPage){
			sb.append(String.format("<li><a href='list.do?page=%d'>🐑</a></li>", endPage+1));
			/*
			 * sb.append("<a href='"+pageURL+"?page="); sb.append(endPage + 1);
			 * sb.append(nowPage); sb.append("'>🐑</a>");
			 */
		}
		else
			sb.append("<li><a href='#'>🐑</a></li>");
			/* sb.append("🐑"); */
//---------------------------------------------------------------------------------------------------------------------	    

		sb.append("</ul>");
		
		return sb.toString();
	}
}

 

 

 

VisitListAction 수정하기

/**
 * Servlet implementation class VisitListAction
 */
@WebServlet("/visit/list.do")
public class VisitListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// /visit/list.do
		// /visit/list.do??search=all&search_text=
		// /visit/list.do??search=name&search_text=길동
		// /visit/list.do??search=content&search_text=내용
		// /visit/list.do??search=name_content&search_text=길동(이름이나 내용이 길동)
		
		// 0. 수신인코딩 설정
		request.setCharacterEncoding("utf-8");
		
		// 1. parameter 받기
		String search		=		request.getParameter("search");
		String search_text	=		request.getParameter("search_text");
		
		// search 값이 안들어왔을때 그냥 default로 전체보기로 보여주겠다.(안넣어주면 nullPointException)
		if(search==null) {
			search="all";
		}
		
		
		
		int nowPage = 1;
		try {
			nowPage = Integer.parseInt(request.getParameter("page"));
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		// start/end
		int BLOCK_LIST = 2;
		int start = (nowPage-1) * BLOCK_LIST + 1;
		int end = start + BLOCK_LIST - 1;
		
		
		
		
		// 검색조건을 담을 맵
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("start",start);
		map.put("end",end);
		
		// 이름 + 내용
		if(search.equals("name_content")) {
			map.put("name", search_text); // 데이터를 찾아오는 값에 이름에다가두 넣구우
			map.put("content", search_text); // 내용에다가두 넣구우
		} else if(search.equals("name")) { // 문자열 비교는 무조건 equals //search=="name"(X)
		// 이름
			map.put("name", search_text);
		} else if(search.equals("content")) {
		// 내용
			map.put("content", search_text);
		}
		
		// 방명록 데이터 가져오기
		List<VisitVo> list = VisitDao.getInstance().selectList(map);
		
		// 전체 게시물수
		int rowTotal = VisitDao.getInstance().selectRowTotal();
		
		// pageMenu 만들기
		String pageMenu = Paging.getPaging("list.do",   // pageURL
											nowPage,    // 현재페이지
											rowTotal,   // 전체페이지
											MyCommon.Visit.BLOCK_LIST,  // 한화면에 보여질 게시물 수
											MyCommon.Visit.BLOCK_PAGE); // 한화면에 보여질 페이지 수
		
		// request binding
		request.setAttribute("list", list);
		request.setAttribute("pageMenu", pageMenu);
		
		// Dispatcher형식으로 호출
		String forward_page = "visit_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

 

 

jsp 추가하기

		<!-- 페이지 메뉴 -->
		<div style="text-align:center; margin-top:20px;">
			${ pageMenu }
		</div>

 

 

 

 


 

 

다른 페이지로 가도 내가 입력한 카테고리를 유지시키기

 

 

 

Filter 추가하기

	public static String getPaging(String pageURL,String filter,int nowPage, int rowTotal,int blockList, int blockPage){
		
		int totalPage/*전체페이지수*/,
		startPage/*시작페이지번호*/,
		endPage;/*마지막페이지번호*/
		
		boolean  isPrevPage,isNextPage;
		StringBuffer sb; //모든 상황을 판단하여 HTML코드를 저장할 곳
		
		
		isPrevPage=isNextPage=false;
		//입력된 전체 자원을 통해 전체 페이지 수를 구한다..
		totalPage = rowTotal/blockList; // total 게시물 개수 / 한페이지 게시물 개수
		if(rowTotal%blockList!=0)totalPage++;
		
		
		//만약 잘못된 연산과 움직임으로 인하여 현재 페이지 수가 전체 페이지 수를
		//넘을 경우 강제로 현재페이지 값을 전체 페이지 값으로 변경
		if(nowPage > totalPage)nowPage = totalPage;
		
		
		//시작 페이지와 마지막 페이지를 구함.
		startPage = ((nowPage-1)/blockPage)*blockPage+1;
		endPage = startPage + blockPage - 1; //
		
		//마지막 페이지 수가 전체페이지수보다 크면 마지막페이지 값을 변경
		if(endPage > totalPage)endPage = totalPage;
		
		//마지막페이지가 전체페이지보다 작을 경우 다음 페이징이 적용할 수 있도록
		//boolean형 변수의 값을 설정
		if(endPage < totalPage) isNextPage = true;
		
		
		//시작페이지의 값이 1보다 작으면 이전페이징 적용할 수 있도록 값설정
		if(startPage > 1)isPrevPage = true;
		
		//HTML코드를 저장할 StringBuffer생성=>코드생성
		sb = new StringBuffer("<ul class='pagination'>");
//-----그룹페이지처리 이전 --------------------------------------------------------------------------------------------		
		if(isPrevPage){
			
			sb.append(String.format("<li><a href='list.do?page=%d&%s'>🐈</a></li>", startPage-1, filter));
			/*
			 * sb.append("<a href ='"+pageURL+"?page="); // sb.append(nowPage - blockPage);
			 * sb.append(startPage - 1); // startPage - 1은 이전 page의 마지막 번호로 가진다.
			 * sb.append("'>🐈</a>");
			 */
		}
		else
			sb.append("<li><a href='#'>🐈</a></li>");
		
//------페이지 목록 출력 -------------------------------------------------------------------------------------------------
		// sb.append("|");
		
		for(int i=startPage; i<= endPage ;i++){
			// if(i>totalPage)break;
			if(i == nowPage){ //현재 있는 페이지
				sb.append(String.format(" <li class='active'><a href='#'>%d</a></li>", i));
				/*
				 * sb.append("&nbsp;<b><font color='red'>"); sb.append(i);
				 * sb.append("</font></b>");
				 */
			}
			else{//현재 페이지가 아니면
				sb.append(String.format(" <li><a href='list.do?page=%d&%s'>%d</a></li>", i, filter, i));
				/*
				 * sb.append("&nbsp;<a href='"+pageURL+"?page="); sb.append(i); sb.append("'>");
				 * sb.append(i); sb.append("</a>");
				 */
			}
		}// end for
		
		// sb.append("&nbsp;|");
		
//-----그룹페이지처리 다음 ----------------------------------------------------------------------------------------------
		if(isNextPage){
			sb.append(String.format("<li><a href='list.do?page=%d&%s'>🐑</a></li>", endPage+1, filter));
			/*
			 * sb.append("<a href='"+pageURL+"?page="); sb.append(endPage + 1);
			 * sb.append(nowPage); sb.append("'>🐑</a>");
			 */
		}
		else
			sb.append("<li><a href='#'>🐑</a></li>");
		/* sb.append("🐑"); */
//---------------------------------------------------------------------------------------------------------------------	    
		
		sb.append("</ul>");
		
		return sb.toString();
	}

 

 

 

VisitListAction 수정하기

/**
 * Servlet implementation class VisitListAction
 */
@WebServlet("/visit/list.do")
public class VisitListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// /visit/list.do
		// /visit/list.do??search=all&search_text=
		// /visit/list.do??search=name&search_text=길동
		// /visit/list.do??search=content&search_text=내용
		// /visit/list.do??search=name_content&search_text=길동(이름이나 내용이 길동)
		
		// 0. 수신인코딩 설정
		request.setCharacterEncoding("utf-8");
		
		// 1. parameter 받기
		String search		=		request.getParameter("search");
		String search_text	=		request.getParameter("search_text");
		
		// search 값이 안들어왔을때 그냥 default로 전체보기로 보여주겠다.(안넣어주면 nullPointException)
		if(search==null) {
			search="all";
		}
		
		
		
		int nowPage = 1;
		try {
			nowPage = Integer.parseInt(request.getParameter("page"));
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		// start/end
		int BLOCK_LIST = 2;
		int start = (nowPage-1) * BLOCK_LIST + 1;
		int end = start + BLOCK_LIST - 1;
		
		// 검색조건을 담을 맵
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("start",start);
		map.put("end",end);
		
		
		
		
		// 이름 + 내용
		if(search.equals("name_content")) {
			map.put("name", search_text); // 데이터를 찾아오는 값에 이름에다가두 넣구우
			map.put("content", search_text); // 내용에다가두 넣구우
		} else if(search.equals("name")) { // 문자열 비교는 무조건 equals //search=="name"(X)
		// 이름
			map.put("name", search_text);
		} else if(search.equals("content")) {
		// 내용
			map.put("content", search_text);
		}
		
		// 방명록 데이터 가져오기
		List<VisitVo> list = VisitDao.getInstance().selectList(map);
		
		// 전체 게시물수
		int rowTotal = VisitDao.getInstance().selectRowTotal();
		
		// 검색정보 filter : search_filter = "search=name&search_text=길동"
		String search_filter = String.format("search=%s&search_text=%s", search, search_text);
		
		// pageMenu 만들기
		String pageMenu = Paging.getPaging("list.do",   // pageURL
											search_filter,
											nowPage,    // 현재페이지
											rowTotal,   // 전체페이지
											MyCommon.Visit.BLOCK_LIST,  // 한화면에 보여질 게시물 수
											MyCommon.Visit.BLOCK_PAGE); // 한화면에 보여질 페이지 수
		
		// request binding
		request.setAttribute("list", list);
		request.setAttribute("pageMenu", pageMenu);
		
		// Dispatcher형식으로 호출
		String forward_page = "visit_list.jsp";
		RequestDispatcher disp = request.getRequestDispatcher(forward_page);
		disp.forward(request, response);

	}

}

 

 

 


 

 

 

 

수정할 때 filter 값을 그대로 가져오기

		$.ajax({
			url		:	"check_pwd.do",
			data	:	{"idx":idx, "c_pwd":c_pwd},
			datType : "json",
			success : function(res_data) {
				
				if(res_data.result==false) {
					alert("수정할 게시물의 비밀번호가 틀립니다.");
					return;
				}
				if(confirm("정말 수정하시겠습니까?")==false) {
					return;
				}
				
				// 수정폼 띄우기
				// JSP 내에서 back-tic 사용시 자바스크립트 변수표현 : \${자바스크립트 변수}
				location.href=`modify_form.do?idx=\${ idx }&page=${ empty param.page ? 1 : param.page }&search=${ empty param.search ? 'all' : param.search }&search_text=${ param.search_text }`;
			},
			error	: function(err) {
				alert(err.responseText);
			}
		});

 

 

 

modify_form 수정하기

		<input type="hidden" name="page" value="${ param.page }">		
		<input type="hidden" name="search" value="${ param.search }">		
		<input type="hidden" name="search_text" value="${ param.search_text }">		
		<%-- <input type="hidden" name="no" value="${ param.no }">		 --%>
		<div id="box">
			<h1 id="title">나의 글을 수정합니다.</h1>
			<!-- Ctrl + Shift + F -->
			<div class="panel panel-primary">
				<div class="panel-heading"><h4>수정하기</h4></div>
				<div class="panel-body">

 

 

 

VisitModifyAction 수정하기

package action;

import java.io.IOException;

import dao.VisitDao;
import db.vo.VisitVo;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class VisitModifyAction
 */
@WebServlet("/visit/modify.do")
public class VisitModifyAction extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		// 수신 인코딩 설정
		request.setCharacterEncoding("utf-8");
		
		// parameter 받기
		int idx = Integer.parseInt(request.getParameter("idx"));
		// String no = request.getParameter("no");
		String name = request.getParameter("name");
		String content = request.getParameter("content").replaceAll("\n", "<br>");
		String pwd = request.getParameter("pwd");
		
		
		String page = request.getParameter("page");
		String search = request.getParameter("search");
		String search_text = request.getParameter("search_text");
		
		// ip주소 얻어온다
		String ip = request.getRemoteAddr();
		
		// VisitVo 포장
		VisitVo vo = new VisitVo(idx, name, content, pwd, ip);
		
		// DB 수정하기
		int res = VisitDao.getInstance().update(vo);
		
		// 목록보기로 이동
		
		String redirect_page = String.format("list.do?page=%s&search=%s&search_text=%s", page, search, URLEncoder.encode(search_text, "utf-8"));
		response.sendRedirect(redirect_page);

	}

}
반응형

'데이터베이스↗' 카테고리의 다른 글

MySQL 사용기  (0) 2024.08.14
MySQL 설치 가이드 / 사용하기  (0) 2024.08.14
페이징 처리  (0) 2024.07.12
Mybatis Double Table deptMap  (0) 2024.07.11
Mybatis 검색기능 Search  (0) 2024.07.11