게시판 만들기 (검색기능)

Back-End/Spring 2019. 7. 3. 18:16
728x90
반응형

게시판 만들기 (검색기능 구현)


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




728x90
반응형
: