Spring
12.15.(목) Spring Framework(23): 게시판 기능(8)
콜라든포비
2022. 12. 17. 23:19
게시판 목록 검색
제목에 키워드가 포함된 글을 검색할때는 일전에 작성한 목록 쿼리문에 조건식을 붙여주면 된다.
SELECT * FROM
(SELECT * FROM
(SELECT postno, subject FROM board_tbl WHERE subject LIKE '%휴스턴%' ORDER BY postno DESC)
WHERE rownum<=5*1 ORDER BY postno ASC)
WHERE rownum<=5 ORDER BY postno DESC;
우선 boardList.jsp에서 어떤 기준으로 검색할건지 정해주자.
<!-- 검색 기능 -->
<div class="searchDiv">
<form action="/myapp/board/boardList">
<select name="searchKey">
<option value="subject">제목</option>
<option value="content">내용</option>
<option value="username">작성자</option>
</select>
<input type="text" name="searchValue" id="searchValue">
<input type="submit" value="검색">
</form>
</div>
검색값 유효성 검사를 진행한다.
<script>
function searchCheck(){
// 검색어 입력여부 확인
if(document.getElementById("searchValue").value=="") {
alert("검색어를 입력하세요.");
return false;
}
return true;
}
</script>
<!-- 검색 기능 -->
<div class="searchDiv">
<form action="/myapp/board/boardList" onsubmit="return searchCheck()">
<select name="searchKey">
<option value="subject">제목</option>
<option value="content">내용</option>
<option value="username">작성자</option>
</select>
<input type="text" name="searchValue" id="searchValue">
<input type="submit" value="검색">
</form>
</div>
PageVO로 넘어가서 검색에 관련된 변수를 생성하자.
// 검색
private String searchKey;
private String searchValue;
public String getSearchValue() {
return searchValue;
}
public void setSearchValue(String searchValue) {
this.searchValue = searchValue;
}
컨트롤러에서 totalData의 매개변수로 pvo를 넣어주고, 그에 따라 DAO, Service, ServiceImpl 모두 수정한다.
@Override
public List<BoardVO> boardList(PageVO pvo) {
return dao.boardList(pvo);
}
boardMapper.xml에 있는 totalData쿼리문과 boardList쿼리문에 조건문을 붙일 것이다. <if>태그를 이용한다.
내용/제목/작성자에 검색값이 포함된 글의 개수를 구하고,
<select id="totalData" resultType="int">
SELECT count(postno) FROM board_tbl
<if test="searchValue!=null">
WHERE ${searchKey} LIKE '%${searchValue}%'
</if>
</select>
내용/제목/작성자에 검색값이 포함된 글을 전부 불러온다.
<select id="boardList" resultType="com.poby.myapp.vo.BoardVO">
SELECT * FROM
(SELECT * FROM
(SELECT postno, subject, username, hitcount, to_char(regdate, 'mm-dd hh:mi') regdate
FROM board_tbl
<if test="searchValue!=null">
WHERE ${searchKey} LIKE '%${searchValue}%'
</if>
ORDER BY postno DESC)
WHERE rownum<![CDATA[<=]]>${nowPage}*${dataPerPage} ORDER BY postno ASC)
<choose>
<when test="totalPage!=nowPage">
WHERE rownum<![CDATA[<=]]>${dataPerPage} ORDER BY postno DESC
</when>
<otherwise>
WHERE rownum<![CDATA[<=]]>${lastPageData} ORDER BY postno DESC
</otherwise>
</choose>
</select>
검색 결과에 대한 페이지를 따로 설정해주어야 한다. boardList.jsp에서 조건문을 붙여서 검색결과가 있을때만 searchKey와 searchValue를 넘겨주도록 한다.
<!-- 페이지 처리 -->
<div class="pagesDiv">
<ul>
<!-- prev버튼 -->
<c:if test="${ pvo.nowPage==1 }">
<li>prev</li>
</c:if>
<c:if test="${ pvo.nowPage>1 }">
<li><a href='/myapp/board/boardList?nowPage=${ pvo.nowPage-1 }<c:if test="${ pvo.searchValue!=null }">&searchKey=${ pvo.searchKey }&searchValue=${ pvo.searchValue }</c:if>'>prev</a></li>
</c:if>
<!-- 페이지 번호 출력 -->
<c:forEach var="i" begin="${ pvo.startPage }" end="${ pvo.startPage+pvo.pageCount-1 }">
<!-- 출력할 페이지번호(i)는 총 페이지 수(pvo.totalPage)보다 작을때까지 출력한다 -->
<c:if test="${ i<=pvo.totalPage }">
<!-- 현재 페이지 -->
<c:if test="${ i==pvo.nowPage }">
<li style="background-color:#ddd">${ i }</li>
</c:if>
<!-- 현재 페이지 아님 -->
<c:if test="${ i!=pvo.nowPage }">
<li><a href='/myapp/board/boardList?nowPage=${ i }<c:if test="${ pvo.searchValue!=null }">&searchKey=${ pvo.searchKey }&searchValue=${ pvo.searchValue }</c:if>'>${ i }</a></li>
</c:if>
</c:if>
</c:forEach>
<!-- next버튼 -->
<c:if test="${ pvo.nowPage==pvo.totalPage }">
<li>next</li>
</c:if>
<c:if test="${ pvo.nowPage<pvo.totalPage }">
<li><a href='/myapp/board/boardList?nowPage=${ pvo.nowPage+1 }<c:if test="${ pvo.searchValue!=null }">&searchKey=${ pvo.searchKey }&searchValue=${ pvo.searchValue }</c:if>'>next</a></li>
</c:if>
</ul>
</div>
제목에 '다'가 들어간 글을 검색한 결과이다.
searchValue, 즉 검색값이 null이냐 아니냐에 따라서 전체를 보여줄지, 검색값에 해당하는 결과값만 보여줄지를 DAO, boardMapper.xml 그리고 boardList.jsp에 조건을 추가하여 완성했다.