728x90
검색조건처리를 위한 Criteria 클래스 변경
- 검색항목(type)과 검색 키워드(keyword) 추가
package org.zerock.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Criteria {
private int pageNum; // 페이지
private int amount; // 개수
private String type; // 검색 항복
private String keyword; // 키워드
public Criteria() {
this(1,10); // 초기값
}
public Criteria(int pageNum, int amount) {
super();
this.pageNum = pageNum;
this.amount = amount;
}
// 루프를 돌리기 위해서 배열이 필요
public String[] getTypeArr() {
return type == null? new String[] {} : type.split("");
}
}
BoardMapper.xml 수정
(...생략...)
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO"> <!-- xml에서 부등호처리 → cdata -->
<![CDATA[
select *
from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate
from tbl_board
where
]]>
<foreach collection="typeArr" item="type">
<if test="type == 'T'.toString">
title like #{keyword}
</if>
<if test="type == 'C'.toString">
content like #{keyword}
</if>
<if test="type == 'W'.toString">
writer like #{keyword}
</if>
</foreach>
<![CDATA[
bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount}))
where rn > (#{pageNum}-1) * #{amount}
]]>
</select>
(...생략...)
문제가 있는 코드지만 되는지만 확인
BoardMapperTests
(...생략...)
@Test
public void testSearchPaging() {
Criteria criteria = new Criteria();
criteria.setType("T");
criteria.setKeyword("test");
List<BoardVO> list = boardMapper.getListWithPaging(criteria);
for(int i = 0; i < list.size(); i++) {
log.info(list);
}
}
}
BoardMapper 수정
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO"> <!-- xml에서 부등호처리 → cdata -->
<![CDATA[
select *
from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate
from tbl_board
where
]]>
<trim prefix="(" suffix=") AND">
<foreach collection="typeArr" item="type">
<if test="type == 'T'.toString">
title like #{keyword}
</if>
<if test="type == 'C'.toString">
content like #{keyword}
</if>
<if test="type == 'W'.toString">
writer like #{keyword}
</if>
</foreach>
</trim>
<![CDATA[
bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount}))
where rn > (#{pageNum}-1) * #{amount}
]]>
</select>
검색 조건을 다양하게 테스트
BordMapperTests
@Test
public void testSearchPaging() {
Criteria criteria = new Criteria();
// criteria.setType("T");
// criteria.setKeyword("테스트");
List<BoardVO> list = boardMapper.getListWithPaging(criteria);
for(int i = 0; i < list.size(); i++) {
log.info(list);
}
}
다른테스트
@Test
public void testSearchPaging() {
Criteria criteria = new Criteria();
criteria.setType("TCW");
criteria.setKeyword("테스트");
List<BoardVO> list = boardMapper.getListWithPaging(criteria);
for(int i = 0; i < list.size(); i++) {
log.info(list);
}
}
BoardMapper 수정(separator)
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO"> <!-- xml에서 부등호처리 → cdata -->
<![CDATA[
select *
from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate
from tbl_board
where
]]>
<trim prefix="(" suffix=") AND">
<foreach collection="typeArr" item="type" separator="OR">
<if test="type == 'T'.toString">
title like #{keyword}
</if>
<if test="type == 'C'.toString">
content like #{keyword}
</if>
<if test="type == 'W'.toString">
writer like #{keyword}
</if>
</foreach>
</trim>
<![CDATA[
bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount}))
where rn > (#{pageNum}-1) * #{amount}
]]>
</select>
like 처리
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO"> <!-- xml에서 부등호처리 → cdata -->
<![CDATA[
select *
from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate
from tbl_board
where
]]>
<trim prefix="(" suffix=") AND">
<foreach collection="typeArr" item="type" separator="OR">
<if test="type == 'T'.toString">
title like '%'||#{keyword}||'%'
</if>
<if test="type == 'C'.toString">
content like '%'||#{keyword}||'%'
</if>
<if test="type == 'W'.toString">
writer like '%'||#{keyword}||'%'
</if>
</foreach>
</trim>
<![CDATA[
bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount}))
where rn > (#{pageNum}-1) * #{amount}
]]>
</select>
조건이 없을 때
검색 → totalcount도 변경되기 때문에 처리해줘야함 → 그렇지 않으면 화면에서 처리가 안됨
sql 태그는 jsp:include와 같이 사용할 수 있음
BoardMapper.xml 수정
<?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="org.zerock.mapper.BoardMapper">
<sql id="criteria">
<trim prefix="(" suffix=") AND">
<foreach collection="typeArr" item="type" separator="OR">
<if test="type == 'T'.toString">
title like '%'||#{keyword}||'%'
</if>
<if test="type == 'C'.toString">
content like '%'||#{keyword}||'%'
</if>
<if test="type == 'W'.toString">
writer like '%'||#{keyword}||'%'
</if>
</foreach>
</trim>
</sql>
<select id="getList" resultType="org.zerock.domain.BoardVO">
select * from tbl_board order by bno desc
</select>
<insert id="insert">
insert into tbl_board(bno, title, content, writer)
values(seq_board.nextval, #{title}, #{content}, #{writer})
</insert>
<insert id="insertSelectKey">
<selectKey order="BEFORE" keyProperty="bno" resultType="long">
select seq_board.nextval from dual
</selectKey>
insert into tbl_board(bno, title, content, writer)
values(#{bno}, #{title}, #{content}, #{writer})
</insert>
<select id="read" resultType="org.zerock.domain.BoardVO">
select * from tbl_board
where bno = #{bno}
order by bno desc
</select>
<delete id="delete">
delete from tbl_board
where bno=#{bno}
</delete>
<update id="update">
update tbl_board
set title = #{title}, content = #{content}, writer = #{writer}, updateDate = sysdate
where bno = #{bno}
</update>
<select id="getListWithPaging" resultType="org.zerock.domain.BoardVO"> <!-- xml에서 부등호처리 → cdata -->
<![CDATA[
select *
from (select /*+ index_desc(tbl_board pk_board) */ rownum rn, bno, title, writer, regdate,updateDate
from tbl_board
where
]]>
<include refid="criteria"></include>
<![CDATA[
bno > 0 and rownum > 0 and rownum <= (#{pageNum} * #{amount}))
where rn > (#{pageNum}-1) * #{amount}
]]>
</select>
<select id="getTotalCount" resultType="int">
select count(bno) from tbl_board where <include refid="criteria"></include> bno > 0
</select>
<select id="searchTest" resultType="org.zerock.domain.BoardVO">
<![CDATA[
select * from tbl_board
where
]]>
<trim suffix="and">
<foreach collection="map" index="key" item="value" separator="OR" open="(" close=")">
<if test="key == 'T'.toString()">
title like #{value}
</if>
<if test="key == 'C'.toString()">
content like #{value}
</if>
<if test="key == 'W'.toString()">
writer like #{value}
</if>
</foreach>
</trim>
<![CDATA[
rownum < 10
]]>
</select>
</mapper>
화면에서의 검색처리
list.jsp 검색상자 및 버튼 등 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Tables</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">
DataTables Advanced Tables
<button id="regBtn" type="button" class="btn btn-xs pull-right">Register New Board</button>
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<table width="100%" class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>#번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>수정일</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="boardVO">
<tr class="odd gradeX">
<td><c:out value="${boardVO.bno}" /></td>
<td><a class="move" href="<c:out value='${boardVO.bno}' />"><c:out value="${boardVO.title}" /></a></td>
<td><c:out value="${boardVO.writer}" /></td>
<td><fmt:formatDate value="${boardVO.regdate }" pattern="yyyy-MM-dd"/> </td>
<td><fmt:formatDate value="${boardVO.updateDate }" pattern="yyyy-MM-dd" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- /.table-responsive -->
<form id="searchForm" action="/board/list" method="get">
<select name="type">
<option value="T">제목</option>
</select>
<input type="text" name="keyword">
<button class="btn btn-default">Search</button>
</form>
<div class="pull-right">
<ul class="pagination">
<c:if test="${page.prev}">
<li class="page-item"><a class="page-link" href="${page.startPage - 1}" tabindex="-1">Previous</a></li>
</c:if>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
<li class="page-item ${page.criteria.pageNum == num? 'active' :''}"><a class="page-link" href="${num}">${num}</a></li>
</c:forEach>
<c:if test="${page.next}">
<li class="page-item"><a class="page-link" href="${page.endPage + 1}">Next</a></li>
</c:if>
</ul>
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
</form>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<div id="myModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var result = '<c:out value="${result}"/>';
checkModal(result);
history.replaceState({},null,null); // 히스토리 클리어
function checkModal(result){
if(result ==='' || history.state){
return;
}
if(result === 'success'){
$('.modal-body').html("정상적으로 처리됨.");
} else if(parseInt(result)>0){
$('.modal-body').html("게시글 " + parseInt(result) + " 번이 등록됨.");
}
$("#myModal").modal("show");
}
$("#regBtn").click(function(){
self.location = "/board/register";
});
var actionForm = $("#actionForm");
$(".page-link").on("click", function(e){
e.preventDefault(); // a태그는 기능은 이동 → 이동이 되지 않음(기본 동작 제어)
console.log('click');
//form 태그의 내용 변경 후 submit
actionForm.find("input[name='pageNum']").val($(this).attr("href"));
actionForm.submit();
});
$(".move").on("click", function(e){
e.preventDefault();
console.log($(this).attr("href"));
actionForm.append("<input type='hidden' name='bno' value='"+$(this).attr("href")+"'>");
actionForm.attr("action","/board/get").submit();
})
});
</script>
<%@include file="../include/footer.jsp" %>
검색을 할 때 pageNum, amount를 가져가야함
(...생략...)
<div class="pull-right">
<ul class="pagination">
<c:if test="${page.prev}">
<li class="page-item"><a class="page-link" href="${page.startPage - 1}" tabindex="-1">Previous</a></li>
</c:if>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
<li class="page-item ${page.criteria.pageNum == num? 'active' :''}"><a class="page-link" href="${num}">${num}</a></li>
</c:forEach>
<c:if test="${page.next}">
<li class="page-item"><a class="page-link" href="${page.endPage + 1}">Next</a></li>
</c:if>
</ul>
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
</form>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
(...생략...)
이후 검색해보면
이벤트처리
(...생략...)
<form id="searchForm" action="/board/list" method="get">
<select name="type">
<option value="T">제목</option>
</select>
<input type="text" name="keyword">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
<button class="btn btn-default">Search</button>
</form>
<div class="pull-right">
<ul class="pagination">
<c:if test="${page.prev}">
<li class="page-item"><a class="page-link" href="${page.startPage - 1}" tabindex="-1">Previous</a></li>
</c:if>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
<li class="page-item ${page.criteria.pageNum == num? 'active' :''}"><a class="page-link" href="${num}">${num}</a></li>
</c:forEach>
<c:if test="${page.next}">
<li class="page-item"><a class="page-link" href="${page.endPage + 1}">Next</a></li>
</c:if>
</ul>
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
</form>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<div id="myModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
(...생략...)
var searchForm = $("#searchForm");
$("#searchForm button").on("click", function(e){
e.preventDefault();
console.log("클릭........");
})
});
</script>
<%@include file="../include/footer.jsp" %>
확인 후 submit()
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Tables</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">
DataTables Advanced Tables
<button id="regBtn" type="button" class="btn btn-xs pull-right">Register New Board</button>
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<table width="100%" class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>#번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>수정일</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="boardVO">
<tr class="odd gradeX">
<td><c:out value="${boardVO.bno}" /></td>
<td><a class="move" href="<c:out value='${boardVO.bno}' />"><c:out value="${boardVO.title}" /></a></td>
<td><c:out value="${boardVO.writer}" /></td>
<td><fmt:formatDate value="${boardVO.regdate }" pattern="yyyy-MM-dd"/> </td>
<td><fmt:formatDate value="${boardVO.updateDate }" pattern="yyyy-MM-dd" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- /.table-responsive -->
<form id="searchForm" action="/board/list" method="get">
<select name="type">
<option value="T">제목</option>
</select>
<input type="text" name="keyword">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
<button class="btn btn-default">Search</button>
</form>
<div class="pull-right">
<ul class="pagination">
<c:if test="${page.prev}">
<li class="page-item"><a class="page-link" href="${page.startPage - 1}" tabindex="-1">Previous</a></li>
</c:if>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
<li class="page-item ${page.criteria.pageNum == num? 'active' :''}"><a class="page-link" href="${num}">${num}</a></li>
</c:forEach>
<c:if test="${page.next}">
<li class="page-item"><a class="page-link" href="${page.endPage + 1}">Next</a></li>
</c:if>
</ul>
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
</form>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<div id="myModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var result = '<c:out value="${result}"/>';
checkModal(result);
history.replaceState({},null,null); // 히스토리 클리어
function checkModal(result){
if(result ==='' || history.state){
return;
}
if(result === 'success'){
$('.modal-body').html("정상적으로 처리됨.");
} else if(parseInt(result)>0){
$('.modal-body').html("게시글 " + parseInt(result) + " 번이 등록됨.");
}
$("#myModal").modal("show");
}
$("#regBtn").click(function(){
self.location = "/board/register";
});
var actionForm = $("#actionForm");
$(".page-link").on("click", function(e){
e.preventDefault(); // a태그는 기능은 이동 → 이동이 되지 않음(기본 동작 제어)
console.log('click');
//form 태그의 내용 변경 후 submit
actionForm.find("input[name='pageNum']").val($(this).attr("href"));
actionForm.submit();
});
$(".move").on("click", function(e){
e.preventDefault();
console.log($(this).attr("href"));
actionForm.append("<input type='hidden' name='bno' value='"+$(this).attr("href")+"'>");
actionForm.attr("action","/board/get").submit();
});
var searchForm = $("#searchForm");
$("#searchForm button").on("click", function(e){
e.preventDefault();
console.log("클릭........");
searchForm.submit();
});
});
</script>
<%@include file="../include/footer.jsp" %>
option 추가
(...생략...)
<form id="searchForm" action="/board/list" method="get">
<select name="type">
<option value="">---</option>
<option value="T">제목</option>
<option value="C">내용</option>
<option value="W">작성자</option>
<option value="TC">제목+내용</option>
<option value="TCW">제목+내용+작성자</option>
</select>
(...생략...)
검색 버튼을 누른다 → 새롭게 검색을 한다
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Tables</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">
DataTables Advanced Tables
<button id="regBtn" type="button" class="btn btn-xs pull-right">Register New Board</button>
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<table width="100%" class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>#번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>수정일</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="boardVO">
<tr class="odd gradeX">
<td><c:out value="${boardVO.bno}" /></td>
<td><a class="move" href="<c:out value='${boardVO.bno}' />"><c:out value="${boardVO.title}" /></a></td>
<td><c:out value="${boardVO.writer}" /></td>
<td><fmt:formatDate value="${boardVO.regdate }" pattern="yyyy-MM-dd"/> </td>
<td><fmt:formatDate value="${boardVO.updateDate }" pattern="yyyy-MM-dd" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- /.table-responsive -->
<form id="searchForm" action="/board/list" method="get">
<select name="type">
<option value="" ${page.criteria.type == null?"selected":"" }>---</option>
<option value="T" ${page.criteria.type eq 'T'?"selected":"" }>제목</option>
<option value="C" ${page.criteria.type eq 'C'?"selected":"" }>내용</option>
<option value="W" ${page.criteria.type eq 'W'?"selected":"" }>작성자</option>
<option value="TC" ${page.criteria.type eq 'TC'?"selected":"" }>제목+내용</option>
<option value="TCW" ${page.criteria.type eq 'TCW'?"selected":"" }>제목+내용+작성자</option>
</select>
<input type="text" name="keyword" value="${page.criteria.keyword}">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
<button class="btn btn-default">Search</button>
</form>
<div class="pull-right">
<ul class="pagination">
<c:if test="${page.prev}">
<li class="page-item"><a class="page-link" href="${page.startPage - 1}" tabindex="-1">Previous</a></li>
</c:if>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
<li class="page-item ${page.criteria.pageNum == num? 'active' :''}"><a class="page-link" href="${num}">${num}</a></li>
</c:forEach>
<c:if test="${page.next}">
<li class="page-item"><a class="page-link" href="${page.endPage + 1}">Next</a></li>
</c:if>
</ul>
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
</form>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<div id="myModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var result = '<c:out value="${result}"/>';
checkModal(result);
history.replaceState({},null,null); // 히스토리 클리어
function checkModal(result){
if(result ==='' || history.state){
return;
}
if(result === 'success'){
$('.modal-body').html("정상적으로 처리됨.");
} else if(parseInt(result)>0){
$('.modal-body').html("게시글 " + parseInt(result) + " 번이 등록됨.");
}
$("#myModal").modal("show");
}
$("#regBtn").click(function(){
self.location = "/board/register";
});
var actionForm = $("#actionForm");
$(".page-link").on("click", function(e){
e.preventDefault(); // a태그는 기능은 이동 → 이동이 되지 않음(기본 동작 제어)
console.log('click');
//form 태그의 내용 변경 후 submit
actionForm.find("input[name='pageNum']").val($(this).attr("href"));
actionForm.submit();
});
$(".move").on("click", function(e){
e.preventDefault();
console.log($(this).attr("href"));
actionForm.append("<input type='hidden' name='bno' value='"+$(this).attr("href")+"'>");
actionForm.attr("action","/board/get").submit();
});
var searchForm = $("#searchForm");
$("#searchForm button").on("click", function(e){
e.preventDefault();
console.log("클릭........");
searchForm.find("input[name='pageNum']").val(1);
searchForm.submit();
});
});
</script>
<%@include file="../include/footer.jsp" %>
링크 처리
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Tables</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">
DataTables Advanced Tables
<button id="regBtn" type="button" class="btn btn-xs pull-right">Register New Board</button>
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<table width="100%" class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>#번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>수정일</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="boardVO">
<tr class="odd gradeX">
<td><c:out value="${boardVO.bno}" /></td>
<td><a class="move" href="<c:out value='${boardVO.bno}' />"><c:out value="${boardVO.title}" /></a></td>
<td><c:out value="${boardVO.writer}" /></td>
<td><fmt:formatDate value="${boardVO.regdate }" pattern="yyyy-MM-dd"/> </td>
<td><fmt:formatDate value="${boardVO.updateDate }" pattern="yyyy-MM-dd" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<!-- /.table-responsive -->
<form id="searchForm" action="/board/list" method="get">
<select name="type">
<option value="" ${page.criteria.type == null?"selected":"" }>---</option>
<option value="T" ${page.criteria.type eq 'T'?"selected":"" }>제목</option>
<option value="C" ${page.criteria.type eq 'C'?"selected":"" }>내용</option>
<option value="W" ${page.criteria.type eq 'W'?"selected":"" }>작성자</option>
<option value="TC" ${page.criteria.type eq 'TC'?"selected":"" }>제목+내용</option>
<option value="TCW" ${page.criteria.type eq 'TCW'?"selected":"" }>제목+내용+작성자</option>
</select>
<input type="text" name="keyword" value="${page.criteria.keyword}">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
<button class="btn btn-default">Search</button>
</form>
<div class="pull-right">
<ul class="pagination">
<c:if test="${page.prev}">
<li class="page-item"><a class="page-link" href="${page.startPage - 1}" tabindex="-1">Previous</a></li>
</c:if>
<c:forEach begin="${page.startPage}" end="${page.endPage}" var="num">
<li class="page-item ${page.criteria.pageNum == num? 'active' :''}"><a class="page-link" href="${num}">${num}</a></li>
</c:forEach>
<c:if test="${page.next}">
<li class="page-item"><a class="page-link" href="${page.endPage + 1}">Next</a></li>
</c:if>
</ul>
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${page.criteria.pageNum}">
<input type="hidden" name="amount" value="${page.criteria.amount}">
<input type="hidden" name="type" value="${page.criteria.type}">
<input type="hidden" name="keyword" value="${page.criteria.keyword}">
</form>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<div id="myModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var result = '<c:out value="${result}"/>';
checkModal(result);
history.replaceState({},null,null); // 히스토리 클리어
function checkModal(result){
if(result ==='' || history.state){
return;
}
if(result === 'success'){
$('.modal-body').html("정상적으로 처리됨.");
} else if(parseInt(result)>0){
$('.modal-body').html("게시글 " + parseInt(result) + " 번이 등록됨.");
}
$("#myModal").modal("show");
}
$("#regBtn").click(function(){
self.location = "/board/register";
});
var actionForm = $("#actionForm");
$(".page-link").on("click", function(e){
e.preventDefault(); // a태그는 기능은 이동 → 이동이 되지 않음(기본 동작 제어)
console.log('click');
//form 태그의 내용 변경 후 submit
actionForm.find("input[name='pageNum']").val($(this).attr("href"));
actionForm.submit();
});
$(".move").on("click", function(e){
e.preventDefault();
console.log($(this).attr("href"));
actionForm.append("<input type='hidden' name='bno' value='"+$(this).attr("href")+"'>");
actionForm.attr("action","/board/get").submit();
});
var searchForm = $("#searchForm");
$("#searchForm button").on("click", function(e){
e.preventDefault();
console.log("클릭........");
searchForm.find("input[name='pageNum']").val(1);
searchForm.submit();
});
});
</script>
<%@include file="../include/footer.jsp" %>
기타 검색 처리
- 검색 후 조회, 수정, 삭제 페이지 이동 시 검색 항목 유지
RedirectAttribute에 검색 관련 내용을 추가하는 방식
UriComponentsBuilder를 이용해서 Criteria에서 링크를 생성하는 방식
get.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<div class="row">
<div class="col-lg-12">
<h1 class="page-header">Board Read</h1>
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-heading">
Board Read
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<div class="form-group">
<label>BNO</label> <input name="title" class="form-control" readonly="readonly" value="<c:out value='${boardVO.bno}'/>">
</div>
<div class="form-group">
<label>Title</label> <input name="title" class="form-control" readonly="readonly" value="<c:out value='${boardVO.title}'/>">
</div>
<div class="form-group">
<label>Content</label> <textarea rows="5" cols="50" class="form-control" name="content"><c:out value='${boardVO.content}'/></textarea>
</div>
<div class="form-group">
<label>Writer</label> <input name="writer" class="form-control" value="<c:out value='${boardVO.writer}'/>">
</div>
<form id="actionForm" action="/board/list" method="get">
<input type="hidden" name="pageNum" value="${criteria.pageNum}">
<input type="hidden" name="amount" value="${criteria.amount}">
<input type="hidden" name="bno" value="${boardVO.bno}">
<input type="hidden" name="type" value="${criteria.type}">
<input type="hidden" name="keyword" value="${criteria.keyword}">
</form>
<button type="button" class="btn btn-default listBtn"><a href="/board/list">List</a></button>
<button type="button" class="btn btn-default modiBtn"><a href="/board/modify?bno=<c:out value='${boardVO.bno }'/>">Modify</a></button>
<script>
var actionForm = $("#actionForm");
$('.listBtn').click(function(e){
e.preventDefault();
actionForm.find("input[name='bno']").remove();
actionForm.submit();
});
$('.modiBtn').click(function(e){
e.preventDefault();
actionForm.attr("action","/board/modify");
actionForm.submit();
});
</script>
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<%@include file="../include/footer.jsp" %>
redirect하는 경우
BoardController
@PostMapping("/modify")
public String modify(BoardVO boardVO, RedirectAttributes redirectAttributes, Criteria criteria) {
log.info("BoardController modify()......................");
int count = boardService.modify(boardVO);
if(count == 1) {
redirectAttributes.addFlashAttribute("result", "success");
}
redirectAttributes.addAttribute("pageNum",criteria.getPageNum());
redirectAttributes.addAttribute("amount",criteria.getAmount());
redirectAttributes.addAttribute("type",criteria.getType());
redirectAttributes.addAttribute("keyword",criteria.getKeyword());
return "redirect:/board/list";
}
@PostMapping("/remove")
public String remove(@RequestParam("bno") Long bno, RedirectAttributes redirectAttributes, Criteria criteria) {
log.info("BoardController remove()......................");
int count = boardService.remove(bno);
if(count == 1) {
redirectAttributes.addFlashAttribute("result", "success");
}
redirectAttributes.addAttribute("pageNum",criteria.getPageNum());
redirectAttributes.addAttribute("amount",criteria.getAmount());
redirectAttributes.addAttribute("type",criteria.getType());
redirectAttributes.addAttribute("keyword",criteria.getKeyword());
return "redirect:/board/list";
}
728x90
'organize > 스프링' 카테고리의 다른 글
스프링 웹 프로젝트 14 (0) | 2025.01.13 |
---|---|
스프링 웹 프로젝트 13 (0) | 2025.01.12 |
스프링 웹 프로젝트 12 (0) | 2025.01.11 |
스프링 웹 프로젝트 11 (0) | 2025.01.09 |
스프링 웹 프로젝트 10 (0) | 2025.01.08 |