-
[SPRING]MVC 프레임워크(01SEP21 )SPRING 2021. 9. 2. 00:12
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'SPRING' 카테고리의 다른 글
[SPRING] 03SEP21_View Resolver (0) 2021.09.03 [SPRING] 03SEP21_2 / @annotation (0) 2021.09.03 [SPRING] DB 사용을 위한 환경설정과 JDBC Template(service와 serviceImpl) (0) 2021.08.26 [SPRING] pointcut 표현식 (0) 2021.08.25 [SPRING] AOP 실습 (0) 2021.08.25