Java/JSP

JSP 기초(File) - AWS 풀스택 과정 63일차

awspspgh 2024. 10. 24. 18:18
목차
1. File

 

1. File

첨부파일 라이브러리 추가
commons-fileupload-1.4.jar
commons-io-2.11.0.jar
thumbnailator-0.4.17.jar

 

▣ sqlFile.sql

create table board(
  bno int auto_increment,
  title varchar(500) not null,
  writer varchar(100) not null,
  content text,
  regdate datetime default now(),
  moddate datetime default now(),
  primary key(bno));
  
  -- 2024.10.23
  -- 댓글(comment)
  create table comment(
  cno int auto_increment,
  bno int not null,
  content varchar(2000) not null,
  writer varchar(500) default "unknown",
  regdate datetime default now(),
  primary key(cno));
  
  -- 10.24
  -- 조회수
  alter table board add column readCount int default 0;
  
  -- 파일
  alter table board add imageFile varchar(500);

 

▣ BoardVO.java

package domain;

public class BoardVO {
	private int bno;
	private String title;
	private String writer;
	private String content;
	private String regdate;
	private String moddate;
	private int readCount;
	private String imageFile;
	
	public BoardVO() {}

	// insert : title, writer, content
	public BoardVO(String title, String writer, String content) {
		this.title = title;
		this.writer = writer;
		this.content = content;
	}

	// list : bno, title, writer, regdate
	public BoardVO(int bno, String title, String writer, String regdate, int readCount) {
		this.bno = bno;
		this.title = title;
		this.writer = writer;
		this.regdate = regdate;
	}

	// update : bno, title, content
	public BoardVO(int bno, String title, String content) {
		super();
		this.bno = bno;
		this.title = title;
		this.content = content;
	}

	// detail : 전부
	public BoardVO(int bno, String title, String writer, String content, String regdate, String moddate, int readCount, String imageFile) {
		this.bno = bno;
		this.title = title;
		this.writer = writer;
		this.content = content;
		this.regdate = regdate;
		this.moddate = moddate;
		this.readCount = readCount;
		this.imageFile = imageFile;
	}

	public int getBno() {
		return bno;
	}

	public void setBno(int bno) {
		this.bno = bno;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getRegdate() {
		return regdate;
	}

	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}

	public String getModdate() {
		return moddate;
	}

	public void setModdate(String moddate) {
		this.moddate = moddate;
	}
	
	public int getReadCount() {
		return readCount;
	}

	public void setReadCount(int readCount) {
		this.readCount = readCount;
	}

	public String getImageFile() {
		return imageFile;
	}

	public void setImageFile(String imageFile) {
		this.imageFile = imageFile;
	}

	@Override
	public String toString() {
		return "BoardVO [bno=" + bno + ", title=" + title + ", writer=" + writer + ", content=" + content + ", regdate="
				+ regdate + ", moddate=" + moddate + ", readCount=" + readCount + ", imageFile=" + imageFile + "]";
	}

}

 

▣ BoardController.java

package controller;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import domain.BoardVO;
import handler.FileRemoveHandler;
import net.coobird.thumbnailator.Thumbnails;
import service.BoardService;
import service.BoardServiceImpl;


