MVC2 검색 기능 - MVC2 geomsaeg gineung

1. 회원목록에 검색창 만들기

  • 회원목록 아래쪽에 검색창을 만들고,
<form action=/MVC2/MemberSelectController>
	<select name="ch2">
		<option value="custname">이름</option>
		<option value="address">주소</option>
	</select>
	<input type="text" name="ch2">
	<input type="submit" value="검색하기">
</form>
  • action을 통해서 SelectController로 값이 잘 넘어가는지 확인한다.
String ch2 = 
request.getParameter("ch2");
String ch2  = request.getParameter("ch2");

m.setCh2(ch2);
m.setCh2(ch2);

System.out.println(m.getCh2());	
System.out.println(m.getCh2());
  • 검색이 잘되는지 확인하기 전에 정상적으로
    웹에서 값을 잘 받아오는지 확인이 필요하다.
  • 정상적으로 값을 받아왔다면 아래와같이
    콘솔창에 나타난다.
    MVC2 검색 기능 - MVC2 geomsaeg gineung

2. SQL쿼리 Where조건에 받아온 정보 넣기

String ch2 = m.getCh2();
String ch2 = m.getCh2();

if(m.getCh2() == null || m.getCh2() == "") {
      sql = "select * from member_tbl_02";
  }else {
  if(ch2.equals("custname")) {
      sql = "select * from member_tbl_02 where custname like '%"+ch2+"%' ";
  }else {
      sql = "select * from member_tbl_02 where address like '%"+ch2+"%' ";
  }
}

  • 웹에서 받아넣은 String 형의 변수를 sql쿼리에서 변수로 받게되면 자동으로 큰따옴표("")가 입력되는데,
  • 이렇게되면 where 칼럼명이
    where "custname"이 되어버린다.
  • 즉, 오라클에서 이렇게 처리되면 칼럼을 찾을 수 없는 오류가 발생한다.
  • 또한, 오라클 쿼리에서 특정문자를 지정하기 위해서는 like '%김%' 의 형태를 기억하자! 작은따옴표를 빼먹으면 오류가 또 발생한다..

3. 완성페이지 테스트해보기



  • 검색하려는 칼럼명과 검색내용을 잘 받아서
    목록결과창이 정확하게 나오는것을 확인할 수 있다.

공부한것들을 정리하는 블로그 입니다.

getBoardList.jsp

- login_proc.jsp에서 받은 id를 이용해 상단에 이용자의 id를 출력합니다.   ex) **님 환영합니다

- boardDAO.getBoardList()를 실행하여 boardList 에 데이터를 리턴받은 후(Controller), 해당 데이터를 화면에 출력한다(View).

- 페이징은 나중에 추가 할 예정이며 관련 글은 그때 설명드리도록 하겠습니다.

- 글 검색 기능은 post보다는 get 방식이 자주 보입니다.(get은 가져오는 것이고 post는 수행하는 것입니다)

MVC2 검색 기능 - MVC2 geomsaeg gineung
<%@page import="java.io.Console"%>
<%@ page import="java.util.List" %>
<%@ page import="com.springbook.biz.board.impl.BoardDAO" %>
<%@ page import="com.springbook.biz.board.BoardVO" %>
<%@ page import="com.springbook.biz.user.UserVO" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%
request.setCharacterEncoding("UTF-8");

String id = (String)session.getAttribute("id");

//redirect 방식은 request를 유지하지 않기 때문에 다른 페이지로 이동하면 없어진다. 다른 페이지에서 request는 새로운 객체임
//System.out.println("[getBoardList.jsp] aa = " + (String)request.getAttribute("aa")  );

//System.out.println("[getBoardList.jsp] id = " + id  );
//System.out.println("[getBoardList.jsp] searchCondition = " + request.getParameter("searchCondition")  );
//System.out.println("[getBoardList.jsp] searchKeyword = " + request.getParameter("searchKeyword")  );

BoardVO  vo       = new BoardVO();
BoardDAO boardDAO = new BoardDAO();

vo.setSearchCondition( request.getParameter("searchCondition") );
vo.setSearchKeyword( request.getParameter("searchKeyword") );

List<BoardVO> boardList;


