검색과 리스팅을 한 번에!
검색은 목록을 보여주는 기능에 검색 기능을 추가한 것뿐이다.
즉 리스트를 보여주는 메소드에 검색을 가능케 하는 코드를 추가하게 된다면 두 가지를 만족시킬 수 있다.
(열심히 검색에 관련된 메소드를 제작하고 있었는데, 강사님께서 하나로 묶어가지고 만들 수 있다고 해서..)
Controller
해당 부분에서 가장 신경 써야 하는 것은
request.setAttribute("bList", bList)인데 우리는 하나의 list.jsp에 두 가지 기능
리스트와 검색 리스트를 구현하게 해야 하므로 리스트 부분과 search 부분의 변수명들이 동일할 수 있도록
지정해주어야 한다.
else if("search".equals(action)) {
String word = request.getParameter("word");
BoardDao bDao = new BoardDao();
List<BoardVo> bList = bDao.boardList(word);
request.setAttribute("bList", bList); // 리스팅 되는 부분과 이름을 동일하게 해야함.
// jsp 파일에서 사용되는 키워드와 동일해야하기 때문
WebUtil.forward(request, response, "/WEB-INF/views/board/list.jsp");
}else {
//데이터 가져오기
BoardDao bDao = new BoardDao();
List<BoardVo> bookList = bDao.boardList();
// request에 데이터 추가
request.setAttribute("bList", bookList);
WebUtil.forward(request, response, "/WEB-INF/views/board/list.jsp");
}
DAO
메소드를 boardList()와 boardList(String word) 두 가지를 만들어줬는데
이는 검색할 키워드가 있을 때, 그냥 목록을 불러올 때 두 가지를 해결하기 위해 나눠주었다.
검색을 실행시키는 문법은 like로 like 뒤의 ?에 어떤 키워드가 들어가느냐에 따라
목록이 달라지게 된다.
boardList()를 사용하게 되면 아무것도 입력하지 않은 것이 되므로 전체 목록이 나타나며
이를 이용하면 처음 게시판을 클릭했을 때 모든 목록이 보이게 구현할 수 있다.
그 후 검색 버튼을 이용할 때
키워드를 입력하지 않고 클릭해도 똑같이 모든 목록이 구현되며
키워드를 입력하면 해당 키워드가 들어가 있는 모든 목록이 구현된다.
public List<BoardVo> boardList(){
return boardList("");
}
public List<BoardVo> boardList(String word) {
List<BoardVo> boardList = new ArrayList<BoardVo>();
getConnection();
try {
// 3. SQL문 준비 / 바인딩 / 실행
String query = "";
query += " select b.no no ";
query += " ,b.title title ";
query += " ,b.content content";
query += " ,u.name name ";
query += " ,b.hit hit ";
query += " ,to_char(b.reg_date, 'yyyy-mm-dd hh24:mi:ss') dat ";
query += " ,b.user_no user_no ";
query += " from board b, users u ";
query += " where b.user_no = u.no ";
query += " and title like ? ";
query += " order by no desc ";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, '%' + word + '%' );
rs = pstmt.executeQuery();
// 4.결과처리
while (rs.next()) {
int no = rs.getInt("no");
String title = rs.getString("title");
String content = rs.getString("content");
int hit= rs.getInt("hit");
String date = rs.getString("dat");
int userNo = rs.getInt("user_no");
String name = rs.getString("name");
BoardVo bVo = new BoardVo(no, title, content, hit, date);
bVo.setName(name);
bVo.setUserNo(userNo);
boardList.add(bVo);
}
} catch (SQLException e) {
System.out.println("error:" + e);
}
close();
return boardList;
}
JSP
검색
검색 폼 안에 히든으로 search 파라미터와
word 파라미터를 넘겨주면서 컨트롤러에서 검색이 진행될 수 있도록 구현하였다.
리스트
Controller 부분에서 request.setAttribute("bList", bList); 이 부분을 강조했었는데
<c:forEach items="${bList}"> 이 부분에서 사용되기 때문이다.
검색이나 리스트 중 하나의 이름이 달라진다면 검색 또는 리스트 중 하나의 명령어만 듣게 될 것이다.
<form action="/site/board?" method="get">
<div class="form-group text-right">
<input type="hidden" name = "action" value ="search">
<input type="text" name="word" value="">
<button type="submit" id=btn_search>검색</button>
</div>
</form>
<table >
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>글쓴이</th>
<th>조회수</th>
<th>작성일</th>
<th>관리</th>
</tr>
</thead>
<tbody>
<c:forEach items="${bList }" var="bList" varStatus="status">
<tr>
<td>${bList.no }</td>
<td class="text-left"><a href="/site/board?action=read&no=${bList.no }">${bList.title }</a></td>
<td>${bList.name }</td>
<td>${bList.hit }</td>
<td>${bList.regDate }</td>
<c:if test = "${sessionScope.authUser.no == bList.userNo }">
<td><a href="/site/board?action=delete&no=${bList.no }">[삭제]</a></td>
</c:if>
</tr>
</c:forEach>
</tbody>
'Server > Java' 카테고리의 다른 글
[Java] JRE 버전 변경 (0) | 2022.06.14 |
---|---|
[Jsp&Servlet] 본인 게시물 조회수 증가 방지 Controller & Dao (0) | 2022.06.09 |
[Jsp&Servlet] EL 같은 이름의 내장 객체에 대한 우선 순위 (0) | 2022.06.09 |
[Jsp&Servlet] JSTL <c:foreach> , ${sessionScope}태그; 게시물 목록 불러오기 (0) | 2022.06.08 |
[Jsp&Servlet] Jsp/Servlet 게시물 등록 시 줄바꿈 (0) | 2022.06.08 |