:: 어떻게 만들지?
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주소가 좀 지저분하지만.. 그래도 성공적으로 구현했다!
이번에는 다른 결과물과 달리 꽤 수월하게 진행된 것 같다!
'ETC > JSP' 카테고리의 다른 글
8- JSP 게시판 (검색기능) (0) | 2021.09.18 |
---|---|
7- JSP 게시판 (아이디 중복확인2) (0) | 2021.09.17 |
6- JSP 게시판 (수정한 오류) (0) | 2021.09.15 |
5- JSP 게시판 (아이디 중복확인 1) (0) | 2021.09.13 |
4- JSP 게시판 (회원가입 기능) (0) | 2021.09.11 |