웹_프론트_백엔드/JAVA프레임윅기반_풀스택

2020.06.03

shine94 2020. 6. 3. 09:00

[어제 배우던 게시글 그대로 삭제와 수정 기능 추가]

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