ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SPRING]MVC 프레임워크(01SEP21 )
    SPRING 2021. 9. 2. 00:12

    참고 : https://velog.io/@silverbi99/Spring-MVC-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC-%EA%B5%AC%EC%A1%B0

     

     

    30AUG21 폴더를 MVC 프레임워크 구조로 변경하자.

     

    MVC : Model View Controller 세가지 역할로 구분. 사용자가 controller를 조작하여 controller는 model를 통해 데이터를 가져오고 그 정보를 바탕으로 view에 시각적인 표현을 나타낸다.

    - model : vo,dao - view : jsp - controller : servlet(front controller), java(action controller) 

     

    Request → Dispatcher Servlet → Handler Mapping 

                                           → Controller --Model & View→ Dispatcher Servlet

                                           → ViewResolver

                                           → View

     

    com.springbook.view.controller.DispatcherServlet : 유일한 서블릿 클래스. 클라이언트의 요청을 가장 먼지 처리하는 FrontController

    com.springbook.view.controller.HandlerMapping : 클라이언트의 요청을 처리할 Controller Mapping

    com.springbook.view.controller.Controller : 실질적으로 클라이언트의 요청을 처리

    com.springbook.view.controller.ViewResolver : Controller가 리턴한 View 이름으로 실행될 JSP 경로 완성

     

    Spring MVC 수행 흐름

    1. 클라이언트로 받은 모든 ".do" 요청을 DispatcherServlet이 받아 HandlerMapping을 통해 Controller 를 검색한다.

    2. 검색된 Controller를 실행하여 요청들을 처리한 후 얻어낸 Model 과 View를 ModelAndView 객체에 저장하여 return한다.

    3. DispatcherServlet은 ModelAndView로부터 View 정보를 추출하고, ViewResolver를 통해 응답으로 사용할 view를 얻어내어 View를 실행하여 응답을 전송한다.

     

    package com.springbook.view.controller;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("*.do")
    public class DispatcherServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    	private HandlerMapping handlerMapping; 
    	private ViewResolver viewResolver;
    	
    	@Override
         //DispatcherServlet이 실행되면 자동으로 실행되는 init 메소드. 초기화 로직이 필요할 때 사용.
    	public void init() throws ServletException {
    		handlerMapping = new HandlerMapping();
    		viewResolver = new ViewResolver();
    		viewResolver.setPrefix("./");
    		viewResolver.setSuffix(".jsp");
    	}
           
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doProcess(request,response);
    	}
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doProcess(request,response);
    	}
    	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//클라이언트 요청 path 정보 추출
    		String uri = request.getRequestURI();
    		String path = uri.substring(uri.lastIndexOf("/")); //가장 마지막 / 를 기준으로 자름.
    		
    		//HandlerMapping을 통해 path에 해당하는 Controller 검색. 실행 후 결과에 맞는 페이지를 viewName에 담는다.
    		Controller ctrl = handlerMapping.getController(path); //handlerMapping : 액션에 대한 정보와 처리 담당
    		String viewName = ctrl.handleRequest(request, response);
    		
    		//viewResolver : view정로를 가지고 페이지 이동 담당
    		//viewName을 viewResolver에서 prefix와 suffix를 구성할 수 있게 만들어보자.
    		String view = null;
    		if(!viewName.contains(".do")) {//서블릿 요청으로 ...do로 넘어오냐?(그냥 쓰면 됨) 직접적으로 jsp파일로 넘어갈 수 있도록 파일 이름만 넘어오냐(확장자가 필요함)
    			view = viewResolver.getView(viewName);
    		}else {
    			view = viewName;
    		}		
    		//검색된 화면으로 이동. 로그인 성공 시 getBoardList.do 실행. .do호출 시 dispatcher로 와서 request로 받아들여 doGet함수로 이동
    		response.sendRedirect(view);
    		
    	}
    	
    
    }

    DispatcherServlet에게 뷰 정보를 String 타입의 뷰 이름으로 전달한다.

    viewResolver는 이름으로부터 실제 사용할 뷰 객체를 결정해준다.

    viewResolver는 viewName으로 부터 사용할 view Object를 생성하여 모델과 뷰를 넘기면 컨트롤러의 책임은 끝난다.

     

     

     

    package com.springbook.view.controller;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import com.springbook.view.board.DeleteBoardController;
    import com.springbook.view.board.GetBoardController;
    import com.springbook.view.board.GetBoardListController;
    import com.springbook.view.board.InsertBoardController;
    import com.springbook.view.board.LogoutController;
    import com.springbook.view.board.UpdateBoardController;
    import com.springbook.view.user.LoginController;
    
    public class HandlerMapping {
    //프론트 컨트롤러에서 넘어오는 정보를 담고있는 역할
    	private Map<String,Controller> mappings;
    
    	public HandlerMapping() {
    		mappings = new HashMap<String,Controller>();
    		mappings.put("/login.do",new LoginController()); //넘어오는 key에 따라 다른 value 값 반환
    		mappings.put("/getBoardList.do", new GetBoardListController());
    		mappings.put("/getBoard.do",new GetBoardController());
    		mappings.put("/insertBoard.do", new InsertBoardController());
    		mappings.put("/updateBoard.do", new UpdateBoardController());
    		mappings.put("/deleteBoard.do", new DeleteBoardController());
    		mappings.put("/logout.do", new LogoutController());
    	}
        
    	//dispatcher에서 받은 path를 가지고 위 new LoginController로 넘기기(다형성 이용하여 부모형태인 Controller 사용)
    	public Controller getController(String path) { 
    		//login.do가 path로 들어오게되면 handlerMapping의 path에 맞는 controller를 가져와서 리턴해준다.
    		return mappings.get(path);
    	}
    }

     

     

     

    package com.springbook.view.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public interface Controller {
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response);
    }

     

    package com.springbook.view.controller;
    
    public class ViewResolver {
    	public String prefix;
    	public String suffix;
    	public void setPrefix(String prefix) { 
    		this.prefix=prefix;
    		
    	}
    	public void setSuffix(String suffix) { 
    		this.suffix=suffix;
    	}
    	
    	public String getView(String viewName) { 
    		return prefix+viewName+suffix;
    	}
    }

     

     

    package com.springbook.view.user;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.springbook.biz.user.UserVO;
    import com.springbook.biz.user.impl.UserDAO;
    import com.springbook.view.controller.Controller;
    
    public class LoginController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		String id= request.getParameter("id");
    		String password = request.getParameter("password");
    		
    		UserVO vo = new UserVO();
    		vo.setId(id);
    		vo.setPassword(password);
    		UserDAO dao = new UserDAO();
    		UserVO user = dao.getUser(vo);
    		
    		if(user!=null) {
    			return "getBoardList.do";
    		}else {
    			return "login";
    		}
    		
    	}
    
    }
    package com.springbook.view.board;
    
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.springbook.biz.board.BoardVO;
    import com.springbook.biz.board.impl.BoardDAO;
    import com.springbook.view.controller.Controller;
    
    public class GetBoardListController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		BoardVO vo = new BoardVO();
    		BoardDAO dao = new BoardDAO();
    		List<BoardVO> boardList = dao.getList(vo);
    		
    		HttpSession session = request.getSession();
    		session.setAttribute("boardList", boardList);
    		
    		return "getBoardList";
    	}
    
    }
    package com.springbook.view.board;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.springbook.biz.board.BoardVO;
    import com.springbook.biz.board.impl.BoardDAO;
    import com.springbook.view.controller.Controller;
    
    public class GetBoardController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		String seq = request.getParameter("seq");
    		BoardVO vo = new BoardVO();
    		vo.setSeq(Integer.parseInt(seq));
    		BoardDAO dao = new BoardDAO();
    		BoardVO list = dao.get(vo);
    		
    		HttpSession session = request.getSession();
    		session.setAttribute("board", list);
    		
    		return "getBoard";
    	}
    
    }
    package com.springbook.view.board;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.springbook.biz.board.BoardVO;
    import com.springbook.biz.board.impl.BoardDAO;
    import com.springbook.view.controller.Controller;
    
    public class InsertBoardController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		String title=request.getParameter("title");
    		String content = request.getParameter("content");
    		String writer=request.getParameter("writer");
    		
    		
    		BoardVO vo = new BoardVO();
    		vo.setTitle(title);
    		vo.setContent(content);
    		vo.setWriter(writer);
    		
    		BoardDAO dao = new BoardDAO();
    		
    		dao.insertBoard(vo);
    		
    		
    		return "getBoardList.do";
    	}
    
    }
    package com.springbook.view.board;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.springbook.biz.board.BoardVO;
    import com.springbook.biz.board.impl.BoardDAO;
    import com.springbook.view.controller.Controller;
    
    public class UpdateBoardController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		String title=request.getParameter("title");
    		String content = request.getParameter("content");
    		String seq = request.getParameter("seq");
    		
    		
    		BoardVO vo = new BoardVO();
    		vo.setSeq(Integer.parseInt(seq));
    		vo.setTitle(title);
    		vo.setContent(content);
    		
    		BoardDAO dao = new BoardDAO();
    		dao.update(vo);
    		
    		return "getBoardList.do";
    	}
    
    }
    package com.springbook.view.board;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.springbook.biz.board.BoardVO;
    import com.springbook.biz.board.impl.BoardDAO;
    import com.springbook.view.controller.Controller;
    
    public class DeleteBoardController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		
    		String seq = request.getParameter("seq");
    		
    		BoardVO vo = new BoardVO();
    		vo.setSeq(Integer.parseInt(seq));
    		
    		BoardDAO dao = new BoardDAO();
    		dao.delete(vo);
    		
    		return "getBoardList.do";
    	}
    
    }
    package com.springbook.view.board;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.springbook.biz.board.BoardVO;
    import com.springbook.view.controller.Controller;
    
    public class LogoutController implements Controller {
    
    	@Override
    	public String handleRequest(HttpServletRequest request, HttpServletResponse response) {
    		
    		
    		HttpSession session = request.getSession();
    		session.invalidate();
    		
    		return "login";
    	}
    
    }
    728x90
Designed by Tistory.