쌍용교육(JAVA)/MVC

쌍용교육 -JSP수업 55~56일차 - MVC(4)

구 승 2024. 5. 8. 14:40

list.jsp를 호출하면 주소는 제대로 명시되지만 MVC 특성상 servlet이 먼저 호출되어야되기 때문에 클라이언트의 직접호출을 막아둠. index.jsp에서 실행해야된다.

SQL연결

MVC모델 패턴

순서 index.jsp => ActionMap.properties => kr.board.action(ex:WriteAction.java) => views(ex:write.jsp)

kr.board.vo => BoardVO

package kr.board.vo;

import java.sql.Date;

public class BoardVO {
	private int num;
	private String title;
	private String name;
	private String passwd;
	private String email;
	private String content;
	private String ip;
	private Date reg_date;
	
	//비밀번호 일치 여부 체크
	public boolean isCheckedPassword(String userPasswd) {
		if(passwd.equals(userPasswd)) {
			return true; //비밀번호 일치
		}
		return false;//비밀번호 불일치
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getIp() {
		return ip;
	}
	public void setIp(String ip) {
		this.ip = ip;
	}
	public Date getReg_date() {
		return reg_date;
	}
	public void setReg_date(Date reg_date) {
		this.reg_date = reg_date;
	}
}

 

kr.util => ch03_JSP에 있던 DBUtil.java 과 PagingUtil.java 를 copy

  META-INF => ch03_JSP에 있던 MANIFEST.MF와 context.xml 을 copy

 

kr.board.dao => BoardDAO 

package kr.board.dao;

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

import kr.board.vo.BoardVO;
import kr.util.DBUtil;

public class BoardDAO {
	//싱글턴패턴
	private static BoardDAO instance = new BoardDAO();
	
	public static BoardDAO getInstance() {
		return instance;
		
	}
	private BoardDAO() {}
	
	//글저장
	public void insert(BoardVO boardVO) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
			//커넥션풀로부터 커넥션 할당
			conn = DBUtil.getConnection();
			//SQL문 작성
			sql = "INSERT INTO svboard (num,title,name,passwd,email,content,ip)"
					+ "VALUES (svboard_seq.nextval,?,?,?,?,?,?)";
			//prepareStatement 객체 생성
			pstmt = conn.prepareStatement(sql);
			
			//?에데이터 바인딩
			pstmt.setString(1, boardVO.getTitle());
			pstmt.setString(2, boardVO.getName());
			pstmt.setString(3, boardVO.getPasswd());
			pstmt.setString(4, boardVO.getEmail());
			pstmt.setString(5, boardVO.getContent());
			pstmt.setString(6, boardVO.getIp());
			
			//SQL문 실행
			pstmt.executeUpdate();
		}catch(Exception e) {
			throw new Exception(e);
		}finally {
			//자원정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	//글의 총 개수
	public int getCount() throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		int count = 0;
		
		try {
			//커넥션풀로부터 커넥션 할당
			conn=DBUtil.getConnection();
			
			sql = "SELECT COUNT(*) FROM svboard";
			//prepareStatement 객체 생성
			pstmt = conn.prepareStatement(sql);
			//SQL문 실행
			rs= pstmt.executeQuery();
			if(rs.next()) {
				count =rs.getInt(1); //컬럼 인덱스 
			}
		}catch(Exception e) {
			throw new Exception(e);
		}finally {
			//자원정리
			DBUtil.executeClose(null, pstmt, conn);
		}
		
		return count;
	}
	//글 목록
	public List<BoardVO> getList(int startRow,int endRow) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		List<BoardVO> list = null;
		