@WebServlet("/brd/*")
public class BoardController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	// 로그 객체 생성
	private static final Logger log = LoggerFactory.getLogger(BoardController.class);
    // jsp에서 받은 요청을 처리, 그 결과를 다른 jsp로 보내는 역할을 하는 객체
	private RequestDispatcher rdp;
	private String destPage; // 응답할 jsp의 주소를 저장하는 변수
	private int isOk; // db 구문 체크값 저장 변수
	private BoardService bsv; // interface로 생성(service package에)
	private String savePath; // 파일 저장 경로
 
    public BoardController() {
    	// 생성자
    	bsv = new  BoardServiceImpl(); // class로 생성(service package에) bsv 구현체 연결
    }


	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 실제 get post 요청처리
		log.info("log 객체 test");
		
		// request, response 객체의 인코딩 설정
		request.setCharacterEncoding("utf-8"); // 요청 객체
		response.setCharacterEncoding("utf-8"); // 응답 객체
		// response는 jsp로 갈 응답 객체 => 화면을 생성해서 응답 => jsp 형식으로...
		// contentType="text/html; charset=UTF-8"
		response.setContentType("text/html; charset=UTF-8"); // html5 형식으로 보내라
		
		// 경로 가져오기 /brd/register
		String uri = request.getRequestURI();
		log.info(uri); // /brd/register
		
		String path = uri.substring(uri.lastIndexOf("/")+1);
		log.info(path);
		
		switch(path) {
		case "register": 
			// 정보가 필요하다면... 정보를 DB에서 요청 request 객체 살고 보내기
			destPage = "/board/register.jsp";
			break;
		case "insert":
			try {
				log.info("insert case in~!!");
				// 첨부파일 없을 경우 처리
				// jsp 화면에서 보내온 파라미터 값을 저장 => Service 전송
//				String title = request.getParameter("title");
//				String writer = request.getParameter("writer");
//				String content = request.getParameter("content");
//				BoardVO bvo = new BoardVO(title, writer, content);
//				log.info(">>>>> bvo insert 객체 >>>>> {}", bvo);
				
				
				// 첨부파일 있는 경우 처리
				// byo를 구성하여 DB로 전송
				// file을 저장하는 작업 => 파일 이름만 imageFile에 저장
				// 첨부파일 형식으로 들어오게되면 모든 파라미터는 바이트단위로 분해되서 전송
				// 바이트 단위로 전송된 파라미터의 값을 String으로 조립을 해야함.
				
				// 1. 파일을 업로드할 물리적인 경로 설정
				savePath = getServletContext().getRealPath("/_fileUpload");
				log.info(">>> savePath > {}", savePath);
				
				File fileDir = new File(savePath);
				DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
				// 파일 저장을 위한 임시 메모리 설정
				fileItemFactory.setSizeThreshold(1024*1024*3);
				// 저장 위치를 담은 File 객체
				fileItemFactory.setRepository(fileDir);
				
				BoardVO bvo = new BoardVO(); // 빈 객체 생성 후 set
				
				// multipart/form-data 형식으로 넘어온 requst 객체를 다루기 쉽게 변환해주는 객체
				ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
				// request 객체를 FileItem 형식의 리스트로 리턴
				List<FileItem> itemList = fileUpload.parseRequest(request);
				// title, writer, content => text(String) imageFile => image
				for(FileItem item : itemList) {
					log.info("fileItem >> {}", item.toString());
					switch(item.getFieldName()) {
					case "title":
						bvo.setTitle(item.getString("utf-8"));
						break;
					case "writer":
						bvo.setWriter(item.getString("utf-8"));
						break;
					case "content":
						bvo.setContent(item.getString("utf-8"));
						break;
					case "imageFile":
						// 이미지 파일 여부를 체크
						if(item.getSize() > 0) {
							// 파일 이름 추출
							// 경로 + ~~~/dog.jpg
							String fileName = item.getName();
							// 경로 빼고 이름만 가져오기
							// String fileNmae2 = item.getName().substring(item.getName().lastIndexOf(File.separator)+1);
							// File.separator : 파일경로 기호 => 운영체제마다 다를 수 있어서 자동 변환
							// 시스템의 시간을 이용하여 파일을 구분 / 시간_dog.jpg
							// UUID를 사용하는 구분도 있음. (=> 많이 사용)
							fileName = System.currentTimeMillis()+"_"+fileName;
							
							// 아까 경로 만들어 놓은 파일 fileDir + / + fileName
							File uploadFilePath = new File(fileDir+File.separator+fileName);
							log.info(">>> uploadFilePath > {}", uploadFilePath.toString());
							
							// 저장
							try {
								item.write(uploadFilePath); // 객체를 디스크에 쓰기
								bvo.setImageFile(fileName); // bvo에 저장할 값 (DB에 들어가는 값)
								
								// 썸네일 작업 : 리스트 페이지에서 트레픽 과다 사용 방지
								// fileDir + / +_th_ + fileName
								Thumbnails.of(uploadFilePath).size(75, 75).toFile(new File(fileDir+File.separator+"_th_"+fileName));
								
							} catch (Exception e) {
								log.info(">> file writer on disk error");
								e.printStackTrace();
							}
						}
						break;
					}
				}
				isOk = bsv.register(bvo);
				log.info(">>> bco insert"+(isOk > 0 ? "성공":"실패"));
				
				// 처리 후 목적지
				destPage="/index.jsp";
				
			} catch (Exception e) {
				log.info("insert error!!");
				e.printStackTrace();
			}
			break;
		case "list": 
			try {
				// 전체 리스트를 가지고 list.jsp로 전달
				List<BoardVO> list = bsv.getList();
				log.info(">>> list >>> {}", list);
				// request 객체에 파라미터로 값을 보내는 방법
				request.setAttribute("list", list);
				destPage = "/board/list.jsp";
			} catch (Exception e) {
				log.info("list error!!");
				e.printStackTrace();
			}
			break;
		case "detail": case "modify":
			try {
				int bno = Integer.parseInt(request.getParameter("bno"));
				// readCount 반영 (case가 detail일 경우만...)
				if(path.equals("detail")) {
					int readCount = bsv.readCount(bno);
					log.info(">>>>> detail readCount >>>>> {}", readCount);
				}
				BoardVO bvo = bsv.getDetail(bno);
				log.info(">>>>> detail bvo >>>>> {}", bvo);
				request.setAttribute("bvo", bvo);
//				if(path.equals("detail")) {
//					destPage = "/board/detail.jsp";
//				}else {
//					destPage = "/board/modify.jsp";					
//				}
				destPage = "/board/"+path+".jsp";
			} catch (Exception e) {
				log.info(""+path+"error!!");
				e.printStackTrace();
			}
			break;
		case "update":
			try {
//				int bno = Integer.parseInt(request.getParameter("bno"));
//				String title = request.getParameter("title");
//				String content = request.getParameter("content");
//				BoardVO bvo = new BoardVO(bno, title, content);
				
				// 첨부파일 처리 포함 방식
				savePath = getServletContext().getRealPath("_fileUpload");
				File fileDir = new File(savePath);
				
				DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
				fileItemFactory.setSizeThreshold(1024*1024*3); // 3MB 정도 설정
				fileItemFactory.setRepository(fileDir);
				
				BoardVO bvo = new BoardVO();
				
				ServletFileUpload fileUpload = new ServletFileUpload(fileItemFactory);
				List<FileItem> itemList = fileUpload.parseRequest(request);
				
				// 원래 이미지 파일이 있었는데 변경하는 케이스
				// 없던 이미지를 추가하는 케이스
				String old_file = null;
				
				for(FileItem item : itemList) {
					switch(item.getFieldName()) {
					case "bno" :
						 bvo.setBno(Integer.parseInt(item.getString("utf-8")));
						break;
					case "title" :
						bvo.setTitle(item.getString("utf-8"));
						break;
					case "content" :
						bvo.setContent(item.getString("utf-8"));
						break;
					case "imageFile" :
						// 기존 파일 => 있을 수도 있고, 없을 수도 있고
						old_file = item.getString("utf-8");
						break;
					case "newFile":
						// 새로 추가된 파일 => 있을 수도 있고, 없을 수도 있고
						if(item.getSize()>0) {
							if(old_file != null) {
								// 기존 파일이 있다면...
								// 파일 삭제작업 : 별도 핸들러 작업 진행
								FileRemoveHandler fileHandler = new FileRemoveHandler();
								isOk = fileHandler.deleteFile(savePath, old_file);
							}
							// 새로운 파일 등록작업
							String fileName = item.getName();
							fileName = System.currentTimeMillis()+"_"+fileName;
							
							File uploadFilePath = new File(fileDir+File.separator+fileName);
							try {
								item.write(uploadFilePath);
								bvo.setImageFile(fileName); // 파일 이름 바꾸기
								Thumbnails.of(uploadFilePath).size(75, 75).toFile(new File(fileDir+File.separator+"_th_"+fileName));
							} catch (Exception e) {
								log.info("File writer update error!!");
								e.printStackTrace();
							}
						}else {
							// 기존 파일은 있지만, 새로운 이미지 파일이 없다면...
							// 기존 객체를 담기
							bvo.setImageFile(old_file);
						}
						break;
					}
				}
				
				int isOk = bsv.update(bvo);
				log.info(">>>>> update >>>>>" +(isOk>0 ? "성공":"실패"));
//				 컨트롤러 내부 케이스는 /brd/ 따로 적을 필요가 없음
				destPage="detail?bno="+bvo.getBno();
			}catch (Exception e) {
				log.info("update error!!");
				e.printStackTrace();
			}
			break;
		case "delete":
			try {				
				int bno = Integer.parseInt(request.getParameter("bno"));
				int isOk = bsv.delete(bno);
				log.info(">>>>> delete >>>>>" +(isOk>0 ? "성공":"실패"));
				destPage="list";
			} catch(Exception e){
				log.info("delete error!!");
				e.printStackTrace();
			}
			break;
		}
		
		// 목적지 주소(destPage)로 데이터를 전달(RequestDispatcher)
		rdp = request.getRequestDispatcher(destPage);
		// 요청에 필요한 객체를 가지고 destPage에 적힌 경로로 이동
		rdp.forward(request, response);
		
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// get으로 들어오는 요청을 처리하는 메서드 => service를 호출하여 처리
		service(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// post로 들어오는 요청을 처리하는 메서드 => service를 호출하여 처리
		service(request, response);
	}

}

 