boardList = boardDAO.getBoardList(vo);

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>글 목록</title>
</head>
<body>
	<center>
		<h2>글 목록</h2>
		<h3><%=id%>님 환영합니다....<a href="logout_proc.jsp">log out</a></h3>
	
		<!--  검색 시작  -->
		<form action="getBoardList.jsp" method="get">
			<table border="1" cellpadding="0" cellspacing="0" width="700">
				<tr>
					<td align="right">
						<select id="searchCondition" name="searchCondition">
							<option value="TITLE">제목</option>
							<option value="CONTENT">내용</option>
						</select>
						<input id="searchKeyword" name="searchKeyword" type="text">
						<input type="submit" value="검색 ">
					</td>
				</tr>		
			</table>
		</form>
		<!-- 검색 종료  -->
	
		<table border="1" cellpadding="0" cellspacing="0" width="700">
			<tr>
				<th bgcolor="orange" width="100">번호</th>
				<th bgcolor="orange" width="200">제목</th>
				<th bgcolor="orange" width="150">작성자</th>
				<th bgcolor="orange" width="150">등록일</th>
				<th bgcolor="orange" width="100">조회수</th>
			</tr>
			<%
			for(BoardVO board: boardList) { %>
			<tr>
				<td><%= board.getSeq() %></td>
				<td align="left">
					<a href="getBoard.jsp?seq=<%= board.getSeq() %>">
						<%= board.getTitle() %>
					</a>
				</td>
				<td><%= board.getWriter() %></td>
				<td><%= board.getRegDate() %></td>
				<td><%= board.getCnt() %></td>
			</tr>
			<% } %>
		</table>
		<br>
		<a href="insertBoard.jsp">새 글 등록</a>
	</center>
</body>
</html>

BoardDAO.java

- 기존에 진행했던 실습예제에서 getBoardList() 메서드에 수정이 있었습니다. 글 목록 조회 기능이며 또한 글 검색 기능을 겸하게 되었습니다.

- 올바른 객체지향을 위해서는 글 목록 조회(getBoardList)와 글 검색(getBoardListFromSearch : 가제)이 기능적으로(메서드) 분리되어야 마땅합니다. 이 부분도 추후 실습에서 함께 다루도록 하고 우선은 이렇게 진행하도록 하겠습니다.

package com.springbook.biz.board.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.common.JDBCUtil;

import hello.printSimpleName;

@Repository("boardDAO")
public class BoardDAO {

	private Connection       		conn = null;
	private PreparedStatement		stmt = null;
	private ResultSet				rs   = null;

	private final String BOARD_INSERT = "insert into board(seq, title, writer, content, regdate) values((select nvl(max(seq),0)+1 from board),?,?,?,sysdate)";
	private final String BOARD_UPDATE = "update board set title=?, content=? where seq=?";
	private final String BOARD_DELETE = "delete board where seq=?";
	private final String BOARD_GET    = "select * from board where seq=?";
	// private final String BOARD_LIST   = "select * from board order by seq desc";
	private final String BOARD_LIST = "select * from board order by seq desc";
	private final String BOARD_LIST_T = "select * from board where title like '%'||?||'%' order by seq desc";
	private final String BOARD_LIST_C = "select * from board where content like '%'||?||'%' order by seq desc";

	printSimpleName p = new printSimpleName();
	