		try {
			conn = DBUtil.getConnection();
			
			//rnum 과 ORDER BY 뒤에는 공백이 있어야된다
			
			sql="SELECT * FROM (SELECT a.*,rownum rnum "
					+ "FROM(SELECT * FROM svboard ORDER BY "
					+ "num DESC)a) WHERE rnum >=? and rnum <=?";
			
			pstmt = conn.prepareStatement(sql);
			
			pstmt.setInt(1, startRow);
			pstmt.setInt(2, endRow);
			
			rs = pstmt.executeQuery();
			list = new ArrayList<BoardVO>();
			while(rs.next()) {
				//자바빈 생성
				BoardVO boardVO = new BoardVO();
				boardVO.setNum(rs.getInt("num"));
				boardVO.setTitle(rs.getString("Title"));
				boardVO.setName(rs.getString("name"));
				boardVO.setReg_date(rs.getDate("reg_date"));
				//자바빈을 ArrayList에 저장
				list.add(boardVO);
			}
		}catch(Exception e) {
			throw new Exception(e);
		}finally {
			//자원정리
			DBUtil.executeClose(rs, pstmt, conn);
		}
		return list;
	}
	//글 상세
	public BoardVO getBoard(int num)throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		BoardVO board = null;
		try {
			conn = DBUtil.getConnection();
			
			sql="SELECT * FROM svboard WHERE num=?";
			//PreparedStatement객체 생성
			pstmt = conn.prepareStatement(sql);
			//?에 데이터 바인딩
			pstmt.setInt(1, num);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				board = new BoardVO();
				board.setNum(rs.getInt("num"));
				board.setTitle(rs.getString("title"));
				board.setName(rs.getString("name"));
				board.setPasswd(rs.getString("passwd"));
				board.setEmail(rs.getString("email"));
				board.setContent(rs.getString("content"));
				board.setReg_date(rs.getDate("reg_date"));
			}
		}catch(Exception e) {
			throw new Exception(e);
		}finally {
			//자원정리
			DBUtil.executeClose(null, pstmt, conn);
		}
		return board;
	}
	//글 수정
	public void update(BoardVO boardVO)throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
			//커넥션풀로부터 커넥션 할당
			conn = DBUtil.getConnection();
			sql = "UPDATE svboard SET title=?,name=?,email=?,"
					+ "content=?,ip=? WHERE num=?";
			//PreparedStatement객체 생성
			pstmt = conn.prepareStatement(sql);
			//?에 데이터 바인딩
			pstmt.setString(1,boardVO.getTitle());
			pstmt.setString(2,boardVO.getName());
			pstmt.setString(3,boardVO.getEmail());
			pstmt.setString(4,boardVO.getContent());
			pstmt.setString(5,boardVO.getIp());
			pstmt.setInt(6,boardVO.getNum());
			//SQL문 실행
			pstmt.executeUpdate();
			
		}catch(Exception e) {
			throw new Exception(e);
		}finally {
			//자원정리
			DBUtil.executeClose(null, pstmt, conn);
		}
		
	}
	//글 삭제
	public void delete(int num)throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql = null;
		try {
			//커넥션풀로부터 커넥션 할당
			conn = DBUtil.getConnection();
			sql="DELETE FROM svboard WHERE num=?";
			//PreparedStatement객체 생성
			pstmt = conn.prepareStatement(sql);
			//?에 데이터 바인딩
			pstmt.setInt(1, num);
			//SQL문 실행
			pstmt.executeUpdate();
		}catch(Exception e) {
			throw new Exception(e);
		}finally {
			//자원정리
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	
}

kr.board.action => WriteFormAction.java

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;

public class WriteFormAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//JSP 경로 반환
		return "/WEB-INF/views/writeForm.jsp";
	}

}

 

/WEB-INF/views/ => writeForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기</title>
<link rel ="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<script type="text/javascript">
window.onload=function(){
	const myForm = document.getElementById('register_form');
	//이벤트 연결
	myForm.onsubmit = function(){
		const items = document.querySelectorAll('input[type="text"],input[type="password"],input[type="email"],textarea');
		for(let i=0;i<items.length;i++){
			if(items[i].value.trim()==''){
				const label = document.querySelector('label[for="'+items[i].id+'"]');
				alert(label.textContent + '항목은 필수 입력');
				items[i].value='';
				items[i].focus();
				return false;
			}
		}
	};
};
</script>
</head>
<body>
<div class="page-main">
<h2>글쓰기</h2>
<form id="register_form" action="write.do" method="post">
	<ul>
		<li>
			<label for="title">제목</label>
			<input type="text" name="title" id="title" size="10" maxlength="50">
		</li>
		<li>
			<label for="name">이름</label>
			<input type="text" name="name" id="name" size="10" maxlength="10">
		</li>
		<li>
			<label for="passwd">비밀번호</label>
			<input type="password" name="passwd" id="passwd" size="12" maxlength="12">
		</li>
		<li>
			<label for="email">이메일</label>
			<input type="email" name="email" id="email" size="20" maxlength="50">
		</li>
		<li>
			<label for="content">내용</label>
			<textarea rows="5" cols="40" name="content" id="content"></textarea>
		</li>
	</ul>
	<div class="align-center">
		<input type="submit" value="글쓰기">
		<input type="button" value="목록" onclick="location.href='list.do'">
	</div>
