Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

WON.dev

BBSController.java 본문

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);
	}

}

'JSP > MVC_BBS' 카테고리의 다른 글

CDaoImpl.java  (0) 2023.06.16
CDao.java  (0) 2023.06.16
BDaoImpl.java  (0) 2023.06.16
BDao.java  (0) 2023.06.16
MemberController.java  (0) 2023.06.16