2013년 7월 24일 수요일

(130724) 23일차 web.xml 외 13개 (Spring의 SimpleJdbcTemplate를 이용한 답변형 게시판 폼 DB 연동하기)

 - /WebContent/WEB-INF/web.xml 소스
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <servlet>
    <servlet-name>springboard</servlet-name>
    <servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
  </servlet>

  <servlet-mapping>

    <servlet-name>springboard</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <!-- 한글 처리 -->
  <filter>
  <filter-name>encodingFilter</filter-name>
  <filter-class>
  org.springframework.web.filter.CharacterEncodingFilter
  </filter-class>
  <init-param>
  <param-name>encoding</param-name>
  <param-value>EUC-KR</param-value>
  </init-param>
  </filter>
  
  <filter-mapping>
  <filter-name>encodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>


 - /WebContent/WEB-INF/springboard-servlet.xml 소스

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- Controller 작성 -->
<!-- BoardWriteController - Insert 실행 -->
<bean id="boardwritecontroller" name="/BoardWriteController.do" class="controller.BoardWriteController"
p:boardDao-ref="boardDao"
>
</bean>

<bean id="boardwriteproccontroller" name="/BoardWriteProcController.do" class="controller.BoardWriteProcController">
</bean>

<!-- BoardList - Select * 실행 -->
<bean id="boardlistcontroller" name="/BoardListController.do" class="controller.BoardListController"
p:boardDao-ref="boardDao"
>
</bean>

<!-- BoardInfo - Select 실행 -->
<bean id="boardinfocontroller" name="/BoardInfoController.do" class="controller.BoardInfoController"
p:boardDao-ref="boardDao"
>
</bean>

<!-- 게시글 수정 - Update 실행 -->
<bean id="boardupdatecontroller" name="/BoardUpdateController.do" class="controller.BoardUpdateController"
p:boardDao-ref="boardDao"
>
</bean>

<!-- 게시글 삭제 - Delete 실행 -->
<bean id="boarddeletecontroller" name="/BoardDeleteController.do" class="controller.BoardDeleteController"
p:boardDao-ref="boardDao"
>
</bean>

<bean id="boardDao" class="board.BoardDao"
p:dataSource-ref="dataSource"
>
</bean>

<!-- Controller 실행 후 결과를 result할 jsp 페이지를 설정 -->
<bean id = "internalResolver"
 class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
 <property name = "viewClass">
  <value>org.springframework.web.servlet.view.JstlView</value>  
 </property>
 <property name="prefix">
  <value>/jsp/</value>
 </property>
 <property name="suffix">
  <value>.jsp</value>
 </property>
</bean>

<!-- 데이터 베이스 객체를 사용할 수 있게 설정해주는 Datasource 선언 -->
<bean id = "dataSource"
 class = "org.springframework.jdbc.datasource.DriverManagerDataSource">
 <property name = "driverClassName">
  <value>oracle.jdbc.driver.OracleDriver</value>
 </property>
 <property name="url">
  <value>jdbc:oracle:thin:@127.0.0.1:1521:XE</value>
 </property>
 <property name="username">
  <value>system</value>
 </property>
 <property name="password">
  <value>123456</value>
 </property>
 
</bean> 
</beans>


 - /src/board/BoardBean.java 소스

package board;

import java.util.Date;


public class BoardBean {

private int num;
private String writer;
private String passwd;
private String subject;
private String contents;
private String email;
private int ref;
private int re_level;
private int re_step;
private Date reg_date;
private int readcount;

public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContents() {
return contents;
}
public void setContents(String contents) {
this.contents = contents;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public int getRe_step() {
return re_step;
}
public void setRe_step(int re_step) {
this.re_step = re_step;
}
public Date getReg_date() {
return reg_date;
}
public void setReg_date(Date reg_date) {
this.reg_date = reg_date;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}

}