</form>
</div>
</body>
</html>

ActionMap.properties

#DispatcherServlet에서 읽어갈 정보를
#key와 value의 쌍으로 명시
#요청 URL = 모델클래스
/list.do = kr.board.action.ListAction
/write.do = kr.board.action.WriteFormAction

kr.board.action => WriteAction

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;

public class WriteAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//전송된 데이터 인코딩 타입 지정
		request.setCharacterEncoding("utf-8");
		//자바빈(VO) 객체 생성
		BoardVO boardVO = new BoardVO();
		boardVO.setTitle(request.getParameter("title"));
		boardVO.setName(request.getParameter("name"));
		boardVO.setPasswd(request.getParameter("passwd"));
		boardVO.setEmail(request.getParameter("email"));
		boardVO.setContent(request.getParameter("content"));
		boardVO.setIp(request.getRemoteAddr());
		
		BoardDAO dao = BoardDAO.getInstance();
		dao.insert(boardVO);
		//JSP 경로 반환
		return "/WEB-INF/views/write.jsp"; 
	}

}

views=>write.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글쓰기 완료</title>
<link rel ="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
</head>
<body>
<div class="page-main">
	<h2>글쓰기 완로</h2>
	<div class="result-display">
		<div class="align-center">
			게시판에 글 등록을 완료했습니다.<p>
			<button onclick="location.href='list.do'">목록</button>
		</div>
	</div>
</div>
</body>
</html>

ActionMap.properties

#DispatcherServlet에서 읽어갈 정보를
#key와 value의 쌍으로 명시
#요청 URL = 모델클래스
/list.do = kr.board.action.ListAction
/writeForm.do = kr.board.action.WriteFormAction
/write.do = kr.board.action.WriteAction

MEB-INF/lib => ch03_JSP에 있던 lstl-1.2.jar와 ofdbc8.jar 를 copy

ListAction.java 수정

package kr.board.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;
import kr.util.PagingUtil;

public class ListAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//선택한 페이지 반환
		String pageNum = request.getParameter("pageNum");
		if(pageNum ==null) pageNum = "1";
		
		BoardDAO dao = BoardDAO.getInstance();
		int count = dao.getCount();
		
		PagingUtil page = 
				//ch03에서 썼을 떄는 list.jsp에 변수를 하나하나 만들어서 한 걸 여기선 한줄로끝냄
				new PagingUtil(Integer.parseInt(pageNum),count,20,10,"list.do");
		List<BoardVO> list = null;
		if(count > 0) {
			list = dao.getList(page.getStartRow(),page.getEndRow());
		}
		//jsp에서 사용할 수 있도록
		request.setAttribute("count", count);
		request.setAttribute("list", list);
		request.setAttribute("page", page.getPage());
		//JSP경로반환
		return "/WEB-INF/views/list.jsp";
	}

}

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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>목록</title>
<%-- <link rel ="stylesheet" href="<%=request.getContextPath()%>/css/style.css"> --%>
<link rel ="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
</head>
<body>
<div class="page-main">
	<h2>게시판 목록</h2>
	<div class="align-right">
		<input type="button" value="글쓰기" onclick="location.href='writeForm.do'">
	</div>
	<c:if test="${count==0}">
		<div class="result-display">
			표시할 게시물이 없습니다.
		</div>
	</c:if>
	<c:if test="${count > 0}">
		<table>
			<tr>
				<th>글번호</th>
				<th>제목</th>
				<th>작성자</th>
				<th>작성일</th>
			</tr>
			<c:forEach var="board" items="${list}" >
			<tr>
				<td>${board.num}</td>
				<td><a href="detail.do?num=${board.num}">${board.title}</a></td>
				<td>${board.name}</td>
				<td>${board.reg_date}</td>
			</tr>
			</c:forEach>
		</table>
		<div class="align-center">
			${page}
		</div>
	</c:if>
</div>
</body>
</html>

kr.board.action => DetailAction.java(56일차 시작)

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;

public class DetailAction implements Action {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		int num = Integer.parseInt(request.getParameter("num"));
		
