list.jsp
<%@page import="dto.GuestbookMessage"%>
<%@page import="java.util.List"%>
<%@page import="service.GetMessageListService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
//list.jsp에서 메시지 목록(List<GuestbookMessage>)을 가져와주는 서비스 로직
GetMessageListService messageListService =
GetMessageListService.getInstance();
List<GuestbookMessage> list = messageListService.getMessageList();
%>
<!-- 위에 자바의 세계를 jsp세계로 불러오기 / list는 db에 저장된 값-->
<c:set var="list" value="<%=list%>" />
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="/js/jquery-3.6.0.js"></script>
<title>방명록 메시지 목록</title>
<script type="text/javascript">
$(function(){
alert("왔다");//새로고침될때 무조건 실행됨
});
//fn_updt(기본키, 작성자, 메시지)
function fn_updt(vara, varb, varc){ //기본키를 받고
//alert(vara);
//기본키 데이터를 vara 매개변수로 받아서 frmUpdate 폼의 기본키 데이터로 사용
$("#messageId").val(vara);
//작성자 매개변수를 frmUpdate 폼의 이름 데이터로 사용
$("#guestName").val(varb);
//메시지 매개변수를 frmUpdate 폼의 내용 데이터로 사용
$("#message").val(varc);
$("#frmWrite").css("display","none");//안보이게!
$("#frmUpdate").css("display","block");//보이게!
}
</script>
</head>
<body>
<form id="frmWrite" method="post" action="writeMessage.jsp" style="display:block;">
이름: <input type="text" name="guestName" /><br />
비밀번호:<input type="password" name="password" /><br />
내용:<textarea rows="3" cols="30" name="message"></textarea><br />
<input type="submit" value="메시지 남기기" />
</form>
<form id="frmUpdate" method="post" action="updateMessage.jsp" style="display:none;">
<input type="hidden" name="messageId" id="messageId"/>
이름: <input type="text" name="guestName" id="guestName"/><br />
비밀번호:<input type="password" name="password" /><br />
내용:<textarea rows="3" cols="30" name="message" id="message"></textarea><br />
<input type="submit" value="확인" />
<input type="button" value="취소" onclick="javascript:location.href='list.jsp';" />
</form>
<hr />
<!--
[수정]
1. 클릭 시 상단의 폼에 정보가 입력되고(비밀번호 제외)
"메시지 남기기" 버튼이 hidden, "확인" 및 "취소" 버튼이 block
2. "확인" 클릭 시 해당 정보가 업데이트가 되는데, 이때 비밀번호가 일치해야 함
3. "취소" 클릭 시 현재 페이지의 목록으로 되돌아감
"메시지 남기기" 버튼이 block, "확인" 및 "취소" 버튼이 hidden
-->
<!-- //함수 수행후 기본키를 던져서 -->
<c:if test="${param.result eq 1}">
<div style="color:red;">변경 성공했습니다.</div>
</c:if>
<c:if test="${param.result < 1}">
<div style="color:red;">비밀번호를 확인해주세요.</div>
</c:if>
<table border="1">
<c:forEach var="message" items="${list}">
<tr>
<td>
메시지 번호 : <span>${message.messageId}</span><br />
손 님 이 름 : <span>${message.guestName}</span><br />
메 시 지 : <span>${message.message}</span><br />
<a href="#" id="updt" onclick="fn_updt('${message.messageId}','${message.guestName}','${message.message}')">[수정]</a>
<a href="deleteMessage.jsp?messageId=${message.messageId}">[삭제]</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
deleteMessage.jsp
<%@page import="service.ServiceException"%>
<%@page import="dto.GuestbookMessage"%>
<%@page import="service.DeleteMessageService"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
//messageId=103
String messageId = request.getParameter("messageId"); //파람을 꺼내와야됨
//vo객체 생성
GuestbookMessage message = new GuestbookMessage();
//setMessageId는 int형인데 위에 string으로 되어있음 -> 형변환 해주기
message.setMessageId(Integer.parseInt(messageId));
//삭제 성공 여부(성공으로 세팅)
boolean result = true;
//삭제된 건수
int cnt = 0;
try{
DeleteMessageService service = DeleteMessageService.getInstance(); //객체 생성
cnt = service.delete(message);
}catch(ServiceException ex){//받아!!
//실패 처리
result = false;
}
%>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<title>방명록 메시지 삭제</title>
<body>
<%
if(result){//result : true일때 삭제가 잘 된 경우
if(cnt>0){//삭제가 잘 된경우
out.print("메시지를 삭제하였습니다.");
}else{//기본키에 해당되는 데이터가 없을 경우
out.print("해당 데이터가 없습니다.");
}
}else{//result : false
out.print("삭제가 되지 않았습니다.");
}
%>
<br />
<a href="list.jsp">[목록 보기]</a>
</body>
</html>
DeleteMessageService.java
package service;
import java.sql.Connection;
import java.sql.SQLException;
import dao.MessageDao;
import dto.GuestbookMessage;
import jdbc.ConnectionProvider;
import jdbc.JdbcUtil;
public class DeleteMessageService {
//ps. 참고로 슬기언니는 바보야
private static DeleteMessageService instance =
new DeleteMessageService();
public static DeleteMessageService getInstance() {
return instance;
}
private DeleteMessageService() {}
//jsp에서 message를 받아와서 사용해야함
public int delete(GuestbookMessage message) {
//conn객체가 필요함
Connection conn = null;
try {
conn = ConnectionProvider.getConnection();
MessageDao messageDao = MessageDao.getInstance();
int result = messageDao.delete(conn, message);
return result;
//result가 0이면 삭제 실패 1이면 삭제 성공
}catch(SQLException ex) {
//삭제 시 문제가 발생되면 롤백 처리
//DC(control)L : commit, rollback(마지막 커밋 시점으로 돌아가는 것)
//-> 기존 트랜잭션이 종료가되는 동시에 새로운 트랜잭션이 시작되는것
//-> 트랜잭션이란? DB를 변경하기 위해 수행되어야할 논리적 단위(여러개의 sql로 구성)
JdbcUtil.rollback(conn);
throw new ServiceException("삭제 실패", ex); //(메시지, 이유): 던져 !!
}finally {
JdbcUtil.close(conn);
}
}
}
MessageDao.java
//삭제 : conn과 message를 파람으로( 연결 / 삭제 대상)
// ? = message.getMessageId()
public int delete(Connection conn, GuestbookMessage message){
//pstmt 준비해주고
PreparedStatement pstmt = null;
try {
// con이랑 pstmt연결해주공
pstmt = conn.prepareStatement(
"DELETE FROM GUESTBOOK_MESSAGE" +
" WHERE MESSAGE_ID = ?"
);
//?세팅하기 : MESSAGE_ID자료형이 number형이라 int로 하기
pstmt.setInt(1, message.getMessageId());//가져와서 ?에 세팅
return pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return 0;
}finally {
JdbcUtil.close(pstmt);
}
}