 - /src/board/BoardDao.java 소스 (중요)
package board;

import java.util.List;
import java.util.Vector;

import javax.sql.DataSource;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

public class BoardDao {


// Statement 객체와 유사한 쿼리를 실행시켜주는 객체
SimpleJdbcTemplate template;

// springboard-servlet.xml 파일에서 MemberDao가 DataSource 객체를 참조하게 선언
// 자동 매핑을 위해서 위 방식 보다는 아래 방식을 추천 (위 방식은 직접 받는 방식, 아래 방식은 인터페이스를 사용한 방식)
DataSource dataSource;

public void setDataSource(DataSource dataSource) {
template = new SimpleJdbcTemplate(dataSource);
}

// 1. 하나의 게시글을 저장하는 메소드
public void insertBoard(BoardBean bbean){
int num = bbean.getNum();
int ref = bbean.getRef();
int re_level = bbean.getRe_level();
int re_step = bbean.getRe_step();

// num값이 0이 아니라면 즉, 답글 이라면
// 부모값으로 넘어온 ref를 기준으로 re_level, re_step의 값을 증가시킨다.
if(num != 0){
// step을 증가시키는 데 현재 부모의 step보다 큰 것들만 1씩 더한다
// 새로운 댓글을 집어넣으면 그 댓글을 위해서 나머지 글들의 step을 1씩 증가시켜야 함
String sql = "update bboard set re_step=re_step+1 where ref=? and re_step>?";
template.update(sql, ref, re_step); // 물음표부분을 여기서 작성 
re_level+=1;
re_step+=1; // 자신을 증가시킴
}

else{
// 새 글이라면
// 현재 글그룹의 최고값을 가져옴
String sql = "select max(ref) from bboard"; // ref의 최고값을 리턴
if(ref == 0){
ref = template.queryForInt(sql)+1; // max(ref)를 가져와서 +1을 수행
}
else{ // 첫 새글 이라면
ref = 1;
}
re_step = 0; // 첫 새글이라면
re_level = 0;
}
// 쿼리 준비
String sql = "insert into bboard values(board_seq.nextval, :writer, :passwd, :subject, :contents, :email, '"+ref+"', '"+re_level+"', '"+re_step+"',sysdate, 0)";

// 준비된 쿼리를 스프링용 SimpleJdbcTemplate 형태로 바꿔줌
// 알아서 bean 클래스와 매핑 시킴
SqlParameterSource sqlsource = new BeanPropertySqlParameterSource(bbean);
// 쿼리 실행
template.update(sql, sqlsource);
}

// ★ 총 게시글의 개수를 파악하는 메소드
public int getAllCount(){
// 쿼리 준비
String sql = "select count(*) from bboard";

return template.queryForInt(sql);
}


// 2. 총 10개의 데이터를 보여주는 메소드 작성
public List<BoardBean> getAllBoard(int start, int end){
// 쿼리 준비
String sql = "select * from (Select A.*, Rownum Rnum from (select * from bboard order by ref Desc, re_step Asc)A) WHERE Rnum > ? and Rnum <= ?";

// sql에 맞는 rowmap
// 멤버빈타입 속성과 board 테이블의 레코드, 컬럼명을 일치시켜주는 객체
RowMapper<BoardBean> rm = new BeanPropertyRowMapper<BoardBean>(BoardBean.class);

return template.query(sql, rm, start-1, end); // 물음표부분을 여기서 작성 (빈클래스와 관련 없을 때)
}

// 3. 하나의 게시글을 리턴하는 메소드 작성
public BoardBean getOneBoard(int num){
// 조회수를 증가시킴
setCount(num);
// 쿼리 준비
String sql = "select * from bboard where num=?";

// 멤버빈타입 속성과 member 테이블의 레코드, 컬럼명을 일치시켜주는 객체
RowMapper<BoardBean> rm = new BeanPropertyRowMapper<BoardBean>(BoardBean.class);
return template.queryForObject(sql, rm, num);
}

// 4. 하나의 게시글을 수정하는 메소드 작성
public void updateBoard(String num2, String subject, String contents){
// 쿼리 준비
String sql = "update bboard set subject=?, contents=? where num=?";

template.update(sql, subject, contents, num2);
}

// 5. 하나의 게시글을 삭제하는 메소드 작성
public void deleteBoard(String num){
// 쿼리 준비
String sql = "delete from bboard where num=?";

template.update(sql, num);
}


// ★ 조회수를 증가시키기 위한 메소드
public void setCount(int num){
// 현재 선택된 게시글 번호의 조회수를 가져옴
String sql = "update bboard set readcount=readcount+1 where num=?";
template.update(sql, num);
}
}


 - /WebContent/main.jsp 소스

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!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=EUC-KR">
<title> 메인 </title>
</head>
<body>
<center>
<font face="휴먼아미체">
<h2><a href = "/SpringBoard/BoardWriteProcController.do"> 시작 </a></h2>
</font>
</center>
</body>
</html>



