팀 프로젝트/Web

게시판 페이지 CKEditor 글 수정 파트 (Controller)

개발자가 되고 싶은 곰 2024. 9. 22. 17:10

이전 포스팅에서 VIEW에서 CKEditor에 글 내용을 담는 방법을 소개했습니다.

이번 포스팅에서는 Controller에서 수행한 기능에 대해 설명해보겠습니다.

 

코드

BoardUpdatePageAction.java

package controller.community;


import java.util.HashMap;
import java.util.Map;

import controller.common.Action;
import controller.common.ActionForward;
import controller.function.LoginCheck;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.board.BoardDAO;
import model.board.BoardDTO;

public class BoardUpdatePageAction implements Action {

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
		//기본으로 넘어가야하는 페이지 와 redirect 여부를 설정
		ActionForward forward = new ActionForward();
		String path = "updateEditing.jsp";
		boolean flagRedirect = false;

	      //로그인 정보가 있는지 확인해주고
	      String login[] = LoginCheck.Success(request, response);
	      //사용자 아이디
	      String member_id = login[0];
	      
		//만약 로그인 정보가 없다면
		if(member_id == null) {
			//LoginPageAction 페이지로 전달해줍니다.
			path = "LOGINPAGEACTION.do";
		}
		else {
			BoardDAO boardDAO = new BoardDAO();
			BoardDTO data = new BoardDTO();
			//사용자가 선택한 글번호를 받아서
			data.setModel_board_num(Integer.parseInt(request.getParameter("model_board_num")));
			data.setModel_board_writer_id(member_id);
			data.setModel_board_condition("BOARD_ONE_WRITER_ID");
			//model 에 전달하여 글 내용을 받아오고
			data = boardDAO.selectOne(data);
			
			//만약 데이터가 null 이라면 mypage.do 로 전달
			if(data == null) {
				path="info.jsp";
				request.setAttribute("path", "MYPAGEPAGEACTION.do");
				request.setAttribute("msg", "없는 게시글입니다.");
			}
			else {
				//해당 글 내용을 view 로 전달해줍니다.
				request.setAttribute("BOARD_NUM", data.getModel_board_num());
				request.setAttribute("BOARD_TITLE", data.getModel_board_title());
				request.setAttribute("BOARD_LOCATION", location(data.getModel_board_location()));
				
				String content = data.getModel_board_content();
				request.setAttribute("BOARD_CONTENT", content);
				
				
				HttpSession session = request.getSession();
				try {
					content = content.substring(content.lastIndexOf("img")+3).split("/")[2];
					System.out.println("BoardUpdatePageAction.java content 로그 : "+content);
					session.setAttribute("UPDATE_FOLDER_NUM", Integer.parseInt(content));
				} catch (Exception e) {
					session.setAttribute("UPDATE_FOLDER_NUM", 0);
				}
				
			}

			
		}
		
		forward.setPath(path);
		forward.setRedirect(flagRedirect);
		return forward;
	}
	
	public String location(String model_location) {
		Map<String, String> location_Map = new HashMap<String, String>();
		
		location_Map.put("서울특별시", "SEOUL");
		location_Map.put("경기도", "GYEONGGI");
		location_Map.put("인천광역시", "INCHEON");       
		location_Map.put("세종특별자치도", "SEJONG");
		location_Map.put("부산광역시", "BUSAN");
		location_Map.put("대구광역시", "DAEGU");
		location_Map.put("대전광역시", "DAEJEON");
		location_Map.put("광주광역시", "GWANGJU");
		location_Map.put("울산광역시", "ULSAN");
		location_Map.put("충청남도", "CHUNGCHEONGNAMDO");
		location_Map.put("충청북도", "CHUNGCHEONGBUKDO");
		location_Map.put("전라남도", "JEONLANAMDO");
		location_Map.put("전라북도", "JEONLABUKDO");
		location_Map.put("경상남도", "GYEONGSANGNAMDO");
		location_Map.put("경상북도", "GYEONGSANGBUKDO");
		location_Map.put("강원도", "GANGWONDO");
		location_Map.put("충청남도", "CHUNGNAM");
		
		return location_Map.getOrDefault(model_location, "SEOUL");
	}
	
}

 

 

BoardUpdateAction.java

package controller.community;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;

import controller.common.Action;
import controller.common.ActionForward;
import controller.function.CKEditorDeleteFile;
import controller.function.LoginCheck;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import model.board.BoardDAO;
import model.board.BoardDTO;

public class BoardUpdateAction implements Action {

    @Override
    public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
        // 기본으로 넘어가야하는 페이지와 redirect 여부를 설정
        ActionForward forward = new ActionForward();
        String path = "MYPAGEPAGEACTION.do"; // 마이페이지로
        boolean flagRedirect = false; // 포워드 방식

