12.06.(화) MVC패턴(2)
MVC패턴
로그인을 하고나서 로그아웃은 세션에 등록된 아이디와 회원명을 지우는 것으로 완성된다.
/*.do=com.multi.home.CommandIndex
/member/login.do=com.multi.home.member.CommandLogin
/member/loginOk.do=com.multi.home.member.CommandLoginOk
/member/logout.do=com.multi.home.member.CommandLogout
package com.multi.home.member;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.multi.home.CommandService;
public class CommandLogout implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();
return "/index.jsp";
}
}
이렇게 세션에 담겨있는 데이터를 초기화시킨 후 index.jsp로 이동시키면 홈페이지에서 세션 정보를 불러올 수 없게되고,
그로 인해서 로그인버튼만 나타나게 된다.
게시판 만들기
이제 로그인을 했으니 게시판을 만들어서 글을 작성하고, 수정하고, 삭제할 수 있게 코드를 짜보자.
로그인 과정에서 이미 필요한 것을 모두 준비했으니, 우린 로직만 짜주면 완성할 수 있을 것이다.
우선 게시판용 폴더와 패키지를 만들자.
member패키지와 폴더를 생성했듯이, board패키지엔 Command클래스와 DAO, VO가 들어가고, board폴더에는 view페이지를 넣을 것이다.
이전에 서블릿에서 게시판을 만든 방식에서 크게 벗어나지 않는다.
VO에서 선언할 변수들은 DB에 있는 board_tbl테이블의 칼럼명들이다.
package com.multi.home.board;
public class BoardVO {
private int postno;
private String subject;
private String content;
private String username;
private int hitcount;
private String regdate;
private String ipAddr;
}
여기서 getter/setter를 생성하고, 어떤 정보가 담겼는지 쉽게 확인하기 위해 toString()도 생성한다.
DAO는 마찬가지로 인터페이스를 만들어서 오버라이딩 시킬 것이다. 저번에도 말했지만, 인터페이스를 활용하는 이유는 이름을 다른 팀원들과 같이 정하고 헷갈리지 않기 위해서이다.
우리가 구현할 기능은:
- 게시판 목록
- 글 보기
- 글 작성
- 글 수정
- 글 삭제
- 조회수
- 글 총 개수
package com.multi.home.board;
import java.util.List;
public interface BoardDAOInterface {
// 게시판 목록
public List<BoardVO> boardSelectAll();
// 글 보기 (조회수 선택)
public BoardVO boardSelect(int postno);
// 글 작성
public int boardPost(BoardVO vo);
// 글 수정
public int boardEdit(BoardVO vo);
// 글 삭제
public int boardDelete(int postno, String username);
// 조회수
public void hitCount(int postno);
// 글 총 개수
public int postCount();
}
위 인터페이스를 BoardDAO.java에 implement시켜서 메소드를 오버라이딩한 후 코딩하면 된다.
게시판 목록부터 만들어보자.
게시판 목록
DB에서 게시글에 대한 정보가 담긴 여러개의 ResultSet를 불러와서 차례대로 페이지에 출력해줘야하기 때문에, List컬렉션을 사용한다.
index.jsp에서 게시판으로 이동시켜주는 링크를 만들고, url매핑까지 해주자.
<a href="/webMVC/board/boardList.do">게시판</a>
/board/boardList.do=com.multi.home.board.CommandBoardList
CommandBoardList.java에서 dao.boardSelectAll()으로 게시판 목록을 DB에서 조회, dao.postCount()로 총 글 개수를 구하고 boardList.jsp로 이동시킨다.
// 게시판 목록
@Override
public List<BoardVO> boardSelectAll() {
List<BoardVO> list = new ArrayList<BoardVO>();
try {
dbConn();
sql = "SELECT postno, subject, username, hitcount, to_char(regdate, 'MM-DD HH:MI') regdate "
+ "FROM board_tbl ORDER BY postno DESC";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardVO vo = new BoardVO();
vo.setPostno(rs.getInt(1));
vo.setSubject(rs.getString("subject"));
vo.setUsername(rs.getString(3));
vo.setHitcount(rs.getInt(4));
vo.setRegdate(rs.getString(5));
list.add(vo);
}
}catch(Exception e) {
System.out.println("게시판 목록 예외");
e.printStackTrace();
}finally {
dbClose();
}
return list;
}
// 글 총개수
@Override
public int postCount() {
int postCount = 0;
try {
dbConn();
sql = "SELECT count(postno) FROM board_tbl";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()) {
postCount = rs.getInt(1);
}
}catch(Exception e) {
System.out.println("글 총 개수 예외");
e.printStackTrace();
}finally {
dbClose();
}
return postCount;
}
package com.multi.home.board;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.multi.home.CommandService;
public class CommandBoardList implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
BoardDAO dao = BoardDAO.getInstance();
// 레코드 선택
List<BoardVO> list = dao.boardSelectAll();
// 총 레코드 수
int postCount = dao.postCount();
// View페이지에서 사용할 수 있도록 DB에서 선택한 데이터를 담아놓은 List컬렉션을 req에 세팅한다
req.setAttribute("list", list);
req.setAttribute("postCount", postCount);
return "/board/boardList.jsp";
}
}
넘겨줄때 게시판 목록 데이터가 담긴 list와 postCount를 attribute로 넘겨준다.
boardList.jsp를 생성해서 게시판 목록페이지를 만들어보자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/board/boardList.jsp</title>
<link rel="stylesheet" href="/webMVC/css/style.css" type="text/css">
<style>
.head-info>div{
float:left;
width:50%;
height:50px;
background:#ddd;
line-height:50px;
}
.head-info>div:last-child{
text-align:right;
}
.board-list>li{
float:left;
width:10%;
height:40px;
line-height:40px;
border-bottom:1px solid #ddd;
}
.board-list>li:nth-child(5n+3){
width:60%;
}
.footer-menu>li{
float:left;
width:50%;
height:30px;
line-height:30px;
}
.footer-menu>li:last-child{
text-align:right;
}
</style>
</head>
<!-- CommandBoardList에서 넘어온 attribute : list, postCount -->
<body>
<div class="container">
<h1>게시판 목록</h1>
<div class="head-info">
<div>글 전체 개수 : ${ postCount }개</div>
<div>
<!-- 로그인 되어있는 경우 -->
<c:if test="${ logUsername != null && logUsername != '' }">
<a href="<%= request.getContextPath() %>/board/boardPost.do">글 쓰기</a>
</c:if>
<c:if test="${ logUsername == null || logUsername == '' }">
<a href="<%= request.getContextPath() %>/member/login.do">로그인</a>
</c:if>
</div>
</div>
<form method="get" action="<%= request.getContextPath() %>/board/boardMultiDel.do" id="delForm">
<ul class="board-list">
<li>No.</li>
<li>제목</li>
<li>작성자</li>
<li>조회수</li>
<li>등록일</li>
<c:forEach var="vo" items="${ list }">
<li>${ vo.postno }</li>
<li class="word-cut"><a href="<%= request.getContextPath() %>/board/boardView.do?postno=${ vo.postno }">${ vo.subject }</a></li>
<li>${ vo.username }</li>
<li>${ vo.hitcount }</li>
<li>${ vo.regdate }</li>
</c:forEach>
</ul>
</form>
<ul class="footer-menu">
<li><input type="button" value="삭제" id="selectDel"></li>
<li><a href="<%= request.getContextPath() %>/index.do">홈으로</a></li>
</ul>
</div>
</body>
</html>
이 단계에서 완성되어야하는 부분은 글 번호, 제목, 작성자, 조회수, 등록일 카테고리에 반복문을 통해서 list로 넘겨받은 게시글에 대한 정보를 알맞은 순서로 나타내는 것이다.
글 작성
작성할땐 단순히 데이터를 표시해주는 것이 아닌 DB에 등록하는 과정이기 때문에 단계가 하나 더 존재한다.
우선 글 작성하면서 등록할 데이터를 받을 페이지로 이동시켜서 DB에 INSERT시킨 결과에 따라서 다시 게시판 목록으로 넘겨주거나 작성 페이지로 넘겨주면 된다.
<a href="<%= request.getContextPath() %>/board/boardPost.do">글 쓰기</a>
/board/boardPost.do=com.multi.home.board.CommandBoardPost
package com.multi.home.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.multi.home.CommandService;
public class CommandBoardPost implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
return "/board/boardPost.jsp";
}
}
바로 작성 페이지로 넘겨준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- 로그인이 안 됐을때 로그인 페이지로 보내기 -->
<c:if test="${ logUsername==null || logUsername=='' }">
<script>
alert("로그인해주세요.");
location.href = "/webMVC/member/login.do"
</script>
</c:if>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/board/boardPost.jsp</title>
<link rel="stylesheet" href="/webMVC/css/style.css" type="text/css">
<style>
#subject{
width:70%;
}
#content{
width:100%;
height:200px;
}
</style>
<script>
//form의 버튼을 클릭하면 호출되는 함수
function boardFormClick(){
// 제목이 비어있을때
var subj = document.getElementById("subject");
if(document.getElementById("subject").value==""){
alert("제목을 입력하세요.");
subj.focus(); // 커서 위치 지정
return; // 함수 실행 종료
}
// 내용이 비어있을때
var content = document.getElementById("content");
if(document.getElementById("content").value==""){
alert("내용을 입력하세요.");
content.focus();
return;
}
// 모두 입력됐을때 form태그의 action지정
var form = document.getElementById("boardForm");
form.action = "/webMVC/board/boardPostOk.do";
form.submit();
}
</script>
</head>
<body>
<div class="container">
<h1>게시판 글쓰기 form</h1>
<form method="post" id="boardForm">
<ul>
<li>제목</li>
<li><input type="text" name="subject" id="subject"></li>
<li>글 내용</li>
<li>
<textarea name="content" id="content"></textarea>
</li>
<li><input type="button" value="글 등록" onclick="boardFormClick()"></li>
</ul>
</form>
</div>
</body>
</html>
이 페이지로 넘어올 때 세션에서 로그인 정보를 한 번 확인해준다.
form태그에서 글 제목, 내용을 post방식으로 submit해준다.
<input type="button" value="글 등록" onclick="boardFormClick()">
<script>
//form의 버튼을 클릭하면 호출되는 함수
function boardFormClick(){
// 제목이 비어있을때
var subj = document.getElementById("subject");
if(document.getElementById("subject").value==""){
alert("제목을 입력하세요.");
subj.focus(); // 커서 위치 지정
return; // 함수 실행 종료
}
// 내용이 비어있을때
var content = document.getElementById("content");
if(document.getElementById("content").value==""){
alert("내용을 입력하세요.");
content.focus();
return;
}
// 모두 입력됐을때 form태그의 action지정
var form = document.getElementById("boardForm");
form.action = "/webMVC/board/boardPostOk.do";
form.submit();
}
</script>
/board/boardPostOk.do=com.multi.home.board.CommandBoardPostOk
package com.multi.home.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.multi.home.CommandService;
public class CommandBoardPostOk implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 한글 인코딩하기
req.setCharacterEncoding("UTF-8");
BoardVO vo = new BoardVO();
// form의 제목, 글 내용 가져오기
vo.setSubject(req.getParameter("subject"));
vo.setContent(req.getParameter("content"));
// request의 접속자 ip
vo.setIpAddr(req.getRemoteAddr());
// 세션의 글쓴이 (logUsername)
HttpSession session = req.getSession();
vo.setUsername((String)session.getAttribute("logUsername"));
BoardDAO dao = BoardDAO.getInstance();
// View페이지에서 result
req.setAttribute("result", dao.boardPost(vo));
req.setAttribute("postno", vo.getPostno());
// return을 jsp밖에 못하기 때문에 여기에서 실행결과에 따라 나눠서 할 수 없음
// history.back()을 하지 못함
// int result = dao.boardPost(vo);
// String viewName;
// if(result>0) {
// viewName = "/board/boardList.jsp";
// }else {
// viewName = "/board/boardPostOk.jsp";
// }
return "/board/boardPostOk.jsp";
}
}
이제 CommandPostOk.java에서 DAO를 통해 글을 DB에 INSERT시킨다. 결과페이지(빈 페이지)로 넘겨줄때는 attribute로 result와 postno를 같이 넘겨주었다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- CommandBoardPostOk에서 넘어온 attribute : result, postno -->
<c:if test="${ result==0 }">
<!-- 글 등록 실패 -->
<script>
alert("글 등록 실패");
history.back();
</script>
</c:if>
<c:if test="${ result>0 }">
<!-- 글 등록 성공 location, sendRedirect -->
<script>
location.href = "/webMVC/board/boardList.do";
</script>
</c:if>
result가 0이란 뜻은 쿼리문의 실행횟수가 0번이라는 뜻으로 등록이 실패한 것이다. 이땐 뒤로가기를 실행시키고,
성공했을시에는 다시 게시판 목록으로 보내준다.
글 보기
글 작성을 했으니 목록에서 제목을 클릭하면 내용을 볼 수 있는 페이지를 만들자.
<li class="word-cut"><a href="<%= request.getContextPath() %>/board/boardView.do?postno=${ vo.postno }">${ vo.subject }</a></li>
/board/boardView.do=com.multi.home.board.CommandBoardView
하이퍼링크 주소에 게시글의 고유번호 postno를 parameter로 넘겨주어야 정확히 해당 글을 조회할 수 있다.
package com.multi.home.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.multi.home.CommandService;
public class CommandBoardView implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
int postno = Integer.parseInt(req.getParameter("postno"));
BoardDAO dao = BoardDAO.getInstance();
dao.hitCount(postno);
BoardVO vo = dao.boardSelect(postno);
req.setAttribute("vo", vo);
return "/board/boardView.jsp";
}
}
// 조회수
@Override
public void hitCount(int postno) {
try {
dbConn();
sql = "UPDATE board_tbl SET hitcount=hitcount+1 WHERE postno=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, postno);
pstmt.executeUpdate();
}catch(Exception e) {
System.out.println("조회수 예외");
e.printStackTrace();
}finally {
dbClose();
}
}
// 글 보기 - postno에 해당하는 데이터 선택
@Override
public BoardVO boardSelect(int postno) {
BoardVO vo = new BoardVO();
try {
dbConn();
sql = "SELECT postno, subject, username, content, hitcount, regdate "
+ "FROM board_tbl WHERE postno=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, postno);
rs = pstmt.executeQuery();
if(rs.next()) {
vo.setPostno(rs.getInt(1));
vo.setSubject(rs.getString(2));
vo.setUsername(rs.getString(3));
vo.setContent(rs.getString(4));
vo.setHitcount(rs.getInt(5));
vo.setRegdate(rs.getString(6));
}
}catch(Exception e) {
System.out.println("글 보기 예외");
e.printStackTrace();
}finally {
dbClose();
}
return vo;
}
parameter로 넘겨받은 글의 고유번호 postno를 선언해주어서 dao.hitCount()로 조회수를 올리고, dao.boardSelect()로 글의 데이터를 받아온다. 그 다음에 글 내용을 보여주는 페이지로 이동하자. 여기서 attribute는 vo이다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- CommandBoardView에서 넘어온 attribute : vo -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/board/boardView.jsp</title>
<link rel="stylesheet" href="/webMVC/css/style.css" type="text/css">
<script>
function confirmDelete(){
if(confirm("정말로 삭제하시겠습니까?")){
location.href = "<%= request.getContextPath() %>/board/boardDelete.do?postno=${ vo.postno }";
}
}
</script>
</head>
<body>
<div class="container">
<h1>글 내용 보기</h1>
<ul>
<li>No.</li>
<li>${ vo.postno }</li>
<li>작성자</li>
<li>${ vo.username }</li>
<li>조회수</li>
<li>${ vo.hitcount }</li>
<li>등록일</li>
<li>${ vo.regdate }</li>
<li>제목</li>
<li>${ vo.subject }</li>
<li>글 내용</li>
<li>${ vo.content }</li>
</ul>
<div>
<c:if test="${ logUsername==vo.username }">
<a href="<%= request.getContextPath() %>/board/boardEdit.do?postno=${ vo.postno }">수정</a>
<a href="javascript:confirmDelete()">삭제</a>
</c:if>
<a href="<%= request.getContextPath() %>/board/boardList.do">목록</a>
</div>
</div>
</body>
</html>
게시글 수정/삭제
글을 클릭해서 들어왔을때 만약 내가 작성자 본인이라면 글을 수정하고 삭제할 수 있어야한다.
그 버튼들을 만들어주고 각각 컨트롤러로 보내주자.
<a href="<%= request.getContextPath() %>/board/boardEdit.do?postno=${ vo.postno }">수정</a>
<a href="javascript:confirmDelete()">삭제</a>
/board/boardEdit.do=com.multi.home.board.CommandBoardEdit
/board/boardEditOk.do=com.multi.home.board.CommandBoardEditOk
/board/boardDelete.do=com.multi.home.board.CommandBoardDelete
수정하는 방식은 작성하는 방식과 유사할 수 밖에 없다. 다만 한 가지 다른 점은 글 내용을 넘겨받아서 텍스트박스에 미리 가져다놔야한다는 점이다. 그렇기 때문에 고유번호 vo.postno를 parameter로 넘겨주었다.
package com.multi.home.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.multi.home.CommandService;
public class CommandBoardEdit implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
int postno = Integer.parseInt(req.getParameter("postno"));
BoardDAO dao = BoardDAO.getInstance();
BoardVO vo = dao.boardSelect(postno);
req.setAttribute("vo", vo);
return "/board/boardEdit.jsp";
}
}
PRIMARY KEY로 지정된 글 고유번호 postno를 넘겨받아서 글에 대한 정보를 선택한 다음, 수정 페이지의 form태그 안에 넣어준다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- CommandBoardEdit에서 넘어온 attribute : vo -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/board/boardEdit.jsp</title>
<link rel="stylesheet" href="/webMVC/css/style.css" type="text/css">
<style>
#subject{
width:70%;
}
#content{
width:100%;
height:200px;
}
</style>
<script>
//form의 버튼을 클릭하면 호출되는 함수
function boardEditFormCheck(){
// 제목이 비어있을때
var subj = document.getElementById("subject");
if(document.getElementById("subject").value==""){
alert("제목을 입력하세요.");
subj.focus(); // 커서 위치 지정
return false; // 함수 실행 종료
}
// 내용이 비어있을때
var content = document.getElementById("content");
if(document.getElementById("content").value==""){
alert("내용을 입력하세요.");
content.focus();
return false;
}
return true;
// 모두 입력됐을때 form태그의 action지정
/* var form = document.getElementById("boardEditForm");
form.action = "/webMVC/board/boardEditOk.do";
form.submit(); */
}
</script>
</head>
<body>
<div class="container">
<h1>게시판 수정하기 form</h1>
<form method="post" action="/webMVC/board/boardEditOk.do" onsubmit="return boardEditFormCheck()"> <!-- id="boardEditForm" -->
<input type="hidden" name="postno" value="${ vo.postno }">
<ul>
<li>제목</li>
<li><input type="text" name="subject" id="subject" value="${ vo.subject }"></li>
<li>글 내용</li>
<li>
<textarea name="content" id="content">${ vo.content }</textarea>
</li>
<li>
<!--
submit 기능을 가지고 있는 태그
<input type="submit">
<button>
<input type="image">
-->
<button>글 수정</button>
<!-- <input type="button" value="글 수정" onclick="boardEditFormClick()"> -->
<input type="image" src="/webMVC/img/google.gif">
<input type="reset" value="초기화">
<input type="button" value="취소" onclick="history.back()">
</li>
</ul>
</form>
</div>
</body>
</html>
추가로 초기화 버튼과 취소 버튼을 추가했다.
초기화를 누르면 수정하기 전 상태로 돌아가고, 취소하면 뒤로가기를 실행했다.
이제 실행 결과페이지로 넘겨주자.
package com.multi.home.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.multi.home.CommandService;
public class CommandBoardEditOk implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
BoardVO vo = new BoardVO();
vo.setPostno(Integer.parseInt(req.getParameter("postno")));
vo.setSubject(req.getParameter("subject"));
vo.setContent(req.getParameter("content"));
BoardDAO dao = BoardDAO.getInstance();
req.setAttribute("result", dao.boardEdit(vo));
req.setAttribute("postno", vo.getPostno());
return "/board/boardEditOk.jsp";
}
}
// 글 수정
@Override
public int boardEdit(BoardVO vo) {
int result = 0;
try {
dbConn();
sql = "UPDATE board_tbl SET subject=?, content=?, hitcount=hitcount-1 WHERE postno=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, vo.getSubject());
pstmt.setString(2, vo.getContent());
pstmt.setInt(3, vo.getPostno());
result = pstmt.executeUpdate();
}catch(Exception e) {
System.out.println("글 수정 예외");
e.printStackTrace();
}finally {
dbClose();
}
return result;
}
글 작성 메소드인 boardPost()와 다른 한 가지는 조회수를 일부터 하나 깎았다는 것이다. 나중에 글 내용 보기로 넘겨줄 것인데, 이 과정에서 조회수가 하나 올라가기 때문이다.
attribute로는 쿼리 실행횟수인 result와 고유번호 postno를 가지고 결과페이지로 이동하자.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- CommandBoardEditOk에서 넘어온 attribute : result, postno -->
<c:if test="${ result==0 }">
<!-- 글 수정 실패 -->
<script>
alert("글 수정 실패");
history.back();
</script>
</c:if>
<c:if test="${ result>0 }">
<!-- 글 수정 성공 location, sendRedirect -->
<script>
location.href = "/webMVC/board/boardView.do?postno=${ postno }";
</script>
</c:if>
글 작성과 거의 동일하다. 대신 목록으로 보내주기보단, 수정결과를 바로 확인할 수 있게 글 내용보기로 보내준다. 물론 고유번호 postno도 parameter로 같이 보낸다.
삭제하는 건 따로 입력받을 데이터가 없기 때문에 단계가 하나 줄었다.
바로 컨트롤러로 보내주기 전에 정말로 삭제할 것인지 브라우저에서 확인할 것이다.
<script>
function confirmDelete(){
if(confirm("정말로 삭제하시겠습니까?")){
location.href = "<%= request.getContextPath() %>/board/boardDelete.do?postno=${ vo.postno }";
}
}
</script>
<a href="javascript:confirmDelete()">삭제</a>
package com.multi.home.board;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.multi.home.CommandService;
public class CommandBoardDelete implements CommandService {
@Override
public String process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
// 파라미터로 넘어온 postno 선언
int postno = Integer.parseInt(req.getParameter("postno"));
// 세션에 저장된 로그인 정보 중 logUsername 가져오기
HttpSession session = req.getSession();
String username = (String)session.getAttribute("logUsername");
BoardDAO dao = BoardDAO.getInstance();
req.setAttribute("result", dao.boardDelete(postno, username));
return "/board/boardDelete.jsp";
}
}
// 글 삭제
@Override
public int boardDelete(int postno, String username) {
int result = 0;
try {
dbConn();
sql = "DELETE FROM board_tbl WHERE postno=? AND username=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, postno);
pstmt.setString(2, username);
result = pstmt.executeUpdate();
}catch(Exception e) {
System.out.println("글 삭제 예외");
e.printStackTrace();
}finally {
dbClose();
}
return result;
}
삭제하는 사용자가 글의 주인임을 쿼리문에서 한 번 확인하고나서 삭제를 진행한다. 그러기 위해서 HttpSession에서 아이디 정보를 가져와서 dao.boardDelete()를 실행한다.
attribute로는 쿼리 실행 횟수만 넘겨주면 된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!-- CommandBoardDelete에서 넘어온 attribute : result -->
<c:if test="${ result==0 }">
<!-- 글 삭제 실패 -->
<script>
alert("글 삭제 실패");
history.back();
</script>
</c:if>
<c:if test="${ result>0 }">
<!-- 글 삭제 성공 location, sendRedirect -->
<script>
location.href = "/webMVC/board/boardList.do";
</script>
</c:if>
삭제 성공하면 목록으로 보내준다.