		BoardDAO dao = BoardDAO.getInstance();
		BoardVO boardVO = dao.getBoard(num);
		
		request.setAttribute("boardVO", boardVO);
		//JSP 경로 반환
		return "/WEB-INF/views/detail.jsp";
	}

}

views => detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글 상세</title>
<link rel ="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">

</head>
<body>
<div class="page-main">
	<h2>글 상세</h2>
	<ul>
		<li>글번호 : ${boardVO.num}</li>
		<li>제목 : ${boardVO.title}</li>
		<li>작성자 : ${boardVO.name}</li>
		<li>이메일 : ${boardVO.email}</li>
	</ul>
	<hr size="1" noshade="noshade" width="100%">
	<p>
		${boardVO.content}
	</p>
	<hr size="1" noshade="noshade" width="100%">
	<div class="align-right">
		작성일 : ${boardVO.reg_date}
		<input type="button" value="수정" onclick="location.href='modifyForm.do?num=${boardVO.num}'">
		<input type="button" value="삭제" onclick="location.href='deleteForm.do?num=${boardVO.num}'">
		<input type="button" value="목록" onclick="location.href='list.do'">
		
	</div>
</div>
</body>
</html>

ActionMap.properties(마지막에만 명시하도록 하자)

#DispatcherServlet\uC5D0\uC11C \uC77D\uC5B4\uAC08 \uC815\uBCF4\uB97C
#key\uC640 value\uC758 \uC30D\uC73C\uB85C \uBA85\uC2DC
#\uC694\uCCAD URL = \uBAA8\uB378\uD074\uB798\uC2A4
/list.do = kr.board.action.ListAction
/writeForm.do = kr.board.action.WriteFormAction
/write.do = kr.board.action.WriteAction
/detail.do = kr.board.action.DetailAction

ModifyFormAction.java 

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;

public class ModifyFormAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		int num = Integer.parseInt(request.getParameter("num"));
		
		BoardDAO dao = BoardDAO.getInstance();
		BoardVO boardVO = dao.getBoard(num);
		
		request.setAttribute("boardVO", boardVO);
		//JSP경로반환
		return "/WEB-INF/views/modifyForm.jsp";
	}

}

modifyForm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글수정</title>
<link rel ="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<script type="text/javascript">
window.onload=function(){
	const myForm = document.getElementById('modify_form');
	//이벤트 연결
	myForm.onsubmit = function(){
		const items = document.querySelectorAll('input[type="text"],input[type="password"],input[type="email"],textarea');
		for(let i=0;i<items.length;i++){
			if(items[i].value.trim()==''){
				const label = document.querySelector('label[for="'+items[i].id+'"]');
				alert(label.textContent + '항목은 필수 입력');
				items[i].value='';
				items[i].focus();
				return false;
			}
		}
	};
};
</script>
</head>
<body>
<div class="page-main">
<h2>글수정</h2>
<form id="modify_form" action="modify.do" method="post">
	<input type="hidden" name="num" value="${boardVO.num}">
	<ul>
		<li>
			<label for="title">제목</label>
			<input type="text" name="title" id="title" 
				value="${boardVO.title}" size="10" maxlength="50">
		</li>
		<li>
			<label for="name">이름</label>
			<input type="text" name="name" id="name" 
				value="${boardVO.name}" size="10" maxlength="10">
		</li>
		<li>
			<label for="passwd">비밀번호</label>
			<input type="password" name="passwd" id="passwd" size="12" maxlength="12">
		</li>
		<li>
			<label for="email">이메일</label>
			<input type="email" name="email" id="email" 
				value="${boardVO.email}" size="20" maxlength="50">
		</li>
		<li>
			<label for="content">내용</label>
			<textarea rows="5" cols="40" name="content" id="content" >${boardVO.content}</textarea>
		</li>
	</ul>
	<div class="align-center">
		<input type="submit" value="글수정">
		<input type="button" value="목록" onclick="location.href='list.do'">
	</div>
</form>
</div>
</body>
</html>

ModifyAction.java 

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;