 - /src/controller/BoardWriteProcController.java 소스
package controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

public class BoardWriteProcController {

@RequestMapping("/BoardWriteProcController")
public ModelAndView writeBoard(String num, String ref, String re_level, String re_step){
// 해당 글이 최신글인지 답변글인지를 파악 후 데이터를 저장
int ref1=0, num1=0, re_step1=0, re_level1=0;
try{
// num값이 null과 같다면 - 즉, 댓글이라면
if(num!=null){
num1 = Integer.parseInt(num);
ref1 = Integer.parseInt(ref);
re_level1 = Integer.parseInt(re_level);
re_step1 = Integer.parseInt(re_step);
}

} catch (Exception e){
}

// model과 view를 동시에 지정 가능한 객체 선언
ModelAndView mav = new ModelAndView();
mav.addObject("num", num1);
mav.addObject("ref", ref1);
mav.addObject("re_level", re_level1);
mav.addObject("re_step", re_step1);
// 컨트롤러에서 컨트롤러를 호출
mav.setViewName("BoardWrite");

return mav; // bean 클래스에 선언한 ViewResolver 클래스를 호출
}
}


 - /WebContent/jsp/BoardWrite.jsp 소스
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=EUC-KR">
<title> 글 쓰 기 </title>
</head>
<body>
<center>
<font face="휴먼아미체">
<h2> 글 쓰 기 </h2>

<form action="/SpringBoard/BoardWriteController.do" method="post">

   
<input type="hidden" name="num" value="${num}">
  <%-- 새글이라면 1, 1, 1이 넘어가고, 답글이라면 지정한 값이 넘어간다. --%>
  <input type="hidden" name="ref" value="${ref}">
  <input type="hidden" name="re_level" value="${re_level}">
  <input type="hidden" name="re_step" value="${re_step}">
  
<table width="500" border="1" cellpadding="5" cellspacing="2">
<tr>
<td align="right" colspan="2"> <a href = "/SpringBoard/BoardListController.do"> 전체 글보기 </a> </td>
</tr>

    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 이 름 </th>
    <td width="330"> <input type="text" name="writer" size="25"> </td>
    </tr>
   
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> 제 목  </th>
    <td width="330"> 
    <c:if test="${num==0}">
    <input type="text" name="subject" size="25">
    </c:if>
    <c:if test="${num!=0}">
    <input type="text" name="subject" size="25" value="┗  [Re] ">
    </c:if>
</td>
    </tr>
   
    <tr>
    <th width="70" align="center" bgcolor="FFFFFFF"> Email </th>
    <td width="330"> <input type="text" name="email" size="25"> </td>
    </tr>

    <tr>

    <th width="70" align="center" bgcolor="FFFFFFF"> 내 용  </th>
    <td width="330"> <textarea name="contents" rows="13" cols="40"></textarea> </td>
    </tr>

    <tr>

    <th width="70" align="center" bgcolor="FFFFFFF"> 비밀번호 </th>
    <td width="330"> <input type="password" name="passwd" size="25"> </td>
    </tr>
    </table>
   
    <table width="180" border="0" cellpadding="5">
    <tr>
    <td> <input type="submit" value="쓰기"> </td>
    <td> <input type="reset" value="취소"> </td>
    <td> <input type="button" value="목록" onclick="window.location='/SpringBoard/BoardListController.do'"> </td>    
    </tr>
  </table>
  </form>
</font> 
</center>
</body>

</html>


 - /src/controller/BoardWriteController.java 소스 (Insert 문)

package controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

import board.BoardBean;

import board.BoardDao;


public class BoardWriteController {


BoardDao boardDao;

public void setBoardDao(BoardDao boardDao) {

this.boardDao = boardDao;
}


@RequestMapping("/BoardWriteController")

public ModelAndView writeBoard(BoardBean bbean){
// 게시판 등록
boardDao.insertBoard(bbean);

// model과 view를 동시에 지정 가능한 객체 선언
ModelAndView mav = new ModelAndView();

// 컨트롤러에서 컨트롤러를 호출
mav.setView(new RedirectView("BoardListController.do"));

return mav; // bean 클래스에 선언한 ViewResolver 클래스를 호출

}

}