▣BoardService.java

package service;

import java.util.List;

import domain.BoardVO;

public interface BoardService {
 	
	int register(BoardVO bvo);

	List<BoardVO> getList();

	BoardVO getDetail(int bno);

	int update(BoardVO bvo);

	int delete(int bno);

	int readCount(int bno);
	
}

 

▣ BoardServiceImpl.java

package service;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import dao.BoardDAOImpl;
import dao.BoardDao;
import domain.BoardVO;

public class BoardServiceImpl implements BoardService {
	private static final Logger log = LoggerFactory.getLogger(BoardServiceImpl.class);
	// dao 연결
	private BoardDao bdao;
	
	public BoardServiceImpl() {
		bdao = new BoardDAOImpl();
	}
	
	@Override
	public int register(BoardVO bvo) {
		log.info(">>>>> register service in");
		return bdao.insert(bvo);
	}

	@Override
	public List<BoardVO> getList() {
		// TODO Auto-generated method stub
		return bdao.getList();
	}

	@Override
	public BoardVO getDetail(int bno) {
		// TODO Auto-generated method stub
		return bdao.getDetail(bno);
	}

	@Override
	public int update(BoardVO bvo) {
		// TODO Auto-generated method stub
		return bdao.update(bvo);
	}

	@Override
	public int delete(int bno) {
		// TODO Auto-generated method stub
		return bdao.delete(bno);
	}

