JSP/MVC_BBS
BBSController.java
GAWON
2023. 6. 16. 17:42
package org.joonzis.controller;
import java.io.*;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 javax.servlet.http.HttpSession;
import org.joonzis.model.Paging;
import org.joonzis.service.BBSService;
import org.joonzis.service.BBSServiceImpl;
import org.joonzis.service.CommentService;
import org.joonzis.service.CommentServiceImpl;
import org.joonzis.vo.BVO;
import org.joonzis.vo.CVO;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
@WebServlet("/BBSController")
public class BBSController extends HttpServlet {
private static final long serialVersionUID = 1L;
public BBSController() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
String realPath = request.getServletContext().getRealPath("/upload");
MultipartRequest mr = null;
String cmd = request.getParameter("cmd");
if(cmd == null) {
mr = new MultipartRequest(
request,
realPath,
1024*1024*10, // 바이트 단위(1024=1KB) (1024KB=1MB)
"utf-8",
new DefaultFileRenamePolicy()
// 동일한 이름의 파일이 업로드되면 어떤 방식으로 저장할 것인지
// 기본 값 : 파일 뒤에 번호를 붙임
);
cmd = mr.getParameter("cmd");
}
String resultCmd = "allList";
if(cmd != null && !cmd.isEmpty()) {
resultCmd = cmd;
}
// 단순 화면 이동 / 데이터 사용 구분
boolean forwardCheck = false;
// 이동 경로 path
String path = "";
BBSService bservice = new BBSServiceImpl();
CommentService cservice = new CommentServiceImpl();
String currentPage = "";
String open = null;
HttpSession session = request.getSession();
String b_idx = "";
BVO bvo = null;
CVO cvo = null;
switch(cmd) {
//-----------단순 화면 이동---------------
// 삽입 화면 이동
case "insert_page":
forwardCheck = true;
path = "bbs/insert_page.jsp";
break;
//-----------데이터 사용---------------
// 전체 목록 가져오기
case "allList" :
Paging pvo = new Paging();
pvo.setTotalRecord(bservice.recordCount());
pvo.setTotalPage();
currentPage = request.getParameter("currentPage");
if(currentPage != null && !currentPage.isEmpty()){
pvo.setNowPage(Integer.parseInt(currentPage));
}
pvo.setBegin( (pvo.getNowPage()-1) * pvo.getRecordPerPage() + 1);
pvo.setEnd(pvo.getBegin() + pvo.getRecordPerPage() - 1);
int begin = pvo.getBegin();
int end = pvo.getEnd();
Map<String, Integer> map = new HashMap<>();
map.put("begin", begin);
map.put("end", end);
List<BVO> list = bservice.getBBSList(map);
request.setAttribute("list", list);
/******* 페이징 처리를 위한 block 계산 ********/
pvo.setBeginBlock( (pvo.getNowPage()-1) / pvo.getPagePerBlock() * pvo.getPagePerBlock() + 1);
pvo.setEndBlock(pvo.getBeginBlock() + pvo.getPagePerBlock() - 1);
if(pvo.getEndBlock() > pvo.getTotalPage()){
pvo.setEndBlock(pvo.getTotalPage());
}
request.setAttribute("pvo", pvo);
open = (String)session.getAttribute("open");
if(open != null){
session.removeAttribute("open");
}
path = "bbs/allList.jsp";
forwardCheck = true;
break;
// 상세 페이지
case "view" :
b_idx = request.getParameter("b_idx");
currentPage = request.getParameter("currentPage");
bvo = bservice.getBBS(Integer.parseInt(b_idx));
open = (String)session.getAttribute("open");
if(open == null){
session.setAttribute("open", "yes");
int hit = bvo.getHit() + 1;
bvo.setHit(hit);
bservice.getUpdateHit(bvo);
}
// 수정, 삭제를 위해서 session에 bvo를 저장
session.setAttribute("bvo", bvo);
session.setAttribute("currentPage", currentPage);
List<CVO> cList = cservice.getCommentList(bvo.getB_idx());
request.setAttribute("cList", cList);
forwardCheck = true;
path = "bbs/view.jsp";
break;
// 데이터 삽입
case "insertBBS" :
bvo = new BVO();
bvo.setWriter(mr.getParameter("writer"));
bvo.setPw(mr.getParameter("pw"));
bvo.setTitle(mr.getParameter("title"));
bvo.setContent(mr.getParameter("content"));
//bvo.setIp(request.getRemoteAddr()); // IPv6
bvo.setIp(Inet4Address.getLocalHost().getHostAddress()); // IPv4
// 첨부파일 유무에 따라서 filename 값을 결정하자
if(mr.getFile("filename") != null){
bvo.setFilename(mr.getFilesystemName("filename"));
}else{
bvo.setFilename("");
}
int result = bservice.getInsertBBS(bvo);
request.setAttribute("result", result);
forwardCheck = true;
path = "bbs/insert.jsp";
break;
case "download":
String folderPath = request.getParameter("path"); // 폴더 명
String filename = request.getParameter("filename"); // 파일 명
// 다운로드 받을 수 있는 문서 타입으로 설정하기
response.setContentType("application/x-msdownload");
// 파일 클래스(파일 스트림)를 통해 다운로드 할 파일 연결하기
File file = new File(realPath + "/" + filename); // new File("경로 + 파일명");
// 파일 이름에 공백이 있을 경우 "+" 로 출력되는 부분 수정
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replaceAll("\\+", "%20");
// 클라이언트의 헤더 정보에 첨부파일이 있음을 처리
response.setHeader("Content-Disposition", "attachment; filename=" + filename + ";");
response.setHeader("Content-Length", file.length() + "");
// 실제 다운로드 하기
FileInputStream fis = null;
BufferedInputStream bis = null; // 서버에 저장된 파일을 읽어들이는 스트림
BufferedOutputStream bos = null; // 클라이언트에 파일을 작성할 버퍼스트림
try{
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(response.getOutputStream());
/*
// 1. 하나씩 (int) 다운로드 받기
int n;
while((n = bis.read()) != -1){ // read()가 -1을 리턴하면 읽어 들인 파일을 모두 읽었다!(파일의 끝이 -1을 리턴함)
bos.write(n);
bos.flush(); // flush(): 버퍼에 남은 모든 것을 밀어낸다.
}
*/
// 2. 전체 다운로드 받기
byte[] buffer = new byte[(int)file.length()]; // 파일의 크기와 같은 버퍼 준비
bis.read(buffer, 0, buffer.length); // 버퍼 전체를 읽어들인다.
bos.write(buffer);
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
if( bos != null) { bos.close();}
if( bis != null) { bis.close();}
} catch(Exception e){
e.printStackTrace();
}
}
break;
case "removeBBS":
b_idx = request.getParameter("b_idx");
// 댓글있는지 확인
result = cservice.commentCountByIdx(Integer.parseInt(b_idx));
if(result > 0) {
// 댓글이 달려있는 게시글은 댓글을 먼저 삭제
cservice.removeCommentAll(Integer.parseInt(b_idx));
}
result = bservice.removeBBS(Integer.parseInt(b_idx));
request.setAttribute("result", result);
forwardCheck = true;
path = "bbs/remove.jsp";
break;
case "insertComment":
cvo = new CVO();
cvo.setWriter(request.getParameter("writer"));
cvo.setPw(request.getParameter("pw"));
cvo.setContent(request.getParameter("content"));
cvo.setB_idx(Integer.parseInt(request.getParameter("b_idx")));
//cvo.setIp(request.getRemoteAddr()); // IPv6
cvo.setIp(Inet4Address.getLocalHost().getHostAddress()); // IPv4
cservice.insertComment(cvo);
request.setAttribute("b_idx", request.getParameter("b_idx"));
forwardCheck = true;
path = "bbs/insertComment.jsp";
break;
case "removeComment" :
cservice.removeComment(Integer.parseInt(request.getParameter("c_idx")));
request.setAttribute("b_idx", request.getParameter("b_idx"));
forwardCheck = true;
path = "bbs/removeComment.jsp";
break;
case "updatePage":
path = "bbs/update_page.jsp";
break;
case "update":
bvo = new BVO();
bvo.setB_idx(Integer.parseInt(mr.getParameter("b_idx")));
bvo.setTitle(mr.getParameter("title"));
bvo.setContent(mr.getParameter("content"));
//bvo.setIp(request.getRemoteAddr()); // IPv6
bvo.setIp(Inet4Address.getLocalHost().getHostAddress()); // IPv4
File newfile = mr.getFile("filename"); // 새 첨부 파일 (newfile)
String oldfile = mr.getParameter("oldfile"); // 기존 첨부 파일(oldfile)
if(newfile != null){ // 새 첨부 파일 O
if(oldfile != null){ // 기존 첨부 파일 O
File removeFile = new File(realPath + "/" + oldfile);
if(removeFile.exists()){ // 기존 첨부 파일 유무 확인
removeFile.delete(); // 기존 첨부 파일 삭제
}
}
bvo.setFilename(newfile.getName()); // 새 첨부 파일 이름 가져오기
}else{ // 새 첨부 파일 X
if(oldfile != null){ // 기존 첨부 파일 O
bvo.setFilename(oldfile);
}else{
bvo.setFilename(""); // 새 첨부 파일 X, 기존 첨부 파일 X
}
}
bservice.updateBBS(bvo);
request.setAttribute("b_idx", bvo.getB_idx());
forwardCheck = true;
path ="bbs/update.jsp";
break;
}
if(forwardCheck) {
request.getRequestDispatcher(path).forward(request, response);
}else {
response.sendRedirect(path);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}