 - /src/controller/BoardListController.java 소스 (Select * 문)

package controller;

import java.util.List;
import java.util.Vector;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import board.BoardBean;
import board.BoardDao;

public class BoardListController {

BoardDao boardDao;

public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}

@RequestMapping("/BoardListController")
public ModelAndView listBoard(String pageNum){

// 화면에 보여질 개수를 저장하는 변수 선언
int pageSize = 10;
// 전체 글의 개수를 저장할 변수 선언
int count = 0;
// 현재 페이지에 표시할 헤코드 수
int number = 0;

// 새로쓴글, 삭제, 또는 수정시 호출되었는지 아니면 페이징 처리되었는지를 파악해주어야 함
if(pageNum == null){ // 미 페이징 처리라면
pageNum = "1";
}
// pageNum를 숫자로 바꾸어줌
int currentPage = Integer.parseInt(pageNum);
// 모든 게시글의 수
count = boardDao.getAllCount();
List<BoardBean> list = null;
// 현재 페이지에 보여줄 시작 번호를 설정
int startRow = (currentPage-1) * pageSize+1;
int endRow = currentPage*pageSize; // 10개씩 게시글을 보여줌

if(count > 0){
// 총게시글에서 원하는 부분의 데이터를 가져옴
list = boardDao.getAllBoard(startRow, endRow);
// 테이플에 표시해야할 번호를 지정하기 위해서 사용하는 변수
number = count - (currentPage-1) * pageSize;
}
// BoardList.jsp쪽으로 데이터를 넘겨줌
ModelAndView mav = new ModelAndView();
// 데이터를 부착
mav.addObject("currentPage", currentPage);
mav.addObject("startRow", startRow);
mav.addObject("endRow", endRow);
mav.addObject("count", count);
mav.addObject("pageSize", pageSize);
mav.addObject("number", number);
mav.addObject("listbean", list);
mav.setViewName("BoardList");
return mav;
}
}


 - /WebContent/jsp/BoardList.jsp 소스
<%@page import="board.BoardBean"%>
<%@page import="java.util.Vector"%>
<%@page import="board.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 국제화 태그 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!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=EUC-KR">
<title> 자 유 게 시 판 </title>
</head>
<body>
<center>
<font face="휴먼아미체">
<h2> 자 유 게 시 판 </h2>
  <form action = "/SpringBoard/BoardWriteProcController.do" method = "post">
<table border = "1" width = "740" cellpadding="4" cellspacing="2">
<tr bgcolor = "FFFFFFF">
  <th width = "50"> 번호 </th>
  <th width = "330"> 제목 </th>
  <th width = "130"> 작성자 </th>
  <th width = "130"> 날짜 </th>
  <th width = "80"> 조회수 </th>
</tr>

  <c:forEach var="listbean" items="${listbean}">
  <tr>
  <th width="50"><c:out value="${number}"/>
  <c:set var="number" value="${number-1}"></c:set>
  </th>
  <td width = "330" align = "left">
  <!-- 답글인지를 파악해서 들여쓰기를 하기위한 수행 -->
  <c:if test = "${listbean.re_level > 0}">
  <c:forEach var="i" begin="1" end="${listbean.re_level}">
  &nbsp;&nbsp;
  </c:forEach>
  </c:if>
  <a href = "/SpringBoard/BoardInfoController.do?num=${listbean.num}">${listbean.subject}</a> </td>
<td width = "130"> ${listbean.writer} </td>
  <td width = "130"> ${listbean.reg_date} </td>
  <td width = "80"> ${listbean.readcount} </td>
  </tr>
  </c:forEach>
    </table>

    <table border = "0" width = "740" cellpadding="4">

    <tr>
<td colspan = "5" align = "right"> <input type = "submit" value = "글쓰기"> </td>
</tr>
  </table>
  </form>
 
  <c:if test="${count > 0}">
  <!-- 데이터 개수 및 화면에 표시할 데이터의 개수를 설정 -->
  <c:set var = "pageCount" value="${count/pageSize+(count%pageSize==0 ? 0 : 1) }"/>
  <c:set var = "startPage" value="${1}"/>
  <fmt:parseNumber value = "${currentPage/10}" integerOnly = "true" var = "result"/>
  <c:if test = "${currentPage%10 != 0}">
  <c:set var="startPage" value="${result*10+1}"/>
  </c:if>
  <c:if test="${currentPage%10 == 0}">
  <c:set var="startPage" value="${(result-1)*10+1}"/>
  </c:if>
 
  <!-- 화면아래 페이징 처리를 해야하는 소스를 작성 -->
  <c:set var = "pageBlock" value = "${10}"/>
  <c:set var = "endPage" value = "${startPage+pageBlock-1}"/>
  <c:if test = "${endPage>pageCount}">
  <c:set var = "endPage" value="${pageCount}"/>
  </c:if>
  <c:if test="${endPage>10}">
  <a href = "BoardList?pageNum=${startPage-10}"> [이전] </a>
  </c:if>
  <c:forEach var="m" begin="${startPage}" end="${endPage}"> 
    <a href = "BoardListController.do?pageNum=${m}"> [${m}] </a>    
    </c:forEach>
  <c:if test="${endPage>pageCount}">
  <a href = "BoardListController.do?pageNum=${startPage+10}"> [다음] </a>
  </c:if>
  </c:if> 
