목차
HandlerAdapter 살펴보기
HandlerAdapter 는 HandlerMapping 통해 찾은 Handler를 이용해 사용자 요청(Request)를 처리하는 역할을 한다.
public interface HandlerAdapter {
boolean supports(Object handler);
@Nullable ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
@Deprecated long getLastModified(HttpServletRequest request, Object handler); }
|
HandlerAdapter 구현체
- AbstractHandlerMethodAdapter
- RequestMappingHandlerAdapter
HandlerAdapter 지원 여부 확인하기
supports 메소드를 이용해 HandlerAdapter가 전달받은 Handler를 지원하는지 확인한다.
AbstractHandlerMethodAdapter.java
public final boolean supports(Object handler) { return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler)); }
|
Handler를 이용해 Request(요청) 처리하기
HandlerAdapter 객체는 handle 메소드를 이용해 사용자 요청을 Handler 를 이용해 처리한 후 ModelAndView 객체를 반환한다.
AbstractHandlerMethodAdapter.java
@Override @Nullable public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return handleInternal(request, response, (HandlerMethod)handler); }
|
RequestMappingHandlerAdapter.java
@Override protected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
ModelAndView mav; checkRequest(request);
if (this.synchronizeOnSession) { HttpSession session = request.getSession(false); if (session != null) { Object mutex = WebUtils.getSessionMutex(session); synchronized (mutex) { mav = invokeHandlerMethod(request, response, handlerMethod); } } else { mav = invokeHandlerMethod(request, response, handlerMethod); } } else { mav = invokeHandlerMethod(request, response, handlerMethod); }
if (!response.containsHeader(HEADER_CACHE_CONTROL)) { if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) { applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers); } else { prepareResponse(response); } }
return mav; }
|