본문 바로가기

카테고리 없음

[Spring]게시판 검색기능구현

게시판 검색기능 구현


list.jsp

list.jsp에서는 두가지 파라미터가 넘어가는데

  1.condition이라는 파라미터명이

    get방식으로

    condition과 일치하는 tiltlename , title, writer 셋중 선택된 값으로 넘어간다.

 

   2.keyword라는 파라미터명으로 검색어가 넘어간다.

	<form action="list.do" method="get"> <%-- <c:if test="${condition eq 'titlename' }">selected</c:if>	 --%>
		<label for="condition">검색조건</label>
		<select name="condition" id="condition">
			<option value="titlename" <c:if test="${condition eq 'titlename' }">selected</c:if>>제목+파일명</option>
			<option value="title" <c:if test="${condition eq 'title' }">selected</c:if>>제목</option>
			<option value="writer" <c:if test="${condition eq 'writer' }">selected</c:if>>작성자</option>
		</select>
		<input type="text" name="keyword" id="keyword"
			placeholder="검색어 ..." value="${keyword }"/>
		<button type="submit">검색</button>
	</form><!-- condition이라는 파라미터 명으로 넘어간다. -->
</div><!-- container -->​

 

 

 

'???키워드로 검색된 ?개의 파일이 있습니다.'라는 문구가 list에 뜨도록 코드를 수정한다.

	<c:choose>
		<c:when test="${not empty keyword }">
			<p>
				<strong>${keyword} </strong>키워드로 검색된
				<strong>${totalRow }</strong>개의 파일이 있습니다.
			</p>
		</c:when>
		<c:otherwise>
			<p><strong>${totalRow }</strong>개의 파일이 있습니다.</p>
		</c:otherwise>
	</c:choose>

 

페이징이동에 쓰이는 링크에  condition과 keyword파라미터값을 넘겨주어

페이징이동시에도 파라미터를 읽을 수 있게 해준다.

<li>
	<a href="list.do?pageNum=${startPageNum-1 }&condition=${condition}&keyword=${encodedKeyword}">&laquo;</a>
</li>

FileMapper-1 getList( 리스트 얻어오기)

게시판 검색을 이용한 경우에는 검색한 리스트만,

게시판 검색을 하지 않은경우에는 전체 리스트가  dto에 담기는 Mapper를 작성한다.

	<select id="getList" parameterType="fileDto" resultType="fileDto">
		SELECT *
		FROM
			(SELECT result1.*, ROWNUM AS rnum
			FROM
				(SELECT num,writer,title,orgFileName,fileSize,downCount,regdate
				FROM board_file		
				<choose>
					<when test="title != null and orgFileName != null">
						WHERE title LIKE '%'||#{title}||'%' 
						OR orgFileName LIKE'%${orgFileName}'
					</when>							<!-- #은 set하는거고	 -->
					<when test="title != null">
						WHERE title LIKE '%${title}%'  <!-- $는 미리만들ㄹ어놓고 실행한다 이엘아님..마이바티스문임!-->
					</when>
					<when test="writer !=null">
						WHERE writer LIKE '%${writer}%'
					</when>
				</choose>
				ORDER BY num DESC) result1)
		WHERE rnum BETWEEN #{startRowNum} AND #{endRowNum}
	</select>

 

FileMapper-2 getCount(리스트되는 파일의 수 얻어오기)

getCount에서는 

페이징에 사용되는 list에 출력되는 파일의 수를 얻어온다. 

 

 

 

참고1-sql문의 결합연산자 ||   :+용도로 사용된다.

참고2- sql문의 like연산자      : 원하는 문자를 포함시켜 select할 때 사용된다.

참고 - mybatis에서의 #{}과 ${}

dto의 title을 전달 받고자 할 때 title의 value가 "안녕"이라고 해보자.

#{title} : 전달받은 dto에서 title을 get해서 pstmt.set 해주는 과정을 자동으로 수행한다.

${title} : 전달받은 dto의 value인 "안녕"을 직접 가져온다. 

 

	<select id="getCount" resultType="int" parameterType="fileDto">
		SELECT NVL(MAX(ROWNUM),0)
		FROM board_file
		<choose>
			<when test="title != null and orgFileName != null">
				WHERE title LIKE '%'||#{title}||'%' 
				OR orgFileName LIKE'%${orgFileName}'
			</when>							<!-- #은 set하는거고	 -->
			<when test="title != null">
				WHERE title LIKE '%${title}%'  <!-- $는 미리만들어놓고 실행한다 이엘아님..마이바티스문임!-->
			</when>
			<when test="writer !=null">
				WHERE writer LIKE '%${writer}%'
			</when>
		</choose>
	</select>

 

위에서 만들어진 getCount는 서비스에서 만들어진 dto를 전달받게 된다.

전달받게 되는 과정은 다음과 같다. 

 

service에서 DTO객체를 생성해서 list.jsp로부터 get방식으로 입력받은 파라미터 keyword와 condition을 읽어온다.

condition에는 세가지경우가 있는데  titlename, title,writer인 경우이다.

condition이 titlename이면 클라이언트에서 제목+파일명을 선택했으므로