	@Override
	public int readCount(int bno) {
		// TODO Auto-generated method stub
		return bdao.readCount(bno);
	}
}

 

▣ BoardDao.java

package dao;

import java.util.List;

import domain.BoardVO;

public interface BoardDao {

	int insert(BoardVO bvo);

	List<BoardVO> getList();

	BoardVO getDetail(int bno);

	int update(BoardVO bvo);

	int delete(int bno);

	int readCount(int bno);

}

 

▣ BoardDaoImpl.java

package dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import domain.BoardVO;
import orm.DatabaseBuilder;


public class BoardDAOImpl implements BoardDao {
	private static final Logger log = LoggerFactory.getLogger(BoardDAOImpl.class);
	// DB와 연결 => mybatis 사용하여 연결 (mybatisConfig, db연결클래스, mapper)
	
	// DB의 연결을 위한 객체
	private SqlSession sql;
	
	public BoardDAOImpl() {
		new DatabaseBuilder();
		sql = DatabaseBuilder.getFactory().openSession();
	}
	
	@Override
	public int insert(BoardVO bvo) {
		// mapper로 연결
		log.info(">>>> insert DAO in!!");
		// sql.insert(mapper의 namespace.id, 객체);
		// insert / update / delete 구문은 commit 필요
		int isOk = sql.insert("BoardMapper.add", bvo);
		if(isOk > 0) {
			sql.commit();
		}
		return isOk;
	}

	@Override
	public List<BoardVO> getList() {
		log.info(">>>> getList DAO in!!");
		return sql.selectList("BoardMapper.list");
	}

	@Override
	public BoardVO getDetail(int bno) {
		log.info(">>>>> getDetail DAO in!!");
		return sql.selectOne("BoardMapper.detail", bno);
	}

	@Override
	public int update(BoardVO bvo) {
		log.info(">>>>> update DAO in!!");
		int isOk = sql.update("BoardMapper.up", bvo);
		if(isOk > 0) sql.commit();
		return isOk;
	}