        // 로그인 정보가 있는지 확인
        String login[] = LoginCheck.Success(request, response);
        String member_id = login[0]; // 세션에 있는 사용자의 아이디
        System.out.println("로그인 확인: " + member_id);
        
        // 만약 로그인 정보가 없다면
        if (member_id == null) {
            // 로그인 페이지로 전달
            path = "LOGINPAGEACTION.do";
            
        } else {
            // 로그인이 되어있다면
            // 업데이트 가능
            String board_title = request.getParameter("VIEW_TITLE"); // 제목 받기
            String board_location = request.getParameter("VIEW_BOARD_LOCATION"); // 제목 받기
            String board_content = request.getParameter("VIEW_CONTENT"); // 내용 받기
            int board_num = Integer.parseInt(request.getParameter("VIEW_BOARD_NUM")); // 번호 받기

            System.out.println("게시글 제목: " + board_title);
            System.out.println("게시글 지역: " + board_location);
            System.out.println("게시글 작성자 ID: " + member_id);
            System.out.println("게시글 내용: " + board_content);
            System.out.println("게시글 번호: " + board_num);
			//------------------------------------------------------------------------
			//CKEditor 제거된 이미지 제거하는 로직
			//UTF-8 형식으로 보내주니 UTF-8 로 인코딩 해주고
			try {
				request.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
				System.out.println("인코딩 실패");
			}		
			//세션을 불러와서
			HttpSession session = request.getSession();
			//세션에 저장되어 있는 폴더 개수를 가져옵니다. 삼항연산자로 만약 세션값이 null이 아니라면 정수형으로 변경하여 가져오도록합니다.
			int folder_session = (session.getAttribute("UPDATE_FOLDER_NUM") != null) ? (Integer)session.getAttribute("UPDATE_FOLDER_NUM"):0;
			
			//View에서 보내준 내용 확인합니다.
			System.out.println(board_content);
			//세션에 있는 값이 0보다 크다면 이미지 폴더가 생성된 것으로 if문 실행
			if(folder_session > 0) {
				//폴더를 명시해줍니다.
				String folder = "/board_img/"+member_id+"/"+folder_session;

				//명시된 폴더를 추가해주고 내 서버의 폴더주소를 불러옵니다.
				String uploadPath = request.getServletContext().getRealPath(folder);
				
				System.out.println("BoardInsertAction.java 확인용 로그 : "+uploadPath);
				
				//넘어온 이미지와 서버에 저장된 이미지를 체크하여
				//없는 이미지는 삭제해줍니다.
				CKEditorDeleteFile.imgDelete(board_content, uploadPath);
			}
			//------------------------------------------------------------------------
            
            BoardDTO boardDTO = new BoardDTO();
            BoardDAO boardDAO = new BoardDAO();

            boardDTO.setModel_board_num(board_num);
            boardDTO.setModel_board_content(board_content);
            boardDTO.setModel_board_location(Location(board_location));
            boardDTO.setModel_board_title(board_title);

            boardDTO.setModel_board_condition("BOARD_UPDATE_CONTENT_TITLE"); // 글 수정 컨디션
            boolean updateFlag = boardDAO.update(boardDTO); // 업데이트
         

            request.setAttribute("MEMBER_ID", login); // 로그인한 사용자 정보
        }

        forward.setPath(path);
        forward.setRedirect(flagRedirect);
        return forward;
    }
    /* 뷰에서 전달받은 지역 값을 실제 지역명으로 변환하는 함수
    */
    public String Location(String view_Location) {
       Map<String, String> locationMap = new HashMap<String, String>();

       locationMap.put("SEOUL", "서울특별시");
       locationMap.put("GYEONGGI", "경기도");
       locationMap.put("INCHEON", "인천광역시");       
       locationMap.put("SEJONG", "세종특별자치도");
       locationMap.put("BUSAN", "부산광역시");
       locationMap.put("DAEGU", "대구광역시");
       locationMap.put("DAEJEON", "대전광역시");
       locationMap.put("GWANGJU", "광주광역시");
       locationMap.put("ULSAN", "울산광역시");
       locationMap.put("CHUNGCHEONGNAMDO", "충청남도");
       locationMap.put("CHUNGCHEONGBUKDO", "충청북도");
       locationMap.put("JEONLANAMDO", "전라남도");
       locationMap.put("JEONLABUKDO", "전라북도");
       locationMap.put("GYEONGSANGNAMDO", "경상남도");
       locationMap.put("GYEONGSANGBUKDO", "경상북도");
       locationMap.put("GANGWONDO", "강원도");
       locationMap.put("CHUNGNAM", "충청남도");

       return locationMap.getOrDefault(view_Location, "서울특별시"); // 기본값은 서울특별시
       //getOrDefault  Map 인터페이스에서 제공하는 메서드로, 
       //특정 키에 해당하는 값을 반환하되,
       //만약 그 키가 존재하지 않으면 기본값을 반환하는 역할을 합니다.
   }
}

 

 