title과 OrgFileName을 입력받은 값인 keyword로 set한다.

나머지 두 경우도 같은방식으로 keyword를 set한다.

 

serviceImlp
serviceImpl

 

 

dao


 

FileServiceImpl -1  list 출력기능

파일 목록을 불러오는 리스트에서  DTO를 생성한다.

만약 입력받은 keyword와 condition 값이 있다면 DTO에 넣어준다. (없다면 아무것도 넣지 않는다)

	@Override
	public void list(HttpServletRequest request) {
		/*
		 * request 에 검색 keyword가 전달될 수도 있고 안될수도 있다.
		 * -전달 안되는 경우 : navbar에서 파일목록보기를 누른경우
		 * -전달 되는 경우 : 하단에 검색어를 입력하고 검색버튼을 누른 경우
		 * -전달되는 경우2: 이미 검색을 한 상태에서 하단 페이지 번호를 누른경우
		 */
		//검색과 관련된 파라미터를 읽어와 본다.
		String keyword=request.getParameter("keyword");
		String condition=request.getParameter("condition");
		
		//검색 키워드가 존재한다면 키워드를 담을 FileDto 객체 생성 
		FileDto dto=new FileDto();
		if(keyword != null) {//검색 키워드가 전달된 경우
			if(condition.equals("titlename")) {//제목+파일명 검색
				dto.setTitle(keyword);
				dto.setOrgFileName(keyword);
			}else if(condition.equals("title")) {//제목 검색
				dto.setTitle(keyword);
			}else if(condition.equals("writer")) {//작성자 검색
				dto.setWriter(keyword);
			}
			/*
			 *  검색 키워드에는 한글이 포함될 가능성이 있기 때문에
			 *  링크에 그대로 출력가능하도록 하기 위해 미리 인코딩을 해서
			 *  request 에 담아준다.
			 */
			String encodedKeyword=null;
			try {
				encodedKeyword=URLEncoder.encode(keyword, "utf-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			//키워드와 검색조건을 request 에 담는다. 
			request.setAttribute("keyword", keyword);
			request.setAttribute("encodedKeyword", encodedKeyword);
			request.setAttribute("condition", condition);
		}			

            //페이징 처리 및 리스트 불러오는 과정 생략
	}

 

		
		 DB 에서 파일 목록을 얻어온다.
		List<FileDto> list=dao.getList(dto);

위에서 생성한 dto를 인자로 받는 전체리스트를 불러오는 getList메소드를 호출한다. 

 

 

FileServiceImpl -2  페이징처리기능

위의  Mapper-2에서만든 getCount를 전체 row의 갯수를 읽어오는데 사용한다.

		//한 페이지에 나타낼 row 의 갯수
		final int PAGE_ROW_COUNT=5;
		//하단 디스플레이 페이지 갯수
		final int PAGE_DISPLAY_COUNT=5;
		
		//보여줄 페이지의 번호
		int pageNum=1;
		//보여줄 페이지의 번호가 파라미터로 전달되는지 읽어와 본다.	
		String strPageNum=request.getParameter("pageNum");
		if(strPageNum != null){//페이지 번호가 파라미터로 넘어온다면
			//페이지 번호를 설정한다.
			pageNum=Integer.parseInt(strPageNum);
		}
		//보여줄 페이지 데이터의 시작 ResultSet row 번호
		int startRowNum=1+(pageNum-1)*PAGE_ROW_COUNT;
		//보여줄 페이지 데이터의 끝 ResultSet row 번호
		int endRowNum=pageNum*PAGE_ROW_COUNT;
		
		//전체 row 의 갯수를 읽어온다.
		int totalRow=dao.getCount(dto);
		//전체 페이지의 갯수 구하기
		int totalPageCount=
				(int)Math.ceil(totalRow/(double)PAGE_ROW_COUNT);
		//시작 페이지 번호
		int startPageNum=
			1+((pageNum-1)/PAGE_DISPLAY_COUNT)*PAGE_DISPLAY_COUNT;
		//끝 페이지 번호
		int endPageNum=startPageNum+PAGE_DISPLAY_COUNT-1;
		//끝 페이지 번호가 잘못된 값이라면 
		if(totalPageCount < endPageNum){
			endPageNum=totalPageCount; //보정해준다. 
		}		
		// FileDto 객체에 위에서 계산된 startRowNum 과 endRowNum 을 담는다.
		dto.setStartRowNum(startRowNum);
		dto.setEndRowNum(endRowNum);

정리

 

list.jsp에서 검색창을 만들어 검색값을 parameter값을 전달해준다.

 

serivceImpl에서는 전달받은 parameter값을 이용해서  dto를 생성한다.

                dto는 dao(mapper)의 인자로 사용한다.

 

mapper getList(파일 전체 불러오기), getCount(페이징 로직에 사용하는 파일 전체의 갯수)에서쓰인다.

검색받은 값이 없을때: getList-파일 전체 리턴

                              getCount-페이징 로직에 사용하는 파일 전체의 갯수리턴 

검색받은 값이 있을때: getList-검색어에 해당되는 파일전체리턴,

                             getCount-검색어에 해당되는 파일 전체의 갯수리턴) 을 수행