본문 바로가기

ETC/JSP

9- 게시판 (검색기능2)

:: 어떻게 만들지?

 

1. 페이지당 보여줄 글 수 기능과 검색기능을 같은 form에 넣어서 사용하는 방법

  >각자 기능을 따로 사용하는 경우도 많을 수 있으니 따로구현하자

 

2. 검색기능과 페이지 기능을 따로 구현하려면 다음 문제점을 해결해야한다

  >검색을 하고 페이지 수를 정하면 전체 리스트에서 페이지당 글 수를 정한다

  >페이지당 글 수를 정하고 검색을하면 정한 글 수에 따른 검색한 글을

    아니면 디폴트 값인 10개의 검색한 글을 보여준다 

  >아래의 전체 페이지 수

 

 

 


 

 

:: 검색기능과 페이지당 보여줄 글 갯수를 같이 사용하기 위해 해야할 것 3가지

 

 

1. 페이지당 글 수를 검색기능에서도 사용 가능하게 쿼리 변경

   boardDAO 의 getBoardList 에서 바로 쓸 수 있는 코드를 생각해봤다.

   between으로 페이지당 보여줄 글의 갯수를 뽑아내면 어떤 기준으로 뽑아내야할까?

 

select *from (select board.*,row_number()over() as wNum from board 
where board.subject like '%답%' order by board.writeDate asc,board.writeTime asc)wn 
where wn.wNum between 1 and 3

  between의 범위에는 처음 boardList에서 사용한 startRowNum, endRowNum 가 들어간다.

  날짜와 시간 순으로 따로 빼서 순서를 지정 후 그 순서에 맞게 EndUser가 지정한 검색내용과 글 수를 넣는다.

 

 

 

 

2-1. 검색을 하면 이전에 지정한 페이지 수 따라 출력

  검색 form에 앞서 지정한 페이지 수( ${pagePerRow} ) 를 url에 넣어서 전송한다. 

<tr> <!--게시판 검색기능 작성자/제목/내용-->
    <td><label for="searchBoard">검색</label></td>
        <td colspan="3">
            <form action="boardList.bbs?page=1&pagePerRow=${pagePerRow}" name="reqSearchBoard" method="post">
            <select name="item">
                <option value="1">제목</option>
                <option value="2">내용</option>
                <option value="3">작성자</option>
            </select>
            <input type="text" name="searchBoard" id="searchBoard" value="${searchStr}">
                <input type="submit" value="검색"/>
        </form>
    </td>

 

 

2-2. 페이지당 글 수를 지정하면 검색한 내용 list에서 지정

  페이지당 글 수 form에 검색한 option과 검색내용을 url에 같이 넣어서 전송한다

    <td colspan="3">
        <!-- calibration : Key,Value 값을 '처리에 의미 있는 있는 범위 내로' 데이터 처리 -->
        <!-- validation  : Key,Value 값 검증(처리할 수 있는 데이터 타입인가? 데이터 포맷인가?) -->
        <form action="boardList.bbs?page=1&item=${itemInt}&searchBoard=${searchStr}" name="reqPagePerRow" method="post">
            <label for="pagePerRow">페이지당 보여줄 글의 갯수 :</label>
            <input type="text" name="pagePerRow" id="pagePerRow" value="${pagePerRow}">
            <button onclick="checkPagePerRow()">확인</button>
        </form>

        <%--                <input type="submit" value="확인"/>--%>
    </td>
</tr>

이렇게 지정하면 무조건 옵션값(item)과 검색값(search)을 받으니 검색기능을 구현할 때 사용한 boardList의 if문이

필요없어진다. (search==null일때 실행하는 sql문과 아닐때 실행하는 sql문)

> 라고 상각했지만 로그인 후 boardList는 다 null값이라서 if문 써야한다~

 

 

 

 

3. 검색을 했을때 아래에 표시되는 전체 페이지 수 

  이제 마지막으로 전체 페이지 수를 검색한 lsit에 맞게 출력 및 동작하게 해야한다.

  우선 전체 글 수를 보여주는 boardDAO getBoardTotalRowCount 에서 검색값이 존재할 때

  검색 값의 List에 따라 전체 페이지 수를 출력해야한다.  아래는 수정한 getBoardTotalRowCount 코드 

    public int getBoardTotalRowCount(String search) throws ClassNotFoundException, SQLException {
        // db에 접속해서
        Connection conn = DBConnection.getConnection();
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        //0920 검색한 list에도 순번을 주기 위해서
        String searchIn = "%"+search+"%";
        
        // board테이블 전체 row 갯수
        if(search==null) {
            pstmt = conn.prepareStatement("select count(*) as count from Board");
        }
        else {
            //0920 검색한 list에도 순번을 주기 위해서
            pstmt = conn.prepareStatement("select count(*) as count from board where subject like ? ");
            pstmt.setString(1, searchIn);
        }
        rs = pstmt.executeQuery();

        if(rs.next()){
            return rs.getInt("count");
        }

        throw new SQLException("Board테이블의 전체 갯수를 가지고 올 수 없습니다.");
    }

이렇게 수정하니 검색한 list에 따른 전체 페이지 수를 보여줬다. (전체 페이지 수 나누기 보여줄 페이지 수)

 

다음으로 이동할 페이지를 누르면 검색한 List의 해당 페이지로 이동하게 boardList.jsp 코드를 수정

    <tr>
        <td colspan="7">
            <c:forEach var="i" begin="1" end="${totalPageCount}">
            <a href="boardList.bbs?page=${i}&pagePerRow=${pagePerRow}&item=${itemInt}&searchBoard=${searchStr}">[<c:out value="${i}"/>]<a/>
                <c:set value="${i}" var="pageNum"/>
                </c:forEach>
        </td>
    </tr>

검색한 정보와 옵션을 url에 넣어줘야지 검색한list의 해당 페이지로 이동한다

 

 

+0921 수정+

하단의 페이지 수가 뜨는 부분을 제목으로 검색할 때만 구현되게 코드를 써놨다.

따라서 내용, 작성자 옵션으로 검색할 때는 올바른 페이지가 나오지 않는 문제점이 생겼다

if문으로 각 옵션에 맞는 쿼리를 실행하도록 수정했다

 

 


 

 

:: 결과물

제목 옵션에 "답" 키워드를 검색하고, 보여줄 글 수를 7개로 지정했다.

하단에서 총 보여주는 페이지는 3페이지. 그중 두번 째 페이지에 들어간 화면이다!

 

url주소가 좀 지저분하지만.. 그래도 성공적으로 구현했다!

이번에는 다른 결과물과 달리 꽤 수월하게 진행된 것 같다!