</font>
</center>
</body>
</html>


 - /src/controller/BoardInfoController.java 소스 (Select 문)

package controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import board.BoardBean;
import board.BoardDao;

public class BoardInfoController {

BoardDao boardDao;


public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}


@RequestMapping("/BoardInfoController")
public ModelAndView infoBoard(int num){

// 데이터베이스에 접근해서 데이터를 받아옴
BoardBean bbean = boardDao.getOneBoard(num);

return new ModelAndView("BoardInfo", "bbean", bbean);
}
}


 - /WebContent/jsp/BoardInfo.jsp 소스

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!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=EUC-KR">
<title> 자 유 게 시 판 </title>
</head>
<body>
<center>
<font face="휴먼아미체">
<h2> 자 유 게 시 판 </h2>
<form action = "/SpringBoard//BoardUpdateController.do" method = "post" name = "form">
    <table border = "1" width = "500" height = "380" cellpadding="5" cellspacing="2">
    <tr>
    <th width = "100" bgcolor="FFFFFFF"> 글번호 </th>
    <td width = "250"> <input type = "text" size = "40" name = "num" value = "${bbean.num}" disabled> </td>
    </tr>
   
    <tr>
    <th width = "100" bgcolor="FFFFFFF"> 작성자 </th>
    <td width = "250"> <input type = "text" size = "40" name = "writer" value = "${bbean.writer}" disabled> </td>
    </tr>
  
    <tr>
    <th width = "100" bgcolor="FFFFFFF"> 글 제목 </th>
    <td width = "250"> <input type = "text" size = "40" name = "subject" value = "${bbean.subject}"> </td>
    </tr>
   
    <tr>
    <th width = "100" bgcolor="FFFFFFF"> 내용 </th>
    <td width = "250"> <textarea cols = "40" rows = "10" name = "contents"> ${bbean.contents} </textarea> </td>
    </tr>
   
    <tr>
    <th width = "100" bgcolor="FFFFFFF"> 비밀번호 </th>
    <td width = "250"> <input type = "password" size = "40" name = "passwd"> </td>
    </tr>
    </table>
  
    <table border = "0" width = "250" cellpadding = "5">
    <tr>
    <td> <input type = "submit" value = "수정"> </td>
    <td> <input type = "button" value = "삭제" onclick = "window.location='/SpringBoard/BoardDeleteController.do?num=${bbean.num}'"> </td>
    <td> <input type = "button" value = "답글" onclick = "window.location='/SpringBoard/BoardWriteProcController.do?num=${bbean.num}&ref=${bbean.ref}&re_level=${bbean.re_level}&re_step=${bbean.re_step}'"> </td>
    <td> <input type = "button" value = "목록" onclick = "window.location='/SpringBoard/BoardListController.do'"> </td>
    </tr>
    </table>
   
    <input type = "hidden" name = "num2" value = "${bbean.num}">
    <input type = "hidden" name = "passwd2" value = "${bbean.passwd}">
    </form>
</center>
</body>
</html>


 - /src/controller/BoardUpdateController.java 소스 (Update 문)
package controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

import board.BoardDao;


public class BoardUpdateController {


BoardDao boardDao;



public void setBoardDao(BoardDao boardDao) {

this.boardDao = boardDao;
}

@RequestMapping("/BoardUpdateController")

public ModelAndView updateBoard(String num2, String subject, String contents){
// 데이터베이스에 접근해서 데이터를 받아옴
boardDao.updateBoard(num2, subject, contents);

// model과 view를 동시에 지정 가능한 객체 선언

ModelAndView mav = new ModelAndView();

// 컨트롤러에서 컨트롤러를 호출

mav.setView(new RedirectView("BoardListController.do"));

return mav; // bean 클래스에 선언한 ViewResolver 클래스를 호출

}
}


 - /src/controller/BoardDeleteController.java 소스 (Delete 문)
package controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

import board.BoardDao;

public class BoardDeleteController {
BoardDao boardDao;


public void setBoardDao(BoardDao boardDao) {
this.boardDao = boardDao;
}

@RequestMapping("/BoardDeleteController")
public ModelAndView deleteBoard(String num){
// 데이터베이스에 접근해서 데이터를 받아옴
boardDao.deleteBoard(num);

// model과 view를 동시에 지정 가능한 객체 선언
ModelAndView mav = new ModelAndView();

// 컨트롤러에서 컨트롤러를 호출
mav.setView(new RedirectView("BoardListController.do"));

return mav; // bean 클래스에 선언한 ViewResolver 클래스를 호출
}
}


 - 결과