보라코딩
스프링 검색처리 본문
Criterea.java 내용추가
// 검색처리 관련 추가
private String type;
private String keyword;
public String[] getTypeArr() {
return type == null? new String[] {} : type.split("");
}
BoardMapper.xml
<select id="getListWithPaging"
resultType="com.mystudy.domain.BoardVO">
<![CDATA[
select
bno, title, content, writer, regdate, updatedate
from
(
select /*+INDEX_DESC(tbl_board pk_board) */
rownum rn, bno, title, content, writer, regdate, updatedate
from
tbl_board
where
]]>
<trim prefix="(" suffix=") AND " prefixOverrides="OR">
<foreach item='type' collection="typeArr">
<trim prefix="OR">
<choose>
<when test="type == 'T'.toString()">
title like '%'||#{keyword}||'%'
</when>
<when test="type == 'C'.toString()">
content like '%'||#{keyword}||'%'
</when>
<when test="type == 'W'.toString()">
writer like '%'||#{keyword}||'%'
</when>
</choose>
</trim>
</foreach>
</trim>
<![CDATA[
rownum <= #{pageNum} * #{amount}
)
where rn > (#{pageNum} -1) * #{amount}
]]>
</select>
너무 길어서!!!
sql 태그 사용하면 코드 깔끔하고 재사용도 가능하다.
<sql id="criteria">
<trim prefix="(" suffix=") AND " prefixOverrides="OR">
<foreach item='type' collection="typeArr">
<trim prefix="OR">
<choose>
<when test="type == 'T'.toString()">
title like '%'||#{keyword}||'%'
</when>
<when test="type == 'C'.toString()">
content like '%'||#{keyword}||'%'
</when>
<when test="type == 'W'.toString()">
writer like '%'||#{keyword}||'%'
</when>
</choose>
</trim>
</foreach>
</trim>
</sql>
<select id="getListWithPaging"
resultType="com.mystudy.domain.BoardVO">
<![CDATA[
select
bno, title, content, writer, regdate, updatedate
from
(
select /*+INDEX_DESC(tbl_board pk_board) */
rownum rn, bno, title, content, writer, regdate, updatedate
from
tbl_board
where
]]>
<include refid="criteria"></include>
<![CDATA[
rownum <= #{pageNum} * #{amount}
)
where rn > (#{pageNum} -1) * #{amount}
]]>
</select>
화면에서 검색조건 처리
- 페이지 번호처럼 검색조건과 키워드 역시 화면이동시 같이 전송
- 검색버튼 클릭시 1페이지로 이동
- 한글 GET 방식 이동하면 문제생길 수 있어 주의
list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- 부트스트랩 -->
<%@include file="../includes/header.jsp" %>
<!-- Begin Page Content -->
<div class="container-fluid">
<!-- Page Heading -->
<h1 class="h3 mb-2 text-gray-800">게시판</h1>
<p class="mb-4">눈누난나 스프링으로 게시판 만들기 </p>
<!-- DataTales Example -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h5 class="m-0 font-weight-bold text-primary">내가 만든 게시판
<button id='regBtn' type="button" class="btn btn-xs btn-primary float-right">Register</button>
</h5>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>#번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>수정일</th>
</tr>
</thead>
<tbody>
<c:forEach var="board" items="${list}">
<tr>
<td>${board.bno}</td>
<td>
<a class='move' href='${board.bno}'>
${board.title}
</a>
</td>
<td>${board.writer}</td>
<td>
<fmt:formatDate pattern="yyyy-MM-dd" value="${board.regdate}" />
</td>
<td>
<fmt:formatDate pattern="yyyy-MM-dd" value="${board.updatedate}" />
</td>
</tr>
</c:forEach>
</tbody>
</table>
<br>
<div class = 'row'>
<div class="col-lg-12">
<form id='searchForm' action="/board/list" method="get">
<select name='type'>
<option value=""
<c:out value="${pageMaker.cri.type == null?'selected':''}" />>--</option>
<option value="T"
<c:out value="${pageMaker.cri.type eq 'T'?'selected':''}"/>>제목</option>
<option value="C"
<c:out value="${pageMaker.cri.type eq 'C'?'selected':''}"/>>내용</option>
<option value="W"
<c:out value="${pageMaker.cri.type eq 'W'?'selected':''}"/>>작성자</option>
<option value="TC"
<c:out value="${pageMaker.cri.type eq 'TC'?'selected':''}"/>>제목 or 작성자</option>
<option value="TW"
<c:out value="${pageMaker.cri.type eq 'TW'?'selected':''}"/>>제목 or 작성자</option>
<option value="TWC"
<c:out value="${pageMaker.cri.type eq 'TWC'?'selected':''}"/>>제목 or 내용 or 작성자</option>
</select>
<input type='text' name='keyword' value="${pageMaker.cri.keyword}" />
<button class='btn btn-default'>Search</button>
</form>
</div>
</div>
<br><br>
<!-- 페이징처리 -->
<div class='pull-right'>
<ul class="pagination">
<c:if test="${pageMaker.prev}">
<li class="paginate_button previous"><a
href="${pageMaker.startPage -1}">Previous</a></li>
</c:if>
<c:forEach var="num" begin="${pageMaker.startPage}"
end="${pageMaker.endPage}">
<li class="paginate_button ${pageMaker.cri.pageNum == num ? "active":""} ">
<a href="${num}">${num}</a>
</li>
</c:forEach>
<c:if test="${pageMaker.next}">
<li class="paginate_button next"><a
href="${pageMaker.endPage +1 }">Next</a></li>
</c:if>
</ul>
</div>
<!-- 페이징처리 -->
<form id='actionForm' action="/board/list" method='get'>
<input type='hidden' name='pageNum' value='${pageMaker.cri.pageNum}'>
<input type='hidden' name='amount' value='${pageMaker.cri.amount}'>
<input type='hidden' name='type' value='${pageMaker.cri.type}'>
<input type='hidden' name='type' value='${pageMaker.cri.keyword}'>
</form>
</div>
</div>
</div>
</div>
<!-- /.container-fluid -->
</div>
<!-- End of Main Content -->
<!-- Modal-->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="myModalLabel">Modal title</h5>
<button class="close" type="button" data-dismiss="modal" aria-hidden="true">
×</button>
</div>
<div class="modal-body">처리 완료</div>
<div class="modal-footer">
<button class="btn btn-secondary" type="button" data-dismiss="modal">Close</button>
<button class="btn btn-primary" type="button" >Save changes</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
/* 모달 설정 */
var result = '${result}';
checkModal(result);
history.replaceState({}, null, null);
function checkModal(result){
if(result === '' || history.state){
return;
}
if(parseInt(result) > 0 ) {
$(".modal-body").html("게시글 " + parseInt(result) + " 번이 등록되었습니다!");
}
$("#myModal").modal("show");
}
/* 등록버튼 */
$("#regBtn").on("click", function(){
self.location = "/board/register";
})
/* 페이징 처리 */
var actionForm = $("#actionForm");
$(".paginate_button a").on("click", function(e){
e.preventDefault();
console.log('click');
actionForm.find("input[name='pageNum']").val($(this).attr("href"));
actionForm.submit();
});
/* 게시물 조회를 위한 이벤트 처리 추가 */
$(".move").on("click", function(e){
e.preventDefault();
actionForm.append("<input type='hidden' name='bno' value='"+$(this).attr("href")+"'>")
actionForm.attr("action", "/board/get");
actionForm.submit();
});
/* 검색처리 */
var searchForm = $("#searchForm");
$("#searchForm button").on("click", function(e){
if(!searchForm.find("option:selected").val()){
alert("검색종류를 선택하세요");
return false;
}
if(!searchForm.find("input[name='keyword']").val()){
alert("키워드를 입력하세요");
return false;
}
searchForm.find("input[name='pageNum']").val("1");
e.preventDefault();
searchForm.submit();
});
});
</script>
<%@include file="../includes/footer.jsp" %>
get.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- 부트스트랩 -->
<%@include file="../includes/header2.jsp" %>
<link rel="stylesheet" type="text/css" href="resources/mycss.css" />
<div class="row">
<div class="col-lg-12 d-flex justify-content-center">
<h1 class="page-header" style="color:#00498c">Board Read</h1>
</div>
</div>
<div class="row">
<div class="col-lg-10" style="float:none; margin:0 auto;">
<div class="panel panel-default">
<!-- <div class="panel-heading">Board Register</div> -->
<div class="panel-body">
<div class="form-group">
<label style="color:tomato">bno</label>
<input class="form-control" name="bno" value="${board.bno}" readonly="readonly">
</div>
<div class="form-group">
<label style="color:tomato">Title</label>
<input class="form-control" name="title" value="${board.title}" readonly="readonly">
</div>
<div class="form-group">
<label style="color:tomato">Text area</label>
<textarea class="form-control" rows="5" name="content" readonly="readonly">${board.content}</textarea>
</div>
<div class="form-group">
<label style="color:tomato">Writer</label>
<input class="form-control" name="writer" value="${board.writer}" readonly="readonly">
</div>
<div style="text-align:center;">
<button data-oper='modify' class="btn btn-primary"
<%-- onclick="location.href='/board/modify?bno=${board.bno}'" --%>>Modify</button>
<button data-oper='list' class="btn btn-info"
<%-- onclick="location.href='/board/list'" --%>>List</button>
</div>
<form id='operForm' action="/board/modify" method="get">
<input type='hidden' id='bno' name='bno' value="${board.bno}">
<input type='hidden' name='pageNum' value="${cri.pageNum}">
<input type='hidden' name='amount' value="${cri.amount}">
<input type='hidden' name='keyword' value='${cri.keyword}' >
<input type='hidden' name='type' value='${cri.type}' >
</form>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var oper = $("#operForm");
$("button[data-oper='modify']").on("click", function(e){
oper.attr("action", "/board/modify").submit();
});
$("button[data-oper='list']").on("click", function(e){
oper.find("#bno").remove();
oper.attr("action", "/board/list");
oper.submit();
});
});
</script>
<%@include file="../includes/footer.jsp" %>
BoardController.java
@PostMapping("/modify")
@PostMapping("/remove")
두개에 각각
rttr.addAttribute("type", cri.getType());
rttr.addAttribute("keyword", cri.getKeyword());
추가해줘야함!
modify.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!-- 부트스트랩 -->
<%@include file="../includes/header2.jsp" %>
<link rel="stylesheet" type="text/css" href="resources/mycss.css" />
<div class="row">
<div class="col-lg-12 d-flex justify-content-center">
<h1 class="page-header" style="color:#00498c">Board Modify Page</h1>
</div>
</div>
<div class="row">
<div class="col-lg-10" style="float:none; margin:0 auto;">
<div class="panel panel-default">
<!-- <div class="panel-heading">Board Register</div> -->
<div class="panel-body">
<form action="/board/modify" method="post" id="myform">
<div class="form-group">
<label style="color:tomato">bno</label>
<input class="form-control" name="bno" value="${board.bno}" readonly="readonly">
</div>
<div class="form-group">
<label style="color:tomato">Title</label>
<input class="form-control" name="title" value="${board.title}" >
</div>
<div class="form-group">
<label style="color:tomato">Text area</label>
<textarea class="form-control" rows="5" name="content" >${board.content}</textarea>
</div>
<div class="form-group">
<label style="color:tomato">Writer</label>
<input class="form-control" name="writer" value="${board.writer}" readonly="readonly">
</div>
<div class="form-group">
<input type="hidden" class="form-control" name="regdate"
value='<fmt:formatDate pattern = "yyyy/MM/dd" value = "${board.regdate}" />'
readonly="readonly">
</div>
<div class="form-group">
<input type="hidden" class="form-control" name="updatedate"
value='<fmt:formatDate pattern = "yyyy/MM/dd" value = "${board.updatedate}" />'
readonly="readonly">
</div>
<!-- 페이징처리, 검색처리 -->
<input type='hidden' name='pageNum' value='${cri.pageNum}'>
<input type='hidden' name='amount' value='${cri.amount}'>
<input type='hidden' name='type' value='${cri.type}'>
<input type='hidden' name='keyword' value='${cri.keyword}'>
<!-- -->
<div style="text-align:center;">
<button type="submit" data-oper='modify' class="btn btn-primary">Modify</button>
<button type="submit" data-oper='remove' class="btn btn-danger">Remove</button>
<button type="submit" data-oper='list' class="btn btn-info">List</button>
</div>
</form>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function(){
var form = $("#myform");
$('button').on("click", function(e){
e.preventDefault(); //submit 처리되는것 막아
var operation = $(this).data("oper");
console.log(operation);
if(operation === 'remove'){
form.attr("action", "/board/remove");
} else if(operation === 'list'){
form.attr("action", "/board/list").attr("method","get");
var pageNumTag = $("input[name='pageNum']").clone();
var amountTag = $("input[name='amount']").clone();
var keywordTag = $("input[name='keyword']").clone();
var typeTag = $("input[name='type']").clone();
form.empty();
form.append(pageNumTag);
form.append(amountTag);
form.append(keywordTag);
form.append(typeTag);
//self.location = "/board/list";
//return;
}
form.submit();
});
});
</script>
<%@include file="../includes/footer.jsp" %>
코드 더 간결하게!
스프링 UriComponentsBuilder를 이용한 링크 생성
Criteria.java package com.mystudy.domain; import org.springframework.web.util.UriComponentsBuilder; import lombok.Getter; import lombok.Setter; import lombok.ToString; @Getter @Setter @ToString public class Criteria { private int pageNum; private int amoun
boracoding.tistory.com
'코딩 > Spring' 카테고리의 다른 글
스프링 Ajax 쉬운 설명 (0) | 2023.05.17 |
---|---|
스프링 UriComponentsBuilder를 이용한 링크 생성 (0) | 2023.05.16 |
스프링 페이징처리 paging (0) | 2023.05.16 |
스프링 시큐리티 JDBC 간편인증/권한처리 (BCryptPasswordEncoder 클래스) (0) | 2023.05.15 |
스프링 시큐리티 CSRF 토큰, 로그아웃 (0) | 2023.05.15 |