게시판 만들기 (검색기능)
Back-End/Spring 2019. 7. 3. 18:16게시판 만들기 (검색기능 구현)
list.jps 중 일부 (검색 폼 추가)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!-- 검색폼 --> <form name="form1" method="post" action="${path}/board/list.do"> //'조회' 버튼을 누르면 컨트롤러의 list.do로 맵핑된다. <select name="search_option"> <option value="name" <c:if test="${map.search_option == 'name'}">selected</c:if> >이름</option> <option value="title" <c:if test="${map.search_option == 'title'}">selected</c:if> >제목</option> <option value="content" <c:if test="${map.search_option == 'content'}">selected</c:if> >내용</option> <option value="all" <c:if test="${map.search_option == 'all'}">selected</c:if> >이름+내용+제목</option> </select> <input name="keyword" value="${map.keyword}"> <input type="submit" value="조회"> </form> | cs |
BoardController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | @RequestMapping("list.do") //세부적인 url pattern public ModelAndView list(//RequestParam 값들을 받아오고, 옵션, 키워드, 페이지의 기본값을 각각 설정해준다. @RequestParam(defaultValue="name") int curPage, @RequestParam(defaultValue="") String search_option, @RequestParam(defaultValue="1") String keyword) //defaultValue를 설정하지 않으면 null point 에러가 발생할수 있기 때문에 기본값을 설정해주어야 한다. throws Exception{ //레코드 갯수 계산 int count = boardService.countArticle(search_option,keyword); //페이지 관련 설정, 시작번호와 끝번호를 구해서 각각 변수에 저장함 Pager pager=new Pager(count, curPage); int start=pager.getPageBegin(); int end=pager.getPageEnd(); //게시물 목록을 출력하기 위해 <BoardDTO>타입에 list변수에 게시물 목록관련 값들을 저장함. //넣어야될 값들이 여러개 있으므로 haspmap.put 메소드를 사용해서 값들을 넣어서 list에 저장 List<BoardDTO> list= boardService.listAll(search_option,keyword,start,end); //게시물 목록 System.out.println("list:"+list); ModelAndView mav=new ModelAndView(); //자료를 보낼 페이지를 지정해야하고, 자료를 지정해야 하기 때문에 //ModelAndView 객체를 생성한다. HashMap<String,Object> map=new HashMap<>(); //여러개의 값들을 저장해야하기 때문에 hashmap() 객체를 생성 map.put("list", list); //map에 자료 저장 map.put("count", count); map.put("pager", pager); //페이지 네비게이션을 위한 변수 map.put("search_option", search_option); map.put("keyword",keyword); mav.setViewName("board/list"); //포워딩할 뷰의 이름 mav.addObject("map", map); //ModelAndView에 map을 저장 return mav; // board/list.jsp로 이동 } | cs |
BoardServiceImpl.java
1 2 3 4 5 6 7 | @Override public List<BoardDTO> listAll( //매개변수는 시작 레코드번호, 끝번호, 옵션과 키워드가 들어간다 String search_option, String keyword,int start, int end) throws Exception { return boardDao.listAll(search_option,keyword,start,end); } | cs |
BoardDAOImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 | //게시물 목록 리턴 @Override public List<BoardDTO> listAll( String search_option, String keyword,int start, int end) throws Exception { Map<String,Object> map=new HashMap<>(); map.put("search_option", search_option); map.put("keyword", "%"+keyword+"%"); map.put("start", start); //맵에 자료 저장 map.put("end", end); // mapper에는 2개 이상의 값을 전달할 수 없음(dto 또는 map 사용) return sqlSession.selectList("board.listAll",map); } | cs |
boardMapper.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | <select id="listAll" resultType="com.example.spring02.model.board.dto.BoardDTO"> <!-- 결과는 boardDTO타입이 된 --> <include refid="paging_header" /> <!-- ref는 다른테이블을 의미한다. --> <!-- 번호, 제목, 작성자, 이름, 날짜, 조회수 , 그리고 댓글의 갯수를 검색 --> <!-- board 테이블과 member 테이블로 부터 검색 --> select bno,title,writer,name,regdate,viewcnt from board b, member m <!-- bno의 내림차순으로 검색 --> <!-- where절은 (조건)은 include 태그를 이용했음 --> <include refid="search" /> //밑에있는 id가 search인 구문을 조건으로 실행한다. order by bno desc <include refid="paging_footer" /> </select> <sql id="paging_header"> <!-- 게시물을 한페이지에 10개씩 볼 수 있게하는 쿼리 윗부분--> select * from ( select rownum as rn, A.* from ( </sql> <sql id="paging_footer"> <!-- 게시물을 한페이지에 10개씩 볼 수 있게하는 쿼리 아랫 부분--> <!-- 새로 매겨진 일련번호 1~10번 글까지 1페이지 --> <!-- 11~20번 글까지 2페이지.. --> ) A ) where rn between #{start} and #{end} </sql> ==================================================================== <sql id="search"> <choose> <when test="search_option == 'all' "> <!-- all일때는 3가지를 다 찾아야 하기때문에 이름, 내용, 제목으로 찾아본다. --> where b.writer=m.userid and (name like '%' ||#{keyword}||'%' or content like '%'||#{keyword}||'%' or title like '%'||#{keyword}||'%' ) </when> <otherwise> <!-- 그렇지 않으면 옵션과 키워드를 이용해서 찾는다.--> <!-- $를 붙이면 따움표가 빠지게 되고, #을 붙이면 따움표가 붙게 된다. --> where b.writer=m.userid and ${search_option} like '%'||#{keyword}||'%' </otherwise> </choose> </sql> | cs |
이 구문을 실행한후에 컨트롤러에서 값들을 받고, search_option과 keyword를 다시 되돌려 준다.
이렇게 하고 실행을 하면 검색을 한 뒤에 검색 조건이 초기화되기 때문에 이것을 방지하기 위해서
list.jsp 페이지를 수정해준다.
list.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!-- 검색폼 --> <form name="form1" method="post" action="${path}/board/list.do"> <select name="search_option"> //검색을 한 뒤에 검색 조건이 초기화되는것을 방지하는 코드 <option value="name" <c:if test="${map.search_option == 'name'}">selected</c:if> >이름</option> <option value="title" <c:if test="${map.search_option == 'title'}">selected</c:if> >제목</option> <option value="content" <c:if test="${map.search_option == 'content'}">selected</c:if> >내용</option> <option value="all" <c:if test="${map.search_option == 'all'}">selected</c:if> >이름+내용+제목</option> </select> <input name="keyword" value="${map.keyword}"> <input type="submit" value="조회"> </form> | cs |
'Back-End > Spring' 카테고리의 다른 글
게시판 만들기 (댓글 쓰기 / 댓글 목록/ 댓글 갯수) (2) | 2019.07.04 |
---|---|
게시판 만들기 (상세화면) (0) | 2019.07.04 |
게시판 만들기 (페이지 나누기) (1) | 2019.07.03 |
게시판 만들기 (게시글 쓰기) (0) | 2019.07.02 |
게시판 만들기 (게시글 목록) (0) | 2019.07.02 |