public class ModifyAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//전송된 데이터 인코딩 타입 지정
		request.setCharacterEncoding("utf-8");
		//자바빈(VO) 생성
		BoardVO boardVO = new BoardVO();
		boardVO.setNum(Integer.parseInt(request.getParameter("num")));
		boardVO.setTitle(request.getParameter("title"));
		boardVO.setName(request.getParameter("name"));
		boardVO.setPasswd(request.getParameter("passwd"));
		boardVO.setEmail(request.getParameter("email"));
		boardVO.setContent(request.getParameter("content"));
		boardVO.setIp(request.getRemoteAddr());
		
		BoardDAO dao = BoardDAO.getInstance();
		//비밀번호 인증을 위해 한 건의 레코드를 자바빈(VO)에 담아서 반환
		BoardVO db_board = dao.getBoard(boardVO.getNum());
		boolean check = false;
		if(db_board!=null) {
			//비밀번호 일치 여부 체크
			check = db_board.isCheckedPassword(boardVO.getPasswd());
		}
		if(check) {//비밀번호 일치
			dao.update(boardVO);//글수정
			//상세페이지로 이동하기위해 글번호 저장
			request.setAttribute("num", boardVO.getNum());
		}
		
		request.setAttribute("check", check);
		//JSP 경로 반환
		return "/WEB-INF/views/modify.jsp";
	}

}

modify.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix ="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:if test="${check}">
	<script>
		alert('글 수정을 완료했습니다.');
		location.href='detail.do?num=${num}';
	</script>
</c:if>
<c:if test="${!check}">
	<script>
		alert('비밀번호 불일치');
		history.go(-1);
	</script>
</c:if>

DeleteFormAction.java 

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;

public class DeleteFormAction implements Action {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		int num = Integer.parseInt(request.getParameter("num"));
		
		request.setAttribute("num", num);
		//JSP 경로 반환
		return "/WEB-INF/views/deleteForm.jsp";
	}

}

deleteForm.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글삭제</title>
<link rel ="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<script type="text/javascript">
window.onload = function(){
	const myForm = document.getElementById('delete_form');
	//이벤트연결
	myForm.onsubmit = function(){
		const passwd = document.getElementById('passwd');
		if(passwd.value.trim()==''){
			alert('비밀번호를 입력하세요');
			passwd.value='';
			passwd.focus();
			return false;
		}
	};
};
</script>
</head>
<body>
<div class="page-main">
	<h2>글 삭제</h2>
	<form id="delete_form" action="delete.do" method="post">
		<input type="hidden" name="num" value="${num}">
		<ul>
			<li>
				<label for="passwd">비밀번호</label>
				<input type="password" name="passwd" id="passwd" size="12" maxlength="12">
			</li>
		</ul>
		<div class="align-center">
			<input type="submit" value="글 삭제">
			<input type="button" value="목록" onclick="location.href='list.do'">
		</div>
	</form>
</div>
</body>
</html>

DeleteAction.java

package kr.board.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.board.dao.BoardDAO;
import kr.board.vo.BoardVO;
import kr.controller.Action;

public class DeleteAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//전송된 데이터 인코딩 타입 지정
		int num = Integer.parseInt(request.getParameter("num"));
		
		String passwd = request.getParameter("passwd");
		
		BoardDAO dao = BoardDAO.getInstance();
		BoardVO db_board = dao.getBoard(num);
		boolean check = false;
		if(db_board!=null) {
			//비밀번호 일치여부 체크
			check = db_board.isCheckedPassword(passwd);
		}
		if(check) {
			dao.delete(num);//글 삭제
		}
		request.setAttribute("check", check);
		//JSP 경로 반환
		return "/WEB-INF/views/delete.jsp";
	}

}

delete.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix ="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:if test="${check}">
	<script>
		alert('글 삭제를 완료했습니다.');
		location.href="list.do";
	</script>
</c:if>
<c:if test="${!check}">
	<script>
		alert('비밀번호 불일치');
		history.go(-1);
	</script>
</c:if>

ActionMap.properties

#DispatcherServlet에서 읽어갈 정보를
#key와 value의 쌍으로 명시
#요청 URL = 모델클래스
/list.do = kr.board.action.ListAction
/writeForm.do = kr.board.action.WriteFormAction
/write.do = kr.board.action.WriteAction
/detail.do = kr.board.action.DetailAction
/modifyForm.do = kr.board.action.ModifyFormAction
/modify.do = kr.board.action.ModifyAction
/deleteForm.do= kr.board.action.DeleteFormAction
/delete.do = kr.board.action.DeleteAction