마지막으로 검색 방법에 대해 다루도록 하겠다
사실 여지껏 한 페이지 만들기에는 회원 테이블, 정보조회도 들어가있지만
게시글 조회와 거의 99% 똑같다
걍 빼도록 한다.
먼저 게시글 검색의 형태이다
코드는 이런 형태가 된다.
<form action="board-search" method="get">
<select name="searchCategory">
<option value="1">작성자</option>
<option value="2">글제목</option>
<option value="3">글제목 + 내용</option>
</select>
<input type="text" name="searchKeyword"
placeholder="키워드" required />
<input type="submit" value="검색" />
</form>
보통 검색페이지는 작성자, 글 제목, 글제목과 내용으로 분류된다
때문에 이러한 방식으로 구성하였고 board-search 서블릿의 doGet이 받아서
처리할 수 있게끔 form을 구성해준다
private BoardService boardService;
public BoardSearchServlet() {
super();
boardService = BoardServiceImple.getInstance();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int category = Integer.parseInt(request.getParameter("searchCategory"));
String keyword = request.getParameter("searchKeyword");
List<Board> list = boardService.select(category, keyword);
request.setAttribute("boardList", list);
RequestDispatcher dispatcher =
request.getRequestDispatcher("/WEB-INF/board/board-main.jsp");
dispatcher.forward(request, response);
}
select가 처리해주도록한다
(select_by_bno로 할걸 후회된다. 가독성이 많이 떨어져서 한참찾게되므로
혹시나 이 코드를 보시는 분들이 있으시다면 select_by_id로 만들도록 하자 ㅠ)
select도 마찬가지도 서비스 - Dao를 호출한다
@Override
public List<Board> read(int category, String keyword) {
ArrayList<Board> list = new ArrayList<>();
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = ds.getConnection();
if (category == 1) {
pstmt = conn.prepareStatement(SQL_SELECT_BY_USERID);
pstmt.setString(1, "%" + keyword + "%");
} else if (category == 2) {
pstmt = conn.prepareStatement(SQL_SELECT_BY_TITLE);
pstmt.setString(1, "%" + keyword + "%");
} else if (category == 3) {
pstmt = conn.prepareStatement(SQL_SELECT_BY_TITLE_OR_CONTENT);
pstmt.setString(1, "%" + keyword + "%");
pstmt.setString(2, "%" + keyword + "%");
}
rs = pstmt.executeQuery();
while (rs.next()) {
int bno = rs.getInt(1);
String title = rs.getString(2);
String content = rs.getString(3);
String userid = rs.getString(4);
Date regdate = rs.getTimestamp(5);
Board b = new Board(bno, title, content, userid, regdate);
list.add(b);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
} // end read(int, String)
Dao에 기록된 코드는 위와 같다
작성자, 내용 등 스피너를 처리하기 위해
카테고리 형태로 매개변수를 받았으며
키워드는 String으로 받는다
"select * from test_board where userid like ? "
+ " order by bno desc";
"select * from test_board where title like ? "
+ " order by bno desc";
"select * from test_board "
+ " where title like ? or content like ? "
+ " order by bno desc";
sql문은 이와 같다
여기서 중요한 점은 sql문을 때려박을 때
"%" + keyword + "%"
형태로 넣어줘야 한다
sql문에 %를 기로갛기가 매우 귀찮으니 이렇게 하자
(사실 방법이 없는 건 아니다. sql문을 다음과 같은 형태로 하게되면
"select * from test_board where title like '%' || ? || '%'"
가능은 한데 귀찮다. 걍 + %이 코드량도 적어지니 이와 같이 하도록 하자)
이렇게 sql 조회로 걸린 모든 board 형태의 오브젝트를
return 하도록하자
이 리턴값은 서비스를 지나 컨트롤 서브릿에 도착하게 된다
위의 doGet에서 보았듯이
setAttribute로 boardList를 붙여서
board-main으로 보내게 된다면
미리 입력해두었던 형태 테이블이 이 아이디를 잡아내고
표시하게 될것이다.
결과는 다음과 같다
ㄹ로 검색한 장면
검색 결과
이렇게 기본 뼈대는 끝났다
프레임워크를 사용하면 훠어얼씬 더 편하게 제작이 가능하겠지만
일단 모든 코드의 논리와 구조를 알기위해 작성해보았다.
여기까지 만들어놓고
앞으로는 회원 추가나 로그인 기능 등을 구현할 것 같다
'프로그래밍 > Web' 카테고리의 다른 글
JSP에서 쿠키와 세션 (0) | 2017.11.11 |
---|---|
MVC Model2 패턴 / 간이 게시판 제작 기록 (3/4) (0) | 2017.11.11 |
MVC Model2 패턴 / 간이 게시판 제작 기록 (2/4) (0) | 2017.11.11 |