MelonPeach

11.스프링 게시판 만들기 / 게시판 검색  기능 구현

 

안녕하세요?

MelonPeach입니다. 

이전 포스팅에서 페이징 기능을 구현하였는데요.

이번에는 게시판에서 검색 기능을 추가하려고합니다.

 

1. boardMapper 작성


boardMapper.xml

 

먼저 boardMapper.xml에서 listPage쿼리, listCount를 수정해줍니다.

그리고 동적 쿼리 sql문을 만들어서 추가해줍니다.

 

<select id="listPage" resultType="kr.co.vo.BoardVO" parameterType="kr.co.vo.SearchCriteria">
		SELECT  BNO, 
		        TITLE, 
		        CONTENT,
		        WRITER, 
		        REGDATE
		 FROM ( 
		        SELECT BNO, 
		               TITLE, 
		               CONTENT, 
		               WRITER, 
		               REGDATE, 
		               ROW_NUMBER() OVER(ORDER BY BNO DESC) AS RNUM
		         FROM MP_BOARD
		         WHERE 1=1 
		         	<include refid="search"></include>
		                       ) MP
		WHERE RNUM BETWEEN #{rowStart} AND #{rowEnd}
		ORDER BY BNO DESC
	</select>
	
	<select id="listCount" parameterType="kr.co.vo.SearchCriteria" resultType="int">
		SELECT COUNT(BNO)
		   FROM MP_BOARD
		   WHERE 1=1
		<include refid="search"></include>	
		   AND BNO > 0
	</select>
	
	<sql id="search">
		<if test="searchType != null">
			<if test="searchType == 't'.toString()">AND TITLE LIKE '%' || #{keyword} || '%'</if>
			<if test="searchType == 'c'.toString()">AND CONTENT LIKE '%' || #{keyword} || '%'</if>
			<if test="searchType == 'w'.toString()">AND WRITER LIKE '%' || #{keyword} || '%'</if>
			<if test="searchType == 'tc'.toString()">AND (TITLE LIKE '%' || #{keyword} || '%') or (CONTENT LIKE '%' || #{keyword} || '%')</if>
		</if>
	</sql>

 

 

2. SearchCriteria 작성


SearchCriteria.java

 

이제는 검색타입과 검색어를 쓸수 있게 vo폴더에 SearchCriteria.java를 생성합니다.

Criteria를 extends했기때문에 SearchCriteria로 Criteria기능을 사용할 수 있습니다.

 

package kr.co.vo;

public class SearchCriteria extends Criteria{

	private String searchType = "";
	private String keyword = "";
	 
	public String getSearchType() {
		return searchType;
	}
	public void setSearchType(String searchType) {
		this.searchType = searchType;
	}
	public String getKeyword() {
		return keyword;
	}
	public void setKeyword(String keyword) {
		this.keyword = keyword;
	}
	@Override
	public String toString() {
		return "SearchCriteria [searchType=" + searchType + ", keyword=" + keyword + "]";
	}
	
}

 

 

3.  PageMaker 작성


PageMaker.java

 

그 후 PageMaker.java에서 page, perPageNum, searchType, keyword를 url로 사용할수 있게 makeSearch를 하나 만들어줍니다.

 

public String makeSearch(int page)
	{
	  
	 UriComponents uriComponents =
	            UriComponentsBuilder.newInstance()
	            .queryParam("page", page)
	            .queryParam("perPageNum", cri.getPerPageNum())
	            .queryParam("searchType", ((SearchCriteria)cri).getSearchType())
	            .queryParam("keyword", encoding(((SearchCriteria)cri).getKeyword()))
	            .build(); 
	    return uriComponents.toUriString();  
	}

	private String encoding(String keyword) {
		if(keyword == null || keyword.trim().length() == 0) { 
			return "";
		}
		 
		try {
			return URLEncoder.encode(keyword, "UTF-8");
		} catch(UnsupportedEncodingException e) { 
			return ""; 
		}
	}

 

 

4. BoardDAO, BoardService 작성


BoardDAO, BoardDAOImpl, BoardService, BoardServiceImpl

 

이제는 DAO와 DAOImpl, Service, ServiceImpl을 수정해줍니다.

 


 

 

 

5. BoardController 작성


BoardController.java

 

BoardController.java에서 list를 수정해 줍니다.

 

	// 게시판 목록 조회
	@RequestMapping(value = "/list", method = RequestMethod.GET)
	public String list(Model model, @ModelAttribute("scri") SearchCriteria scri) throws Exception{
		logger.info("list");
		
		model.addAttribute("list", service.list(scri));
		
		PageMaker pageMaker = new PageMaker();
		pageMaker.setCri(scri);
		pageMaker.setTotalCount(service.listCount(scri));
		
		model.addAttribute("pageMaker", pageMaker);
		
		return "board/list";
		
	}

 

 

 

6.  list 작성


list.jsp

 

이전에 오타가있었는데요.. form에 method를 get으로 수정하여줍니다.

div태그를 추가해주시고 검색에 맞는 셀렉트박스와 옵션을 넣어줍니다.

button태그에 type를 button으로 수정해줍니다.

검색버튼을 눌렀을때 page, perPageNum, searchType, keyword의 값들이 들어가게 스크립트를 추가해줍니다.

 

  <div class="search">
    <select name="searchType">
      <option value="n"<c:out value="${scri.searchType == null ? 'selected' : ''}"/>>-----</option>
      <option value="t"<c:out value="${scri.searchType eq 't' ? 'selected' : ''}"/>>제목</option>
      <option value="c"<c:out value="${scri.searchType eq 'c' ? 'selected' : ''}"/>>내용</option>
      <option value="w"<c:out value="${scri.searchType eq 'w' ? 'selected' : ''}"/>>작성자</option>
      <option value="tc"<c:out value="${scri.searchType eq 'tc' ? 'selected' : ''}"/>>제목+내용</option>
    </select>

    <input type="text" name="keyword" id="keywordInput" value="${scri.keyword}"/>

    <button id="searchBtn" type="button">검색</button>
    <script>
      $(function(){
        $('#searchBtn').click(function() {
          self.location = "list" + '${pageMaker.makeQuery(1)}' + "&searchType=" + $("select option:selected").val() + "&keyword=" + encodeURIComponent($('#keywordInput').val());
        });
      });   
    </script>
  </div>

 

 

 

list.jsp

 

list.jsp에서 만들어놨던 makeSearch로 수정해 줍니다.

 


 

 

 

7. 실행 테스트


 

톰캣을 실행하여 list로 들어간후 검색타입과 검색어를 입력한후 검색을 클릭하여 확인해봅니다.

 

검색기능을 구현하였는데요.

다음 포스팅에는 페이징과 검색타입, 검색어 유지 기능에 대해 포스팅하겠습니다.

이 글을 공유합시다

facebook twitter googleplus kakaostory naver