ValidFilter.java

package controller.common;

import java.io.IOException;

import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpFilter;
import jakarta.servlet.http.HttpServletRequest;

@WebFilter("*.do")
public class ValidFilter extends HttpFilter implements Filter {
       
    public ValidFilter() {
        super();
    }

	public void destroy() {
		System.out.println("로그 : 필터 종료");
	}

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		String uri=httpRequest.getRequestURI();
		String cp=httpRequest.getContextPath();
		String command=uri.substring(cp.length());
		System.out.println("command : "+command);
		
		if(command.equals("/BOARDUPDATEPAGEACTION.do")) {
			System.out.println("필터 UPDATE_FOLDER_NUM : "+httpRequest.getSession().getAttribute("UPDATE_FOLDER_NUM"));
		}
		else if(command.equals("/BOARDUPDATEACTION.do")){
			System.out.println("필터 UPDATE_FOLDER_NUM : "+httpRequest.getSession().getAttribute("UPDATE_FOLDER_NUM"));			
		}
		else {
			if(httpRequest.getSession().getAttribute("UPDATE_FOLDER_NUM") != null) {
				httpRequest.getSession().setAttribute("UPDATE_FOLDER_NUM", "");
			}
		}
		
		chain.doFilter(request, response); 
	}
	
	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("로그 : 필터 시작");
	}

}

 

 

코드 설명

BoardUpdatePageAction.java

페이지가 이동할때 글내용에 img 태그가 있다면 해당 글의 이미지 폴더를 불러와서

세션에 저장하는 코드입니다.

HttpSession session = request.getSession();
try {
	//글 내용에서 img 태그가 있다면 해당 이미지 폴더의 번호만 가져오는 로직
	content = content.substring(content.lastIndexOf("img")+3).split("/")[2];
	System.out.println("BoardUpdatePageAction.java content 로그 : "+content);
	session.setAttribute("UPDATE_FOLDER_NUM", Integer.parseInt(content));
} catch (Exception e) {
	session.setAttribute("UPDATE_FOLDER_NUM", 0);
}

 

 

BoardUpdateAction.java

이전 페이지에서 session에 저장해둔 폴더명을 불러오고

해당 폴더에 이미지와 글에 등록된 이미지를 확인해서 글을 수정하는 코드입니다.

//CKEditor 제거된 이미지 제거하는 로직
//UTF-8 형식으로 보내주니 UTF-8 로 인코딩 해주고
try {
	request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
	System.out.println("인코딩 실패");
}		
//세션을 불러와서
HttpSession session = request.getSession();
//세션에 저장되어 있는 폴더 개수를 가져옵니다. 삼항연산자로 만약 세션값이 null이 아니라면 정수형으로 변경하여 가져오도록합니다.
int folder_session = (session.getAttribute("UPDATE_FOLDER_NUM") != null) ? (Integer)session.getAttribute("UPDATE_FOLDER_NUM"):0;

//View에서 보내준 내용 확인합니다.
System.out.println(board_content);
//세션에 있는 값이 0보다 크다면 이미지 폴더가 생성된 것으로 if문 실행
if(folder_session > 0) {
	//폴더를 명시해줍니다.
	String folder = "/board_img/"+member_id+"/"+folder_session;

	//명시된 폴더를 추가해주고 내 서버의 폴더주소를 불러옵니다.
	String uploadPath = request.getServletContext().getRealPath(folder);
	
	System.out.println("BoardInsertAction.java 확인용 로그 : "+uploadPath);
	
	//넘어온 이미지와 서버에 저장된 이미지를 체크하여
	//없는 이미지는 삭제해줍니다.
	CKEditorDeleteFile.imgDelete(board_content, uploadPath);
}

 

 

ValidFilter.java

만약 사용자가 이미지가 있는 글을 수정을 하다

수정하지 않고 이미지가 없는 글을 수정하게 된다면 세션에 저장되어 있는 이미지 폴더 번호가 중복될 수 있기 때문에

필터로 페이지 이동하게 되면 세션의 저장되어 있는 폴더 번호를 삭제하는 코드를 작성해주었습니다.

if(command.equals("/BOARDUPDATEPAGEACTION.do")) {
	System.out.println("필터 UPDATE_FOLDER_NUM : "+httpRequest.getSession().getAttribute("UPDATE_FOLDER_NUM"));
}
else if(command.equals("/BOARDUPDATEACTION.do")){
	System.out.println("필터 UPDATE_FOLDER_NUM : "+httpRequest.getSession().getAttribute("UPDATE_FOLDER_NUM"));			
}
else {
	if(httpRequest.getSession().getAttribute("UPDATE_FOLDER_NUM") != null) {
		httpRequest.getSession().setAttribute("UPDATE_FOLDER_NUM", "");
	}
}
728x90