🔖 DB연결 복습
- Connection, Statement, ResultSet 객체 선언
- DBManager에 정의해둔 getConnection() 메소드로 DB와 연결할 수 있는 Connection 객체 얻기(인자도 담겨 있음)
- Connection 객체로 Statement 객체 얻기
- Statement 객체의 executeQuery() 메소드로 sql문 실행하고 결과를 ResultSet 객체에 담기
- ResultSet 객체에서 ResultSet.next()를 사용해 한 행씩 꺼내 VO객체에 set()으로 값 담기
- VO객체의 리스트로 만든 list 변수의 맨 끝에 VO객체 넣기
- 5-6을 반복문으로 돌리기
- DBManager.close()로 Connection, Statement, ResultSet을 닫아준다.
package com.sw.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.sw.dto.BoardVO;
import util.DBManager;
public class BoardDAO {
//싱글톤 패턴으로 만들기
private BoardDAO() {
}
private static BoardDAO instance = new BoardDAO();
public static BoardDAO getInstance() {
return instance;
}
//게시판 테이블의 전체 데이터를 VO객체의 리스트로 받아오는 메소드. (한 행이 하나의 VO객체)
public List<BoardVO> selectAllBoards(){
String sql = "select * from board order by num desc";
List<BoardVO> list = new ArrayList<BoardVO>();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = DBManager.getConnection();
stmt = conn.createStatement();
//조회 쿼리 실행
rs = stmt.executeQuery(sql);
while(rs.next()) {
//한 행마다 VO객체를 하나씩 생성하고 set메소드로 해당 행의 컬럼값을 담음
BoardVO bVo = new BoardVO();
bVo.setNum(rs.getInt("num"));
bVo.setName(rs.getString("name"));
bVo.setEmail(rs.getString("email"));
bVo.setPass(rs.getString("pass"));
bVo.setTitle(rs.getString("title"));
bVo.setContent(rs.getString("content"));
bVo.setReadcount(rs.getInt("readcount"));
bVo.setWritedate(rs.getTimestamp("writedate"));
list.add(bVo); //리스트의 마지막에 해당 VO객체를 추가함
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
DBManager.close(conn, stmt, rs);
}
return list;
}
}
게시글 리스트를 위한 JSP 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/shopping.css">
</head>
<body>
<div id="wrap" align="center">
<h1>게시글 리스트</h1>
<table class="list">
<tr>
<td colspan="5" style="border: white; text-align: right;">
<a href="BoardServlet?command=board_write_form">게시글 등록</a>
</td>
</tr>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회</th>
</tr>
<c:forEach var="board" items="${boardList}">
<tr class="record">
<td>${board.num}</td>
<td><a href="BoardServlet?command=board_view&num=${board.num}">${board.title}</a></td>
<td>${board.name}</td>
<td><fmt:formatDate value="${board.writedate}" /></td>
<td>${board.readcount}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
다음 코드를 추가한다.
import com.sw.controller.action.*;
if(command.equals("board_list")){
action = new BoardListAction();
}
ActionFactory.java
package com.sw.controller;
import com.sw.controller.action.*;
public class ActionFactory {
//싱글톤 패턴으로 정의
private static ActionFactory instance = new ActionFactory();
private ActionFactory() {
super();
}
public static ActionFactory getInstance() {
return instance;
}
public Action getAction(String command) {
Action action = null;
System.out.println("ActionFactory :" + command);
if(command.equals("board_list")){
action = new BoardListAction();
}
return action;
}
}
BoardServlet?command=board_list
요청을 받으면 게시글 리스트 화면을 표시한다.
다음 주소를 입력하면 게시글 리스트 화면을 확인할 수 있다.
http://localhost:9999/web-11-board/BoardServlet?command=board_list
게시글 등록을 클릭하면 BoardServlet?command=board_write_form
이 요청되어 게시글 등록 페이지로 이동하도록 한다. 이를 위해 액션 클래스를 만들고 이 요청을 처리할 코드를 ActionFactory에 추가해야 한다. 액션 클래스에서는 게시글 등록 화면으로 이동하도록 한다.
boardWrite.jsp로 이동하도록 하는 액션 클래스
package com.sw.controller.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BoardWriteFormAction implements Action{
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/board/boardWrite.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/shopping.css">
<script type="text/javascript" src="script/board.js"></script>
</head>
<body>
<div id="wrap" align="center">
<h1>게시글 등록</h1>
<form action="BoardServlet" name="frm" method="post">
<input type="hidden" name="command" value="board_write">
<table>
<tr>
<th>작성자</th>
<td><input type="text" name="name"> * 필수</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="pass"> * 필수 (게시물 수정 삭제시 필요합니다.)</td>
</tr>
<tr>
<th>이메일</th>
<td><input type="text" name="email"></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" size="70" name="title"> * 필수</td>
</tr>
<tr>
<th>내용</th>
<td><textarea type="text" cols="70" rows="15" name="content"></textarea></td>
</tr>
</table>
<br>
<br>
<input type="submit" value="등록" onclick="return boardCheck()">
<input type="reset" value="다시 작성">
<input type="button" value="목록" onclick="location.href='BoardServlet?command=board_list'">
</form>
</div>
</body>
</html>
다음 코드로 수정
} else if(command.equals("board_write_form")){
action = new BoardWriteFormAction();
}
ActionFactory.java
package com.sw.controller;
import com.sw.controller.action.*;
public class ActionFactory {
//싱글톤 패턴으로 정의
private static ActionFactory instance = new ActionFactory();
private ActionFactory() {
super();
}
public static ActionFactory getInstance() {
return instance;
}
public Action getAction(String command) {
Action action = null;
System.out.println("ActionFactory :" + command);
if(command.equals("board_list")){
action = new BoardListAction();
} else if(command.equals("board_write_form")){
action = new BoardWriteFormAction();
}
return action;
}
}
이제 게시글 등록 버튼을 누르면 등록 화면(게시글 작성 화면)을 확인할 수 있다.
package com.sw.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.sw.dto.BoardVO;
import util.DBManager;
public class BoardDAO {
//싱글톤 패턴으로 만들기
private BoardDAO() {
}
private static BoardDAO instance = new BoardDAO();
public static BoardDAO getInstance() {
return instance;
}
//게시판 테이블의 전체 데이터를 VO객체의 리스트로 받아오는 메소드. (한 행이 하나의 VO객체)
public List<BoardVO> selectAllBoards(){
String sql = "select * from board order by num desc";
List<BoardVO> list = new ArrayList<BoardVO>();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = DBManager.getConnection();
stmt = conn.createStatement();
//조회 쿼리 실행
rs = stmt.executeQuery(sql);
while(rs.next()) {
//한 행마다 VO객체를 하나씩 생성하고 set메소드로 해당 행의 컬럼값을 담음
BoardVO bVo = new BoardVO();
bVo.setNum(rs.getInt("num"));
bVo.setName(rs.getString("name"));
bVo.setEmail(rs.getString("email"));
bVo.setPass(rs.getString("pass"));
bVo.setTitle(rs.getString("title"));
bVo.setContent(rs.getString("content"));
bVo.setReadcount(rs.getInt("readcount"));
bVo.setWritedate(rs.getTimestamp("writedate"));
list.add(bVo); //리스트의 마지막에 해당 VO객체를 추가함
}
}catch(SQLException e) {
e.printStackTrace();
}finally {
DBManager.close(conn, stmt, rs);
}
return list;
}
//추가한 부분
public void insertBoard(BoardVO bVo) {
String sql = "insert into board("
+ "num, name, email, pass, title, content)"
+ "values(board_seq.nextval, ?, ?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bVo.getName());
pstmt.setString(2, bVo.getEmail());
pstmt.setString(3, bVo.getPass());
pstmt.setString(4, bVo.getTitle());
pstmt.setString(5, bVo.getContent());
pstmt.executeUpdate();
}catch(SQLException e) {
e.printStackTrace();
}finally {
DBManager.close(conn, pstmt);
}
}
}
게시글을 데이터베이스에 추가하기 위한 액션 클래스
package com.sw.controller.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sw.dao.BoardDAO;
import com.sw.dto.BoardVO;
public class BoardWriteAction implements Action{
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BoardVO bVo = new BoardVO();
bVo.setName(request.getParameter("name"));
bVo.setPass(request.getParameter("pass"));
bVo.setEmail(request.getParameter("email"));
bVo.setTitle(request.getParameter("title"));
bVo.setContent(request.getParameter("content"));
BoardDAO bDao = BoardDAO.getInstance();
bDao.insertBoard(bVo);
new BoardListAction().execute(request, response);
}
}
커맨드 패턴으로 작업을 처리하기 위해 getAction()에 다음 코드를 추가한다.
}else if(command.equals("board_write")){
action = new BoardWriteAction();
}
*수정