검색기능을 구현하기 위해 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";
}

 

이제 수정페이지에서 리스트로 돌아가도 검색결과가 잘 유지됨!!