[어제 배우던 게시글 그대로 삭제와 수정 기능 추가]
1. 삭제
: 글 수정을 구현하기 앞서 글 삭제부터 만들어 두면 좋다.
** 글 삭제시 삭제해야할 두 가지
1) 물리적으로 저장된 파일
2) DB 에 저장된 첨부파일 정보
: 이는 DDL에서 ON DELETE CASCADE로 설정하여 처리됨
** common > D.java
package com.lec.beans;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
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 javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import common.D;
// DAO : Data Access Object
// DB 에 접속하여 트랜잭션을 수행하는 객체
// 다루는 데이터 소스의 종류에 따라 DAO는 여러개 정의 사용 가능
public class FileDAO {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // SELECT 결과, executeQuery()
// DAO 객체가 생성될때 Connection 도 생성된다.
public FileDAO() {
try {
Class.forName(D.DRIVER);
conn = DriverManager.getConnection(D.URL, D.USERID, D.USERPW);
System.out.println("WriteDAO 생성, 데이터 베이스 연결!");
} catch(Exception e) {
e.printStackTrace();
// throw e;
}
} // 생성자
// DB 자원 반납 메소드,
public void close() throws SQLException {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} // end close()
// 뷰를 하기 위해 준비
// createArray, selectFilesByWrUid, selectByUid
// ResultSet --> DTO 배열로 리턴
public FileDTO[] createArray(ResultSet rs) throws SQLException {
FileDTO[] arr = null;
List<FileDTO> list = new ArrayList<FileDTO>();
while(rs.next()){
int uid = rs.getInt("bf_uid");
String source = rs.getString("bf_source");
String file = rs.getString("bf_file");
FileDTO dto = new FileDTO(uid, source, file);
list.add(dto);
} // end while()
arr = new FileDTO[list.size()];
list.toArray(arr);
return arr;
} // end createArray()
// 특정 글 (wr_uid) 의 첨부파일(들) SELECT
public FileDTO [] selectFilesByWrUid(int wrUid) throws SQLException{
FileDTO [] arr = null;
try {
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT);
pstmt.setInt(1, wrUid);
rs = pstmt.executeQuery();
arr = createArray(rs);
} finally {
close();
}
return arr;
} // end selectFilesByWrUid
// 특정 파일(bf_uid)의 첨부파일 하나 SELECT
public FileDTO[] selectByUid(int uid) throws SQLException {
FileDTO [] arr = null;
try {
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT_BY_UID);
pstmt.setInt(1, uid);
rs = pstmt.executeQuery();
arr = createArray(rs);
} finally {
close();
}
return arr;
} // end selectByUid
// 특정 글(wr_uid)의 첨부파일(들) 삭제
// DB 삭제, 파일 삭제
public int deleteByWrUid(int wrUid, HttpServletRequest request) throws SQLException {
int cnt = 0;
FileDTO[] arr = null;
try {
// 1. 물리적인 파일 삭제
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT);
pstmt.setInt(1, wrUid);
rs = pstmt.executeQuery();
arr = createArray(rs);
// 물리적인 경로
ServletContext context = request.getServletContext();
String saveDirectory = context.getRealPath("upload");
for(FileDTO dto : arr) {
File f = new File(saveDirectory, dto.getFile());
System.out.println("삭제시도--> " + f.getAbsolutePath());
if(f.exists()) {
if(f.delete()) { // 삭제!
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
} else {
System.out.println("파일이 존재하지 않습니다.");
} // end if
} // end for
// 2. test_file 테이블 삭제
pstmt.close();
rs.close();
pstmt = conn.prepareStatement(D.SQL_FILE_DELETE_BY_WRUID);
pstmt.setInt(1, wrUid);
cnt = pstmt.executeUpdate();
System.out.println("첨부파일 " + cnt + " 개 삭제");
} finally {
close();
}
return cnt;
} // end deleteByWrUid()
} // end DAO
** com.lec.beans > FileDAO.java
: 삭제 뿐만 아니라 수정 부분도 반영됨
package com.lec.beans;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
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 javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import common.D;
// DAO : Data Access Object
// DB 에 접속하여 트랜잭션을 수행하는 객체
// 다루는 데이터 소스의 종류에 따라 DAO는 여러개 정의 사용 가능
public class FileDAO {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // SELECT 결과, executeQuery()
// DAO 객체가 생성될때 Connection 도 생성된다.
public FileDAO() {
try {
Class.forName(D.DRIVER);
conn = DriverManager.getConnection(D.URL, D.USERID, D.USERPW);
System.out.println("WriteDAO 생성, 데이터 베이스 연결!");
} catch(Exception e) {
e.printStackTrace();
// throw e;
}
} // 생성자
// DB 자원 반납 메소드,
public void close() throws SQLException {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} // end close()
// 뷰를 하기 위해 준비
// createArray, selectFilesByWrUid, selectByUid
// ResultSet --> DTO 배열로 리턴
public FileDTO[] createArray(ResultSet rs) throws SQLException {
FileDTO[] arr = null;
List<FileDTO> list = new ArrayList<FileDTO>();
while(rs.next()){
int uid = rs.getInt("bf_uid");
String source = rs.getString("bf_source");
String file = rs.getString("bf_file");
FileDTO dto = new FileDTO(uid, source, file);
list.add(dto);
} // end while()
arr = new FileDTO[list.size()];
list.toArray(arr);
return arr;
} // end createArray()
// 특정 글 (wr_uid) 의 첨부파일(들) SELECT
public FileDTO [] selectFilesByWrUid(int wrUid) throws SQLException{
FileDTO [] arr = null;
try {
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT);
pstmt.setInt(1, wrUid);
rs = pstmt.executeQuery();
arr = createArray(rs);
} finally {
close();
}
return arr;
} // end selectFilesByWrUid
// 특정 파일(bf_uid)의 첨부파일 하나 SELECT
public FileDTO[] selectByUid(int uid) throws SQLException {
FileDTO [] arr = null;
try {
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT_BY_UID);
pstmt.setInt(1, uid);
rs = pstmt.executeQuery();
arr = createArray(rs);
} finally {
close();
}
return arr;
} // end selectByUid
// 특정 글(wr_uid)의 첨부파일(들) 삭제
// DB 삭제, 파일 삭제
public int deleteByWrUid(int wrUid, HttpServletRequest request) throws SQLException {
int cnt = 0;
FileDTO[] arr = null;
try {
// 1. 물리적인 파일 삭제
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT);
pstmt.setInt(1, wrUid);
rs = pstmt.executeQuery();
arr = createArray(rs);
// 물리적인 경로
ServletContext context = request.getServletContext();
String saveDirectory = context.getRealPath("upload");
for(FileDTO dto : arr) {
File f = new File(saveDirectory, dto.getFile());
System.out.println("삭제시도--> " + f.getAbsolutePath());
if(f.exists()) {
if(f.delete()) { // 삭제!
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
} else {
System.out.println("파일이 존재하지 않습니다.");
} // end if
} // end for
// 2. test_file 테이블 삭제
pstmt.close();
rs.close();
pstmt = conn.prepareStatement(D.SQL_FILE_DELETE_BY_WRUID);
pstmt.setInt(1, wrUid);
cnt = pstmt.executeUpdate();
System.out.println("첨부파일 " + cnt + " 개 삭제");
} finally {
close();
}
return cnt;
} // end deleteByWrUid()
// 여러 개의 bf_uid의 파일(들) 제거
public int deleteByUid(int[] uids, HttpServletRequest request) throws SQLException {
if(uids == null || uids.length == 0) {return 0;}
int cnt = 0;
// 101, 204, 319번 파일을 지울려면?
// DELETE FROM test_file WHERE bf_uid = 101 OR bf_uid = 204 OR bf_uid = 319
// DELETE FROM test_file WHERE bf_uid IN (101, 204, 319)
try {
// 1. 물리적인 파일 삭제
// 물리적인 파일 먼저 삭제하는 이유는 테이블에 물리적이 파일 주소가 있기 때문에
// 테이블 먼저 삭제하면 물리적인 파일 주소를 소실하게 된다..!!
// 물리적인 주소를 소실하면 실질적으로 파일 삭제가 어렵기 때문에 물리적인 파일 먼저 삭제 후 테이블을 삭제한다
StringBuffer sql = new StringBuffer("SELECT bf_file FROM test_file WHERE bf_uid IN(");
for(int uid : uids) {
sql.append(uid + ",");
}
// 맨 마지막에 붙어 있는 콤마 삭제
sql.deleteCharAt(sql.lastIndexOf(","));
// 마지막 소괄호 닫기 추가
sql.append(")");
stmt = conn.createStatement();
stmt.executeQuery(sql.toString());
// 물리적인 경로 획득
ServletContext context = request.getServletContext();
String saveDirectory = context.getRealPath("upload");
while(rs.next()) {
String fileName = rs.getString("bf_file"); // 삭제할 파일명
File f = new File(saveDirectory, fileName);
System.out.println("삭제시도--> " + f.getAbsolutePath());
if(f.exists()) {
if(f.delete()) { // 삭제!
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
} else {
System.out.println("파일이 존재하지 않습니다.");
} // end if
}
// 2. test_file 테이블 삭제
sql = new StringBuffer("DELETE FORM test_file WHERE bf_uid IN(");
for(int uid : uids) {
sql.append(uid + ",");
}
// 맨 마지막에 붙어 있는 콤마 삭제
sql.deleteCharAt(sql.lastIndexOf(","));
// 마지막 소괄호 닫기 추가
sql.append(")");
System.out.println("파일 삭제 : " + sql);
cnt = stmt.executeUpdate(sql.toString());
} finally {
close();
}
return cnt;
} // end deleteByUid()
// 특정 글(wr_uid)에 첨부파일들 추가
public int insert(int wrUid,
List<String> originalFileNames,
List<String> fileSystemNames) throws SQLException {
int cnt = 0;
// 첨부파일 정보 추가(저장)하기
pstmt = conn.prepareStatement(D.SQL_FILE_INSERT);
for(int i = 0; i < originalFileNames.size(); i++) {
pstmt.setString(1, originalFileNames.get(i));
pstmt.setString(2, fileSystemNames.get(i));
pstmt.setInt(3, wrUid);
cnt += pstmt.executeUpdate();
} // end for
return cnt;
} // end insert()
} // end DAO
** com.command.write > DeleteCommand.java
package com.command.write;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lec.beans.FileDAO;
import com.lec.beans.WriteDAO;
public class DeleteCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
int cnt = 0;
WriteDAO dao = new WriteDAO();
FileDAO fileDao = new FileDAO();
//입력한 값을 받아오기
int uid = Integer.parseInt(request.getParameter("uid"));
try {
// 첨부파일 삭제
// 1. 물리적인 파일 삭제
// 2. test_file 테이블 삭제
fileDao.deleteByWrUid(uid, request);
// 3. 글 삭제
cnt = dao.deleteByUid(uid);
} catch (SQLException e) {
e.printStackTrace();
}
request.setAttribute("result", cnt);
}
}
2. 글 수정
: 삭제될 bf_uid 값(들)이 서버에 전달 필요,
새로운 파일 추가 가능(update도 multipart request 로 진행)
** com.lec.beans > FileDAO.java
: 삭제 뿐만 아니라 수정 부분도 반영됨
package com.lec.beans;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
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 javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import common.D;
// DAO : Data Access Object
// DB 에 접속하여 트랜잭션을 수행하는 객체
// 다루는 데이터 소스의 종류에 따라 DAO는 여러개 정의 사용 가능
public class FileDAO {
Connection conn = null;
Statement stmt = null;
PreparedStatement pstmt = null;
ResultSet rs = null; // SELECT 결과, executeQuery()
// DAO 객체가 생성될때 Connection 도 생성된다.
public FileDAO() {
try {
Class.forName(D.DRIVER);
conn = DriverManager.getConnection(D.URL, D.USERID, D.USERPW);
System.out.println("WriteDAO 생성, 데이터 베이스 연결!");
} catch(Exception e) {
e.printStackTrace();
// throw e;
}
} // 생성자
// DB 자원 반납 메소드,
public void close() throws SQLException {
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} // end close()
// 뷰를 하기 위해 준비
// createArray, selectFilesByWrUid, selectByUid
// ResultSet --> DTO 배열로 리턴
public FileDTO[] createArray(ResultSet rs) throws SQLException {
FileDTO[] arr = null;
List<FileDTO> list = new ArrayList<FileDTO>();
while(rs.next()){
int uid = rs.getInt("bf_uid");
String source = rs.getString("bf_source");
String file = rs.getString("bf_file");
FileDTO dto = new FileDTO(uid, source, file);
list.add(dto);
} // end while()
arr = new FileDTO[list.size()];
list.toArray(arr);
return arr;
} // end createArray()
// 특정 글 (wr_uid) 의 첨부파일(들) SELECT
public FileDTO [] selectFilesByWrUid(int wrUid) throws SQLException{
FileDTO [] arr = null;
try {
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT);
pstmt.setInt(1, wrUid);
rs = pstmt.executeQuery();
arr = createArray(rs);
} finally {
close();
}
return arr;
} // end selectFilesByWrUid
// 특정 파일(bf_uid)의 첨부파일 하나 SELECT
public FileDTO[] selectByUid(int uid) throws SQLException {
FileDTO [] arr = null;
try {
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT_BY_UID);
pstmt.setInt(1, uid);
rs = pstmt.executeQuery();
arr = createArray(rs);
} finally {
close();
}
return arr;
} // end selectByUid
// 특정 글(wr_uid)의 첨부파일(들) 삭제
// DB 삭제, 파일 삭제
public int deleteByWrUid(int wrUid, HttpServletRequest request) throws SQLException {
int cnt = 0;
FileDTO[] arr = null;
try {
// 1. 물리적인 파일 삭제
pstmt = conn.prepareStatement(D.SQL_FILE_SELECT);
pstmt.setInt(1, wrUid);
rs = pstmt.executeQuery();
arr = createArray(rs);
// 물리적인 경로
ServletContext context = request.getServletContext();
String saveDirectory = context.getRealPath("upload");
for(FileDTO dto : arr) {
File f = new File(saveDirectory, dto.getFile());
System.out.println("삭제시도--> " + f.getAbsolutePath());
if(f.exists()) {
if(f.delete()) { // 삭제!
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
} else {
System.out.println("파일이 존재하지 않습니다.");
} // end if
} // end for
// 2. test_file 테이블 삭제
pstmt.close();
rs.close();
pstmt = conn.prepareStatement(D.SQL_FILE_DELETE_BY_WRUID);
pstmt.setInt(1, wrUid);
cnt = pstmt.executeUpdate();
System.out.println("첨부파일 " + cnt + " 개 삭제");
} finally {
close();
}
return cnt;
} // end deleteByWrUid()
// 여러 개의 bf_uid의 파일(들) 제거
public int deleteByUid(int[] uids, HttpServletRequest request) throws SQLException {
if(uids == null || uids.length == 0) {return 0;}
int cnt = 0;
// 101, 204, 319번 파일을 지울려면?
// DELETE FROM test_file WHERE bf_uid = 101 OR bf_uid = 204 OR bf_uid = 319
// DELETE FROM test_file WHERE bf_uid IN (101, 204, 319)
try {
// 1. 물리적인 파일 삭제
// 물리적인 파일 먼저 삭제하는 이유는 테이블에 물리적이 파일 주소가 있기 때문에
// 테이블 먼저 삭제하면 물리적인 파일 주소를 소실하게 된다..!!
// 물리적인 주소를 소실하면 실질적으로 파일 삭제가 어렵기 때문에 물리적인 파일 먼저 삭제 후 테이블을 삭제한다
StringBuffer sql = new StringBuffer("SELECT bf_file FROM test_file WHERE bf_uid IN(");
for(int uid : uids) {
sql.append(uid + ",");
}
// 맨 마지막에 붙어 있는 콤마 삭제
sql.deleteCharAt(sql.lastIndexOf(","));
// 마지막 소괄호 닫기 추가
sql.append(")");
stmt = conn.createStatement();
stmt.executeQuery(sql.toString());
// 물리적인 경로 획득
ServletContext context = request.getServletContext();
String saveDirectory = context.getRealPath("upload");
while(rs.next()) {
String fileName = rs.getString("bf_file"); // 삭제할 파일명
File f = new File(saveDirectory, fileName);
System.out.println("삭제시도--> " + f.getAbsolutePath());
if(f.exists()) {
if(f.delete()) { // 삭제!
System.out.println("삭제 성공");
} else {
System.out.println("삭제 실패");
}
} else {
System.out.println("파일이 존재하지 않습니다.");
} // end if
}
// 2. test_file 테이블 삭제
sql = new StringBuffer("DELETE FORM test_file WHERE bf_uid IN(");
for(int uid : uids) {
sql.append(uid + ",");
}
// 맨 마지막에 붙어 있는 콤마 삭제
sql.deleteCharAt(sql.lastIndexOf(","));
// 마지막 소괄호 닫기 추가
sql.append(")");
System.out.println("파일 삭제 : " + sql);
cnt = stmt.executeUpdate(sql.toString());
} finally {
close();
}
return cnt;
} // end deleteByUid()
// 특정 글(wr_uid)에 첨부파일들 추가
public int insert(int wrUid,
List<String> originalFileNames,
List<String> fileSystemNames) throws SQLException {
int cnt = 0;
// 첨부파일 정보 추가(저장)하기
pstmt = conn.prepareStatement(D.SQL_FILE_INSERT);
for(int i = 0; i < originalFileNames.size(); i++) {
pstmt.setString(1, originalFileNames.get(i));
pstmt.setString(2, fileSystemNames.get(i));
pstmt.setInt(3, wrUid);
cnt += pstmt.executeUpdate();
} // end for
return cnt;
} // end insert()
} // end DAO
** com.command.write > SelectCommand.java
package com.command.write;
import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lec.beans.FileDAO;
import com.lec.beans.FileDTO;
import com.lec.beans.WriteDAO;
import com.lec.beans.WriteDTO;
public class SelectCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
WriteDAO dao = new WriteDAO();
WriteDTO [] arr = null;
// 첨부파일 정보도 update 화면에 보여주어야 한다.
FileDAO fileDao = new FileDAO();
FileDTO[] fileArr = null;
int uid = Integer.parseInt(request.getParameter("uid")); // 매개변수 검증 필요
try {
arr = dao.selectByUid(uid); // 읽기 only
request.setAttribute("list", arr);
if(arr != null && arr.length == 1) {
fileArr = fileDao.selectFilesByWrUid(uid);
request.setAttribute("file", fileArr);
}
} catch (SQLException e) { // 만약 ConnectionPool 을 사용한다면 여기서 NamingException 도 catch 해야 한다
e.printStackTrace();
}
} // end execute
} // end SelectCommand
** update.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="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:choose>
<c:when test="${empty list || fn:length(list) == 0}">
<script>
alert("해당 정보가 삭제되거나 없습니다");
history.back();
</script>
</c:when>
<c:otherwise>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>수정 ${list[0].subject}</title>
</head>
<script>
function chkSubmit(){
frm = document.forms['frm'];
var subject = frm['subject'].value.trim();
if(subject == ""){
alert("제목은 반드시 작성해야 합니다");
frm['subject'].focus();
return false;
}
return true;
}
</script>
<body>
<h2>수정</h2>
<form name="frm" action="updateOk.do" method="post" onsubmit="return chkSubmit()"
enctype="Multipart/form-data"><%-- 수정 단계에서 파일 추가 가능, Multipart request --%>
<input type="hidden" name="uid" value="${list[0].uid}"/>
작성자 : ${list[0].name}<br> <%-- 작성자 이름 변경 불가 --%>
제목 :
<input type="text" name="subject" value="${list[0].subject}"/><br>
내용: <br>
<textarea name="content">${list[0].content}</textarea>
<br>
<%-- 첨부파일 목록 (삭제대상) --%>
<c:if test="${fn:length(file) > 0 }">
<div style="background-color: beige; padding: 2px 10px; margin-bottom: 5px; border: 1px solid black;">
<h4>첨부파일 - 삭제할 것에 체크하세요</h4>
<div id="delFiles"></div>
<c:forEach var="element" items="${file }">
<div>
<button type="button" onclick="deleteFiles(${element.uid}); $(this).parent().remove();">삭제</button>${element.source }
</div>
</c:forEach>
</div>
</c:if>
<script>
function deleteFiles(fileUid){
// 삭제할 file 의 bf_uid 값(들)을 delfile 에 담아 submit 한다.
$("#delFiles").append("<input type='hidden' name='delfile' value='" + fileUid + "'>");
}
</script>
<%-- 첨부파일 (추가) --%>
<div style="background-color: beige; padding: 2px 10px; margin-bottom: 5px; border: 1px solid black;">
<h4>첨부파일</h4>
<button type="button" id="btnAdd">추가</button>
<div id='files'></div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
var i = 0;
$("#btnAdd").click(function(){
$("#files").append("<div><input type='file' name='upfile" + i + "'/><button type='button' onclick='$(this).parent().remove()'>삭제</button></div>");
i++;
});
</script>
<input type="submit" value="수정"/>
</form>
</c:otherwise>
</c:choose>
<button onclick="history.back()">이전으로</button>
<button onclick="location.href='list.do'">목록보기</button>
</body>
</html>
** com.command.write > UpdateCommand.java
package com.command.write;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.lec.beans.FileDAO;
import com.lec.beans.WriteDAO;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.oreilly.servlet.multipart.FileRenamePolicy;
public class UpdateCommand implements Command {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
int cnt = 0;
WriteDAO dao = new WriteDAO();
FileDAO fileDao = new FileDAO(); // 첨부파일
//-------------------------------------------------
// 1. 업로드 파일(들)
ServletContext context = request.getServletContext();
String saveDirectory = context.getRealPath("upload");
int maxPostSize = 5 * 1024 * 1024;
String encoding = "utf-8";
FileRenamePolicy policy = new DefaultFileRenamePolicy();
MultipartRequest multi = null;
try {
multi = new MultipartRequest(
request,
saveDirectory,
maxPostSize,
encoding,
policy
);
} catch (IOException e1) {
e1.printStackTrace();
}
List<String> originalFileNames = new ArrayList<String>();
List<String> fileSystemNames = new ArrayList<String>();
Enumeration names = multi.getFileNames(); // type="file"요소의 name들 추출
while(names.hasMoreElements()) {
String name = (String)names.nextElement();
String originalFileName = multi.getOriginalFileName(name);
String fileSystemName = multi.getFilesystemName(name);
System.out.println("첨부파일 : " + originalFileName + " -> " + fileSystemName);
if(originalFileName != null && fileSystemName != null) {
originalFileNames.add(originalFileName);
fileSystemNames.add(fileSystemName);
}
} // end while()
//-------------------------------------------------
// 2. 삭제될 첨부파일(들)
String [] delFiles = multi.getParameterValues("delfile");
if(delFiles != null && delFiles.length > 0) { // 삭제 대상의 파일이 있다면
int [] delFileUids = new int[delFiles.length];
for(int i = 0; i < delFileUids.length; i++) {
delFileUids[i] = Integer.parseInt(delFiles[i]);
}
try {
fileDao.deleteByUid(delFileUids, request); // 물리적 삭제 + DB 테이블 삭제
} catch (SQLException e) {
e.printStackTrace();
}
} // end if
//-------------------------------------------------
// 3. 입력한 값을 받아오기 --> 글 수정
int uid = Integer.parseInt(multi.getParameter("uid")); // ★ MultipartRequest 객체에서 가져온다
String subject = multi.getParameter("subject");
String content = multi.getParameter("content");
// 유효성 체크 null 이거나, 빈문자열이면 이전화면으로 돌아가기
if(subject != null && subject.trim().length() > 0){
try {
cnt = dao.update(uid, subject, content);
} catch (SQLException e) {
e.printStackTrace();
}
} // end if
//-------------------------------------------------
// 추가된 첨부파일(들)
// 추가된 첨부파일(들)
fileDao = new FileDAO();
try {
fileDao.insert(uid, originalFileNames, fileSystemNames);
} catch(SQLException e) {
e.printStackTrace();
}
request.setAttribute("uid", uid); // Multipart로 받은 뒤 updateOk.jsp로 넘겨야 함.
request.setAttribute("result", cnt);
}
}
** updateOk.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:choose>
<c:when test="${result == 0}">
<script>
alert('수정 실패');
history.back();
</script>
</c:when>
<c:otherwise>
<script>
alert('수정 성공');
// 내부함수 param을 사용하면 uid 값을 받아 올 수 있음...!!
location.href = "view.do?uid=${uid}"; <%-- 업데이트 수정후 view.do로 이동을 위해 수정 --%>
</script>
</c:otherwise>
</c:choose>
'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글
2020.06.08 (0) | 2020.06.08 |
---|---|
2020.06.05 (0) | 2020.06.05 |
2020.06.02 (0) | 2020.06.02 |
2020.06.01 (0) | 2020.06.01 |
2020.05.28 (0) | 2020.05.28 |