검색기능을 구현하기 위해 Criteria 파일 수정
@Data
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) {
this.pageNum = pageNum;
this.amount = amount;
}
public String[] getTypeArr() {
return type == null? new String[] {} : type.split("");
}
}
boardMapper.xml 파일에 getListWithPaging 쿼리와 getTotalCnt 쿼리문 수정
<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.hanul.springstudent.domain.BoardDTO">
<![CDATA[
SELECT bno,
title,
content,
writer,
regdate,
viewcount
FROM (
SELECT /*+ INDEX_DESC(tbl_board IDX_tbl_board_PK) */
rownum rn,
bno,
title,
content,
writer,
regdate,
viewcount
FROM tbl_board
WHERE
]]>
<include refid="criteria"></include>
<![CDATA[
rownum <= #{pageNum} * #{amount}
)
WHERE rn > (#{pageNum} - 1) * #{amount}
]]>
</select>
<select id="getTotalCnt" resultType="int">
SELECT count(*)
FROM tbl_board
WHERE
<include refid="criteria"></include>
bno > 0
</select>
잘 동작하는지 테스트하기 위해 IBoardDAOtest 파일에 테스트케이스 생성
@Test
public void testSearch() throws Exception {
Criteria cri = new Criteria();
cri.setKeyword("수정");
cri.setType("TC");
List<BoardDTO> list = bDao.listAll(cri);
list.forEach(board -> log.info(board));
}
빈공간 우클릭하여 JUnit Test 실행
우측 JUnit탭에 초록색으로 표시되고 하단 콘솔창에 출력이 잘 된다면 테스트 성공!
list.jsp 파일에 가서 검색창 코드 추가
<!-- 검색 추가 -->
<div class="row">
<div class="col-lg-12">
<form id="searchForm" action="${ctx }/board/list" method="get" class="pull-right lead">
<select name="type" class="input-sm">
<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' : '' }" />>제목+내용</option>
<option value="TW" <c:out value="${pageMaker.cri.type eq 'TW' ? 'selected' : '' }" />>제목+작성자</option>
<option value="TCW" <c:out value="${pageMaker.cri.type eq 'TCW' ? 'selected' : '' }" />>제목+내용+작성자</option>
</select>
<input type="text" name="keyword" class="input-sm" placeholder="검색어를 입력하세요" value="${pageMaker.cri.keyword }">
<input type="hidden" name="pageNum" value="${pageMaker.cri.pageNum }">
<input type="hidden" name="amount" value="${pageMaker.cri.amount }">
<button class="btn btn-default">Search</button>
</form>
</div>
</div>
그리고 페이징에도 코드 추가해주기
<input type="hidden" name="type" value="${pageMaker.cri.type }">
<input type="hidden" name="keyword" value="${pageMaker.cri.keyword }">
그리고 http://localhost:9090/board/list에 들어가서 검색을 하면 기능이 잘 작동함
그리고 검색 후 상세페이지로 접속했다가 List버튼을 눌러 돌아왔을 때 검색결과를 유지하기 위해 read.jsp 파일에 코드 추가
<input type="hidden" name="type" value="${cri.type }">
<input type="hidden" name="keyword" value="${cri.keyword }">
그리고 수정페이지에서 List 버튼 클릭 시 검색결과를 유지하기 위해 modify.jsp에 코드 추가
<input type="hidden" id="type" name="type" value="${cri.type }">
<input type="hidden" id="keyword" name="keyword" value="${cri.keyword }">
modify.jsp 하단 제이쿼리 수정
$(function() {
var formObj = $("form");
$("button").on("click", function(e) {
e.preventDefault();
var operation = $(this).data("oper");
console.log(operation);
if(operation === 'remove') {
formObj.attr("action", "${ctx}/board/remove");
} else if(operation === 'list') {
formObj.attr("action", "${ctx}/board/list").attr("method", "get");
var pageNumTag = $("input[name='pageNum']").clone();
var amountTag = $("input[name='amount']").clone();
var type = $("input[name='type']").clone();
var keyword = $("input[name='keyword']").clone();
formObj.empty();
formObj.append(pageNumTag);
formObj.append(amountTag);
formObj.append(type);
formObj.append(keyword);
}
formObj.submit();
});
});
BoardController 파일 수정, 삭제 메소드 수정
@RequestMapping(value = "/modify", method = RequestMethod.POST)
public String modifyPOST(BoardDTO bDto, @ModelAttribute("cri") Criteria cri, RedirectAttributes rttr) throws Exception {
log.info("modify post...............");
if(service.modify(bDto)) {
rttr.addFlashAttribute("result", "success");
}
rttr.addAttribute("pageNum", cri.getPageNum());
rttr.addAttribute("amount", cri.getAmount());
rttr.addAttribute("type", cri.getType());
rttr.addAttribute("keyword", cri.getKeyword());
return "redirect:/board/list";
}
// 삭제
@RequestMapping(value = "/remove", method = RequestMethod.POST)
public String remove(@RequestParam("bno") int bno, @ModelAttribute("cri") Criteria cri, RedirectAttributes rttr) throws Exception {
log.info("remove..................");
if(service.remove(bno)) {
rttr.addFlashAttribute("result", "success");
}
rttr.addAttribute("pageNum", cri.getPageNum());
rttr.addAttribute("amount", cri.getAmount());
rttr.addAttribute("type", cri.getType());
rttr.addAttribute("keyword", cri.getKeyword());
return "redirect:/board/list";
}
이제 수정페이지에서 리스트로 돌아가도 검색결과가 잘 유지됨!!
'Programming > Spring' 카테고리의 다른 글
[STS3] 댓글 기능(1) (0) | 2024.04.22 |
---|---|
[STS3] 파일 업로드(1) (0) | 2024.04.22 |
[STS3] Mapper를 활용하여 게시판 구현(6) (2) | 2024.04.18 |
[STS3] Mapper를 활용하여 게시판 구현(5) (0) | 2024.04.17 |
[STS3] Mapper를 활용하여 게시판 구현(4) (0) | 2024.04.17 |