	@Override
	public int delete(int bno) {
		// TODO Auto-generated method stub
		int isOk = sql.delete("BoardMapper.del", bno);
		if(isOk > 0) sql.commit();
		return isOk;
	}

	@Override
	public int readCount(int bno) {
		int isOk = sql.update("BoardMapper.read", bno);
		if(isOk > 0) sql.commit();
		return isOk;
	}
}

 

▣ boardMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="BoardMapper">
	<!-- namespace는 daoImpl <-> mapper를 연결하기 위한 이름 -->  
	<!-- sql별 id를 생성하여 id를 통해 daoImpl이 어떤 sql 구문을 실행하는지 인지 id는 중복불가 -->
	<!-- parameterType = 매개변수의 객체타입(생략가능), resultType = 결과로 나가는 객체 -->
	<!-- 실제 SQL 구문사용 -->
	<insert id = "add" parameterType="domain.BoardVO">
	<!-- imageFile 추가 -->
	insert into board(title, writer, content, imageFile)
	values(#{title}, #{writer}, #{content}, #{imageFile})
	</insert>
	
	<select id="list" resultType="domain.BoardVO">
		select * from board order by bno desc
	</select>
	
	<select id="detail" parameterType="int" resultType="domain.BoardVO">
		select * from board where bno = #{bno}
	</select>
	
	<update id="up" parameterType="domain.BoardVO">
		update board set title = #{title}, content = #{content}, moddate = now(), imageFile = #{imageFile} where bno = #{bno}
	</update>
	
	<delete id="del" parameterType="int">
		delete from board where bno = #{bno}
	</delete>
	
	<update id="read">
		update board set readCount = readCount + 1 where bno = #{bno}
	</update>
	
  </mapper>

 

▣ register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Board Register Page</h1>
	<!-- 등록은 / 수정 post -->
	<!-- enctype = "multipart/form-data" : 첨부파일을 가져갈 때 사용하는 타입 -->
	<!-- 파일종류 : 이미지 파일만... 1개만 가능하도록 -->
	<!-- 파일종류 중 이미지 파일 : image/png, image/jpg, image/gif -->
 	<form action = "/brd/insert" method="post" enctype="multipart/form-data">
		title: <br>
		<input type="text" name="title" placeholefer="제목..."><br>
		writer: <br>
		<input type="text" name="writer" placeholder = "작성자..."><br>
		content: <br>
		<textarea rows="10" cols="50" name="content" placeholder="내용을 입력하세요."></textarea><br>
		file: <br>
		<input type="file" name="imageFile" accept="image/jpg, image/gif, image/jpeg, image/png"><br>
		<button type="submit">등록</button>
 	</form>
</body>
</html>

 

▣ list.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>Insert title here</title>
</head>
<body>
	<h1>Board List Page</h1>
	<table>
		<thead>
			<tr>
				<th>no.</th>
				<th>title</th>
				<th>writer</th>
				<th>regdate</th>
				<th>readCount</th>
			</tr>
		</thead>
		<tobody>
			<c:forEach items="${list }" var="bvo">
				<tr>
					<td>${bvo.bno }</td>
					<td><a href="/brd/detail?bno=${bvo.bno }">
					<img alt="" src="/_fileUpload/_th_${bvo.imageFile }">
					${bvo.title }</a></td>
					<td>${bvo.writer }</td>
					<td>${bvo.regdate }</td>
					<td>${bvo.readCount }</td>
				</tr>
			</c:forEach>
		</tobody>
	</table>
</body>
</html>

 

▣ detail.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>Insert title here</title>
</head>
<body>
	<h1>Board Detail Page</h1>
	<img alt="" src="/_fileUpload/${bvo.imageFile }">
	<table>
		<thead>
			<tr>
				<th>no.</th>
				<td>${bvo.bno }</td>
			</tr>
			<tr>
				<th>title</th>
				<td>${bvo.title }</td>
			</tr>
			<tr>
				<th>writer</th>
				<td>${bvo.writer }</td>
			</tr>
			<tr>
				<th>readCount</th>
				<td>${bvo.readCount }</td>
			</tr>
			<tr>
				<th>regdate</th>
				<td>${bvo.regdate }</td>
			</tr>
			<tr>
				<th>moddate</th>
				<td>${bvo.moddate }</td>
			</tr>
			<tr>
				<th>content</th>
				<td>${bvo.content }</td>
			</tr>
		</thead>
	</table>
	<a href="/brd/modify?bno=${bvo.bno }"><button type="submit">update</button></a>
	<a href="/brd/delete?bno=${bvo.bno }"><button type="submit">delete</button></a>
	<a href="/brd/list"><button type="button">list</button></a>
	
	<hr>
	<!-- comment line -->
	<div>
		<h3>Comment Line</h3>
		<input type="text" id="cmtWriter" placeholder="writer..."><br>
		<input type="text" id="cmtText" placeholder="Add Comment...">
		<button type="button" id="cmtAddBtn">post</button>
	</div>
	<br>
	<hr>
	<!-- comment print line -->
	<div id="commentLine">
		<div>
			<div>cno, bno, writer, regdate</div>
			<div>
				<button>수정</button> <button>삭제</button><br>
				<input type="text" value="content">
			</div>
		</div>
	</div>
	<script type="text/javascript">
		const bnoVal = `<c:out value="${bvo.bno }" />`;
		console.log(bnoVal);
	</script>
	
	<script type="text/javascript" src="/resources/board_detail.js"></script>
	
	<!-- 댓글 리스트 호출 -->
	<script type="text/javascript">
		printList(bnoVal);
	</script>
</body>
</html>

 

▣ modify.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>Board Modify Page</h1>
	<img alt="" src="/_fileUpload/_th_${bvo.imageFile }">
	<form action="/brd/update" method="post" enctype="multipart/form-data">
	<input type="hidden" name="bno" value="${bvo.bno }">
	<table>
		<thead>
			<tr>
				<th>no.</th>
				<td>${bvo.bno }</td>
			</tr>
			<tr>
				<th>title</th>
				<td> <input type="text" name="title" value="${bvo.title }"> </td>
			</tr>
			<tr>
				<th>writer</th>
				<td>${bvo.writer }</td>
			</tr>
			<tr>
				<th>regdate</th>
				<td>${bvo.regdate }</td>
			</tr>
			<tr>
				<th>moddate</th>
				<td>${bvo.moddate }</td>
			</tr>
			<tr>
				<th>content</th>
				<td> <textarea rows="10" cols="50" name="content">${bvo.content }</textarea> </td>
			</tr>
			<!-- 파일 변경 -->
			<tr>
				<th>imageFile</th>
				<td>
				<input type="hidden" name="imageFile" value="${bvo.imageFile } }">
				<input type="file" name="newFile" accept="image/jpg, image/gif, image/jpeg, image/png">
				</td>
			</tr>
		</thead>
	</table>
	<!-- 수정버튼을 누르면 내가 수정한 내용을 가지고(form => submit) 컨트롤러로 이동 -->	
	<button type="submit">modify commit</button>
	<!-- 리스트 버튼을 누르면 리스트페이지로 이동 -->
	<a href="/brd/list"><button type="button">list</button></a>
	</form>
</body>
</html>

 

▣ FileRemoveHandler.java

package handler;

import java.io.File;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FileRemoveHandler {
	private static final Logger log = LoggerFactory.getLogger(FileRemoveHandler.class);
	
	// savePath, imageFileName 매개변수로 받아서 파일을 삭제하는 메서드
	public int deleteFile(String savePath, String imageFileName) {
		// return 삭제 여부의 값을 리턴
		// 파일 삭제시... 경로포함파일명.delete() return true / false로 리턴
		boolean isDel = false; // 삭제가 잘 되었는지 체크 변수
		log.info(">>>> deleteFile method 접근~!! {}", imageFileName);
		
		// 기존 파일 이름 객체 생성
		File fileDir = new File(savePath);
		File removeFile = new File(fileDir+File.separator+imageFileName);
		File removeThFile = new File(fileDir+File.separator+"_th_"+imageFileName);
		
		// 파일이 존재해야 삭제
		if(removeFile.exists() || removeThFile.exists()) {
			isDel = removeFile.delete(); // 원래 파일 삭제
			log.info(">>>> removeFile !! {}", isDel);
			if(isDel) {
				isDel = removeThFile.delete();
				log.info(">>>> removeTHFile !! {}", isDel);
			}
		}
		
		return 0;
	}
}

 

▷ 출력

조회수, 파일 등록 및 수정