본문으로 바로가기

[Home/전체공연List]검색 기능

category 프로젝트 2020. 4. 8. 17:59

 

구현 내용

1.검색 조건을 선택하면 그에 따른 입력 form이 나옴.
기간의 경우 사용자가 임의로 입력할 수 없도록 Datepicker 를 사용하여 날짜를 선택할 수 있도록 함.

2.원하는 검색 조건을 입력 후 검색버튼을 클릭하면 검색된 리스트가 전체 공연리스트에 나옴.

 

핵심코드

[HomeServiceImpl.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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    @Override
    public void list(HttpServletRequest request) {
        
        //검색과 관련된 파라미터를 읽어와 본다.
        String keyword=request.getParameter("keyword");
        String condition=request.getParameter("condition");
        String startdate=request.getParameter("startDate");
        String enddate=request.getParameter("endDate");
        String startdateFormat="";
        String enddateFormat="";
        
        if(startdate!=null && startdate!=null){
            String[] startdateArr=startdate.split("-");
            String[] enddateArr=enddate.split("-");
            
            for(int i=0; i<startdateArr.length; i++) {
                startdateFormat+=startdateArr[i];
            }
            
            for(int i=0; i<enddateArr.length; i++) {
                enddateFormat+=enddateArr[i];
            }
            
        }
        
        FullCalendarDto dto=new FullCalendarDto();
        if(keyword!=null || (startdate!=null && startdate!=null)) {
            if (condition.equals("title")) {//제목 검색
                dto.setTitle(keyword);
            }else if (condition.equals("place")) {//장소 검색
                dto.setPlace(keyword);
            }else if (condition.equals("date")) {//기간 검색
                dto.setStartdate(startdateFormat);
                dto.setEnddate(enddateFormat);
            }
            
            String encodedKeyword=null;
            if(keyword!=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);
            request.setAttribute("startdate", startdate);
            request.setAttribute("enddate", enddate);
            request.setAttribute("startdateFormat", startdateFormat);
            request.setAttribute("enddateFormat", enddateFormat);
 
        }//if end
 
        //페이징 처리 코드 생략
        
    }
cs

12행-24행 : 2020-01-01 형태로 전달되는 문자열을 20200101 형태로 변경

26행-44행 : 검색키워드 또는 시작, 종료 날짜가 request에 전달된다면 dto에 담아준다.

[전달되는 경우]

(1)검색어를 입력하고 검색 버튼을 누른 경우

(2)이미 검색을 한 상태에서 하단 페이지 번호를 누른 경우

 

[전달 되지 않는 경우]

(1) navbar 에서 cafe누른경우

 

검색 키워드에 한글이 포함 되어 있는 경우,

링크에 그대로 출력하기 위해 인코딩

 

 

[HomeMapper.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
    <select id="getCount" parameterType="fullCalendarDto" resultType="int">
        SELECT NVL(MAX(ROWNUM), 0)
        FROM tb_api_date
        <choose>
            <when test="startdate != null and enddate != null">
                <![CDATA[
                WHERE startdate>=to_date(${startdate},'yyyymmdd') AND startdate<=to_date(${enddate},'yyyymmdd')) result2
                ]]>
            </when>
            <when test="title != null">
                WHERE title LIKE '%${title}%'
            </when>
            <when test="place != null">
                WHERE place LIKE '%${place}%'
            </when>
        </choose>
    </select>
 
    <select id="getList" parameterType="fullCalendarDto" resultType="fullCalendarDto">
        SELECT *
         FROM (SELECT result1.*, ROWNUM AS rnum
                FROM (SELECT seq, title, TO_CHAR(startdate,'YYYY/MM/DD') AS startdate, TO_CHAR(enddate,'YYYY/MM/DD') AS enddate, place, thumbnail, likecount
                        FROM tb_api_date
                        <choose>
                            <when test="startdate != null and enddate != null">
                                <![CDATA[
                                WHERE startdate>=to_date(${startdate},'yyyymmdd') AND startdate<=to_date(${enddate},'yyyymmdd')
                                ]]>
                            </when>
                            <when test="title != null">
                                WHERE title LIKE '%${title}%'
                            </when>
                            <when test="place != null">
                                WHERE place LIKE '%${place}%'
                            </when>
                        </choose>
                        ORDER BY startdate DESC
 
                        ) result1)
         WHERE rnum BETWEEN #{startRowNum} AND #{endRowNum}
    </select>
cs

1행-17행 : 검색을 어떤 키워드로 했는지에 따라 select되는 data의 개수가 달라진다. 따라서 경우에 따라 동적으로 쿼리문을 구성해 줘야한다.

19행-41행 :  검색을 어떤 키워드로 했는지에 따라 select되는 data가 달라진다. 따라서 동적으로 쿼리문을 구성해 줘야한다.

 

  1. 검색 조건이 기간인 경우
    공연 시작일이 검색조건의 시작일과 종료일 사이에 있는 공연들을 조회한다.
  2. 검색 조건이 제목’, ‘장소인 경우
    검색 키워드가 들어 있는 data를 조회해 list에 보여준다.