	public void insertBoard(BoardVO vo) {
		System.out.println("===> JDBC로 insertBoard() 기능 처리");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_INSERT);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getWriter());
			stmt.setString(3, vo.getContent());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	public void updateBoard(BoardVO vo) {
		System.out.println("===> JDBC로 updateBoard() 기능 처리");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_UPDATE);
			stmt.setString(1, vo.getTitle());
			stmt.setString(2, vo.getContent());
			stmt.setInt(3, vo.getSeq());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	public void deleteBoard(BoardVO vo) {
		System.out.println("===> JDBC로 deleteBoard() 기능 처리");
		try {
			conn = JDBCUtil.getConnection();
			stmt = conn.prepareStatement(BOARD_DELETE);
			stmt.setInt(1, vo.getSeq());
			stmt.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
	}

	public BoardVO getBoard(BoardVO vo) {
		System.out.println("===> JDBC로 getBoard() 기능 처리");
		BoardVO board = null;
		try {
			conn = JDBCUtil.getConnection();

			stmt = conn.prepareStatement(BOARD_GET);
			stmt.setInt(1, vo.getSeq());
			rs = stmt.executeQuery();
			if(rs.next()) {
				board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
		return board;
	}

//	public List<BoardVO> getBoardList(BoardVO vo) {
//		System.out.println("===> JDBC로 getBoardList() 기능 처리");
//		List<BoardVO> boardList = new ArrayList<BoardVO>();
//		try {
//			conn = JDBCUtil.getConnection();
//			stmt = conn.prepareStatement(BOARD_LIST);
//			rs = stmt.executeQuery();
//			while(rs.next()) {
//				BoardVO board = new BoardVO();
//				board.setSeq(rs.getInt("SEQ"));
//				board.setTitle(rs.getString("TITLE"));
//				board.setWriter(rs.getString("WRITER"));
//				board.setContent(rs.getString("CONTENT"));
//				board.setRegDate(rs.getDate("REGDATE"));
//				board.setCnt(rs.getInt("CNT"));
//				boardList.add(board);
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		} finally {
//			JDBCUtil.close(stmt, conn);
//		}
//		return boardList;
//	}
	
//	public List<BoardVO> getBoardListFromSearch(BoardVO vo) {
	public List<BoardVO> getBoardList(BoardVO vo) {
		System.out.println("===> JDBC로 getBoardList() 기능 처리");
		List<BoardVO> boardList = new ArrayList<BoardVO>();
		String flagBoardListFromSearch = "N";
		try {
			conn = JDBCUtil.getConnection();
			
			if (vo.getSearchCondition() != null && vo.getSearchKeyword() != null) {
				flagBoardListFromSearch = "Y";
			}
			
			if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("TITLE")) {
				stmt = conn.prepareStatement(BOARD_LIST_T);
				stmt.setString(1, vo.getSearchKeyword());
			} else if("Y".equals(flagBoardListFromSearch) && vo.getSearchCondition().equals("CONTENT") ) {
				stmt = conn.prepareStatement(BOARD_LIST_C);
				stmt.setString(1, vo.getSearchKeyword());
			} else {
				stmt = conn.prepareStatement(BOARD_LIST);
			}
			
			rs = stmt.executeQuery();
			while(rs.next()) {
				BoardVO board = new BoardVO();
				board.setSeq(rs.getInt("SEQ"));
				board.setTitle(rs.getString("TITLE"));
				board.setWriter(rs.getString("WRITER"));
				board.setContent(rs.getString("CONTENT"));
				board.setRegDate(rs.getDate("REGDATE"));
				board.setCnt(rs.getInt("CNT"));
				boardList.add(board);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.close(stmt, conn);
		}
		return boardList;
	}
	
}

'(2019) 사이드 프로젝트 > BoardWeb(게시판-MVC1,MVC2,스프링MVC)' 카테고리의 다른 글

7-6. 페이징처리(paging, pagination) : BoardDAO.java, BoardList2.jsp, PagingVO.java  (0)2019.07.04
7-5. 실습 중간점검 , 프로젝트 별첨  (0)2019.06.28
7-4. 글 조회수 카운트, session을 이용한 조회수 중복 방지 처리(jsp) : BoardDAO.java, getBoard.jsp  (0)2019.06.28
7-3. 글 상세 조회 : getBoard.jsp  (0)2019.06.24
7-1. 로그인, 로그아웃, 로그인 검증 및 실패 후처리 : login.jsp, login_proc.jsp, logout_proc.jsp  (3)2019.06.24
7. MVC Model1 아키텍처로 게시판 개발 : web.xml, representation-layer.xml, index.jsp  (0)2019.06.20
6. 트랜잭션 처리 : 스프링 AOP Advisor 사용  (0)2019.06.19
5-1. DAO클래스 구현 : JdbcDaoSupprot 클래스를 상속하는 방법, JdbcTemplate 클래스를 <bean> 등록하고, 의존성 주입으로 처리하는 방법  (0)2019.06.19