@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController.handleRequest");
return null;
}
}
과거 버전이다.
Controller와 이노테이션인 @Controller와는 다르다.
스프링이 등록해놓은 핸들러매핑과 핸들러어댑터 종류를 몇가지만 소개하겠다.
핸들러 맵핑
RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러이다.
BeanNameUrlHandlerMapping : 스프링 빈 이름으로 컨트롤러를(핸들러를) 찾는다.
핸들러어댑터
RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러를 어댑팅 해준다.
HttpRequestHandlerAdapter : HttpRequestHandler 처리.
SimpleControllerHandlerAdapter : Controller 인터페이스를 상속받은 핸들러를 어댑팅해준다.
위를 보면 옛날거인 Controller를 상속받아 봤다.
순서는 먼저 dispatcherServlet이 들어온 요청에 대해 Handler를 찾는다.
먼저 @RequestMapping먼저 찾아보는데, 없으므로 그 다음 BeanNameUrlHandlerMapping을 이용해 찾는다(실제로는 더 많다.)
그럼 있다. 이름으로 등록했다.
http://localhost:8080/springmvc/http-controller
핸들러맵핑에서 찾았으니, 이제는 어댑터를 이용해 뷰가 처리할 수 있게끔 내가 필요한 정보와 핸들러 맵핑(비즈니스 로직)과 request를 잘엮어서 ModelAndView를 반환하고, 이걸 ViewResolve해서 물리이름을 이끌어내고, view에다 request, response, model을 담아 보낸다.
어댑터를 찾는 것은
RequestMappingHandlerAdapter가 아니다.
이거 돌 때 실제로
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(handler)) {
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler +
"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
이렇게 돈다. 이건 그냥 아예 있는 코드 실제로 가져온거다.
surpports에 가보면,
@Override
public boolean supports(Object handler) {
return (handler instanceof HttpRequestHandler);
}
실제로 이렇게 있다.
@Component("/springmvc/http-controller")
public class MyHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("httpRequestHandler");
}
}
얘도 똑같다.
'스프링 > 3. 스프링 MVC' 카테고리의 다른 글
34. 스프링 MVC (0) | 2023.08.09 |
---|---|
33. 뷰 리졸버 (0) | 2023.08.09 |
31. 스프링 MVC 구조 (0) | 2023.08.09 |
30. 어댑터 패턴 정리 (0) | 2023.08.07 |
29. 어댑터 패턴 (0) | 2023.08.07 |