클래스 | 기능 |
---|---|
DispatchServlet | 유일한 서블릿 클래스로서 모든 클라이언트의 요청을 가장 먼저 처리하는 FrontController |
HandlerMapping | 클라이언트의 요청을 처리할 Controller 매핑 |
Controller | 실질적인 클라이언트의 요청 처리 |
ViewResolver | Controller가 리턴한 View 이름으로 실행될 JSP 경로완성 |
".do"
요청을 DispatcherServlet
이 받음 DispatcherServlet
은 HandlerMapping
을 통해 요청을 처리할 Controller검색 DispatcherServlet
은 검색된 Controller를 실행하여 클라이언트 요청 처리 Controller
는 비즈니스 로직 수행 결과로 얻어낸 Model 정보와 Model을 보여줄 View 정보를ModelAndView
객체에 저장하여 리턴 DispatcherServlet
은 ModelAndView로부터 View 정보 추출, ViewResolver
을 이용하여 응답으로 사용할 View를 얻어냄 ViewResolver
를 통해 찾아낸 View를 실행하여 응답 전송.package com.springbook.view.controller;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
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.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;
/**
* Servlet implementation class DispatcherServlet
*/
public class DispatcherServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private HandlerMapping handlerMapping;
private ViewResolver viewResolver;
public void init() throws ServletException{
handlerMapping = new HandlerMapping();
viewResolver = new ViewResolver();
viewResolver.setPrefix("./");
viewResolver.setSuffix(".jsp");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
process(request,response);
}
private void process(HttpServletRequest request, HttpServletResponse response) throws IOException{
//1.클라이언트 요청 path 정보를 추출
String uri= request.getRequestURI();
String path=uri.substring(uri.lastIndexOf("/")); // 마지막의 "/"를 기준으로 자르겠다. ex)xxx.do
//2.HandlerMapping을 통해 path에 해당하는 Controller 검색
//HandlerMapping에 맞는 controller를 ctrl에 담아서 실행한다.
Controller ctrl = handlerMapping.getController(path);
//3.검색된 Controller 실행
//실행한다음 결과에 맞는 페이지는 viewName에 담는다.
String viewName = ctrl.handleRequest(request, response);
//4. ViewResolver를 통해 viewName에 해당하는 화면 검색.
//viewName에 . do가 포함되지 않았다면 /xx.do로 보내고
String view=null;
if(!viewName.contains(".do")) {
view = viewResolver.getView(viewName);
//.login.do
}else {
//붙어있다면 그대로 view에 담는다.
view = viewName;
}
//5.검색된 화면으로 이동
response.sendRedirect(view);
//로그인 성공시 getboardlist.do로 실행
//.do로 호출시 dispatcher로 와서 request로 받아들여 doGet함수로 이동
}
}
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.UpdateBoardController;
import com.springbook.view.user.LoginController;
import com.springbook.view.user.LogoutController;
public class HandlerMapping {
private Map<String, Controller> mappings;
public HandlerMapping() {
mappings = new HashMap<String,Controller>();
mappings.put("/login.do", new LoginController());
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());
//ex) {login.do : LoginController} ...
}
public Controller getController(String path) {
return mappings.get(path);
//ex) login.do가 path로 들어오게 되면 handlerMapping의 path에 맞는 controller를 가져와서 리턴해준다.
}
}
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;
//prefix : "./" , suffix : ".do"
//들어온 viewName을 ./viewName.do 으로 만들어준다.
}
}
package com.springbook.view.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public interface Controller {
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);
}
참고 : Spring Quick Start