반응형
2024_0710_Visit_Ajax_Mybatis
[ADD] 20240712 1608 게시판 페이징 기능
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(" <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(" <a href='"+pageURL+"?page="); sb.append(i); sb.append("'>");
* sb.append(i); sb.append("</a>");
*/
}
}// end for
// sb.append(" |");
//-----그룹페이지처리 다음 ----------------------------------------------------------------------------------------------
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(" <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(" <a href='"+pageURL+"?page="); sb.append(i); sb.append("'>");
* sb.append(i); sb.append("</a>");
*/
}
}// end for
// sb.append(" |");
//-----그룹페이지처리 다음 ----------------------------------------------------------------------------------------------
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 |