Controller
package kr.or.ddit.controller.noticeboard.web;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.ServiceResult;
import kr.or.ddit.controller.noticeboard.service.INoticeService;
import kr.or.ddit.vo.NoticeVO;
@Controller
@RequestMapping("/notice")
public class NoticeModifyController {
@Inject
private INoticeService noticeService;
// 수정하기 폼으로 이동
@RequestMapping(value="/update.do", method = RequestMethod.GET)
public String noticeModifyForm(int boNo, Model model) {
NoticeVO noticeVO = noticeService.selectNotice(boNo);
model.addAttribute("notice", noticeVO);
model.addAttribute("status", "u");
return "notice/form";
}
// 수정하기 처리 메소드
@RequestMapping(value="/update.do", method = RequestMethod.POST)
public String noticeModify(NoticeVO noticeVO, Model model) {
String goPage = "";
ServiceResult result = noticeService.updateNotice(noticeVO);
if(result.equals(ServiceResult.OK)) {
goPage = "redirect:/notice/detail.do?boNo=" + noticeVO.getBoNo();
}else {
model.addAttribute("message", "수정에 실패하였습니다!");
model.addAttribute("noticeVO", noticeVO);
model.addAttribute("status", "u");
goPage = "notice/form";
}
return goPage;
}
**// 삭제하는 메소드**
@RequestMapping(value="/delete.do", method = RequestMethod.POST)
public String noticeDelete(
HttpServletRequest req,
int boNo, Model model) {
String goPage = "";
ServiceResult result = null;
result = noticeService.deleteNotice(req, boNo);
if(result.equals(ServiceResult.OK)) {
goPage = "redirect:/notice/list.do";
}else {
model.addAttribute("message", "서버오류, 다시시도해주세요!");
goPage = "redirect:/notice/detail.do?boNo=" + boNo;
}
return goPage;
}
}
Service
package kr.or.ddit.controller.noticeboard.service;
import javax.inject.Inject;
import org.apache.commons.io.input.TaggedInputStream;
import org.springframework.stereotype.Service;
import kr.or.ddit.ServiceResult;
import kr.or.ddit.controller.noticeboard.web.TelegramSendController;
import kr.or.ddit.mapper.NoticeMapper;
import kr.or.ddit.vo.NoticeVO;
@Service
public class NoticeServiceImpl implements INoticeService {
@Inject
private NoticeMapper noticeMapper;
TelegramSendController tst = new TelegramSendController();
@Override
public ServiceResult insertNotice(NoticeVO noticeVO) {
ServiceResult result = null;
int status = noticeMapper.insertNotice(noticeVO);
if(status > 0) {
// 성공 했다는 메시지를 텔레그램 BOT API를 이용하여 알림!
try {
tst.sendGet("조성희", noticeVO.getBoTitle());
} catch (Exception e) {
e.printStackTrace();
}
result = ServiceResult.OK;
}else {
result = ServiceResult.FAILED;
}
return result;
}
@Override
public NoticeVO selectNotice(int boNo) {
noticeMapper.incrementHit(boNo); //조회수 증가
return noticeMapper.selectNotice(boNo);
}
@Override
public ServiceResult updateNotice(NoticeVO noticeVO) {
ServiceResult result = null;
int status = noticeMapper.updateNotice(noticeVO);
if(status > 0) { // 성공
result = ServiceResult.OK;
}else {
result = ServiceResult.FAILED;
}
return result;
}
**//삭제하기 서비스**
@Override
public ServiceResult deleteNotice(HttpServletRequest req, int boNo) {
ServiceResult result = null;
// 아래에서 boNo에 해당하는 파일 데이터를 삭제할때사용할 객체(noticeVO)
NoticeVO noticeVO = noticeMapper.selectNotice(boNo);
// 본체인 notice를 삭제하기 전에 File 데이터를먼저 삭제하기 위한 요청
noticeMapper.deleteNoticeFileByBoNo(boNo);
int status = noticeMapper.deleteNotice(boNo);
if(status > 0) { // 성공
// 파일 데이터를 완벽하게 삭제처리하면 끝
List<NoticeFileVO> noticeFileList = noticeVO.getNoticeFileList();
if(noticeFileList != null && noticeFileList.size() > 0) {
// D:\\A_TeachingMaterial\\6_JspSpring\\02.SPRING2\\workspace_spring2\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\DevProject\\resources\\notice\\15/
// 67820991-f1eb-4a29-b4b8-c38770dff9c9_스타벅스.txt
// '/'를 기준으로 잘라진다.
String[] filePath = noticeFileList.get(0).getFileSavepath().split("/");
// \\resources\\notice\\{bo_no}/... 형태를 알고 있기에 filePath[0]로 설정 가능
String path = filePath[0];
deleteFolder(req, path);
}
result = ServiceResult.OK;
}else {
result = ServiceResult.FAILED;
}
return result;
}
**// 폴더 삭제를 위한 메소드**
public static void deleteFolder(HttpServletRequest req, String path) {
File folder = new File(path);
if(folder.exists()) {
File[] fileList = folder.listFiles();
for (int i = 0; i < fileList.length; i++) {
if(fileList[i].isFile()) { // 폴더안의 있는 파일이 파일일때
// 폴더 안에 파일을 차례대로 삭제
fileList[i].delete();
}else { // 폴더 안에 있는 파일이 폴더 일때 재귀함수 호춣 (폴더안으로 들어갈라고)
deleteFolder(req, fileList[i].getPath());
}
}
folder.delete(); // 폴더 삭제(boNo에 해당하는 폴더를 삭제)
}
}
}
Mapper
package kr.or.ddit.mapper;
import kr.or.ddit.vo.NoticeVO;
public interface NoticeMapper {
public int insertNotice(NoticeVO noticeVO);
public void incrementHit(int boNo);
public NoticeVO selectNotice(int boNo);
public int updateNotice(NoticeVO noticeVO);
**public int deleteNotice(int boNo);
public void deleteNoticeFileByBoNo(int boNo);**
}
NoticeMapper (SQL)
<?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="kr.or.ddit.mapper.NoticeMapper">
<!-- 공지사항 등록하는 쿼리 -->
<insert id="insertNotice" parameterType="noticeVO" useGeneratedKeys="true">
<selectKey keyProperty="boNo" resultType="int" order="BEFORE">
select seq_notice.nextval from dual
</selectKey>
insert into notice(
bo_no, bo_title, bo_content, bo_writer, bo_date
)values(
#{boNo}, #{boTitle}, #{boContent}, #{boWriter}, sysdate
)
</insert>
<!-- 조회수 증가 쿼리 -->
<update id="incrementHit" parameterType="int">
update notice
set
bo_hit = bo_hit + 1
where bo_no = #{boNo}
</update>
<!-- 상세보기 쿼리 -->
<select id="selectNotice" parameterType="int" resultType="noticeVO">
select
bo_no, bo_title, bo_content, bo_writer,
to_char(bo_date, 'yy-mm-dd hh24:mi:ss') bo_date, bo_hit
from notice
where bo_no = #{boNo}
</select>
<!-- 수정하기 쿼리 -->
<update id="updateNotice" parameterType="noticeVO">
update notice
set
bo_title = #{boTitle},
bo_content = #{boContent},
bo_date = sysdate
where bo_no = #{boNo}
</update>
**<!-- 삭제하기 쿼리 -->**
<delete id="deleteNotice" parameterType="int">
delete from notice
where bo_no = #{boNo}
</delete>
**<!-- 해당 게시판 번호에 대한 파일 데이터 삭제 -->**
<delete id="deleteNoticeFileByBoNo" parameterType="int">
delete from noticefile
where bo_no = #{boNo}
</delete>
</mapper>
JSP 페이지
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="<http://tiles.apache.org/tags-tiles>" prefix="tiles" %>
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Simple Tables</title>
<link rel="stylesheet" href="<https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback>">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/plugins/fontawesome-free/css/all.min.css">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/dist/css/adminlte.min.css">
<script src="${pageContext.request.contextPath }/resources/plugins/jquery/jquery.min.js"></script>
<script src="${pageContext.request.contextPath }/resources/ckeditor/ckeditor.js"></script>
</head>
<c:if test="${not empty message }">
<script type="text/javascript">
alert("${message}");
<c:remove var="message" scope="request"/>
<c:remove var="message" scope="session"/>
</script>
</c:if>
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<!-- header 영역 -->
<tiles:insertAttribute name="header"/>
<div class="content-wrapper">
<!-- content 영역 -->
<tiles:insertAttribute name="content"/>
</div>
<!-- footer 영역 -->
<tiles:insertAttribute name="footer"/>
<aside class="control-sidebar control-sidebar-dark">
</aside>
</div>
<script src="${pageContext.request.contextPath }/resources/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="${pageContext.request.contextPath }/resources/dist/js/adminlte.min.js"></script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c" %>
<!-- Content Header (Page header) -->
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>공지사항 상세보기</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">DDIT HOME</a></li>
<li class="breadcrumb-item active">공지사항 상세보기</li>
</ol>
</div>
</div>
</div>
<!-- /.container-fluid -->
</section>
<!-- Main content -->
<section class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-12">
<div class="card card-primary">
<div class="card-header">
<h3 class="card-title">${notice.boTitle }</h3>
<div class="card-tools">${notice.boWriter } ${notice.boDate } ${notice.boHit }</div>
</div>
<form id="quickForm" novalidate="novalidate">
<div class="card-body">${notice.boContent }</div>
<div class="card-footer bg-white">
<ul class="mailbox-attachments d-flex align-items-stretch clearfix">
<c:if test="${not empty notice.noticeFileList }">
<c:forEach items="${notice.noticeFileList }" var="noticeFile" varStatus="vs">
<li>
<span class="mailbox-attachment-icon">
<i class="far fa-file-pdf"></i>
</span>
<div class="mailbox-attachment-info">
<a href="#" class="mailbox-attachment-name">
<i class="fas fa-paperclip"></i> ${noticeFile.fileName }
</a>
<span class="mailbox-attachment-size clearfix mt-1">
<span>${noticeFile.fileFancysize }</span>
<c:url value="/notice/download.do" var="downloadURL">
<c:param name="fileNo" value="${noticeFile.fileNo }"/>
</c:url>
<a href="${downloadURL }">
<span class="btn btn-default btn-sm float-right">
<i class="fas fa-download"></i>
</span>
</a>
</span>
</div>
</li>
</c:forEach>
</c:if>
</ul>
</div>
<div class="card-footer">
<button type="button" id="btnList" class="btn btn-primary">목록</button>
<button type="button" id="btnModify" class="btn btn-info">수정</button>
<button type="button" id="btnDelete" class="btn btn-danger">삭제</button>
</div>
</form>
</div>
</div>
<form action="/notice/delete.do" method="post" id="noticeForm">
<input type="hidden" name="boNo" value="${notice.boNo }">
</form>
<div class="col-md-6"></div>
</div>
</div>
</section>
<script>
$(function(){
var btnList = $("#btnList");
var btnModify = $("#btnModify");
var btnDelete = $("#btnDelete");
var noticeForm = $("#noticeForm");
// 목록 버튼 클릭 시 이벤트
btnList.on("click", function(){
location.href = "/notice/list.do"
});
// 수정 버튼 클릭 시 이벤트
btnModify.on("click", function(){
noticeForm.attr("method", "get");
noticeForm.attr("action", "/notice/update.do");
noticeForm.submit();
});
// 삭제 버튼 클릭 시 이벤트
btnDelete.on("click", function(){
if(confirm("정말 삭제하시겠습니까?")){
noticeForm.submit();
}
});
});
</script>
해당 15번의 게시글을 삭제하기 하면