원본 코드 측면 에서 볼 때 spring mvc 의 요청 처리 과정

spring mvc 소스 코드 를 분석 하기 전에 그림 을 한 장 보 세 요.

요청 처리 과정:
1.Dispatcher Servelt 는 전단 컨트롤 러 로 서 request 대상 을 차단 합 니 다.
2.Dispatcher Servlet 은 request 대상 을 받 은 후 Handler Mapping 을 조회 하여 Handler ExecutionChain 대상 을 얻 습 니 다.
3.Dispatcher Servlet 은 Handler 대상 을 Handler Adapter(어댑터 모드 의 전형 적 인 응용)에 맡 기 고 해당 하 는 controller 방법 을 호출 합 니 다.
4.Controller 방법 은 Model AndView 대상 을 되 돌려 주 고 Dispatcher Servlet 는 view 를 View Resolver 에 맡 겨 분석 하여 해당 하 는 보 기 를 얻 습 니 다.model 로 보 기 를 렌 더 링 합 니 다.
5.응답 결 과 를 되 돌려 줍 니 다.
전체 프로 세 스 의 절 차 는 디 스 패 치 서버 서버 에서 doDispatch()방법의 호출 과정 입 니 다.

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
//     request  ,doDispatch()   doService()      ,request        。
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
boolean multipartRequestParsed = false;
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
try {
ModelAndView mv = null;
Exception dispatchException = null;
try {
//            ,          multipart  
processedRequest = checkMultipart(request);
multipartRequestParsed = (processedRequest != request);
// Determine handler for the current request.
//     ,     HandlerExecutionChain   。  Handler()     
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
// Determine handler adapter for the current request.
//       HandlerExecutionChain  ,       HandlerAdapter  ,  Handler     。
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Process last-modified header, if supported by the handler
//          (304)
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (logger.isDebugEnabled()) {
logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);
}
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
//pan'du
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
//    ,    
applyDefaultViewName(request, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception ex) {
dispatchException = ex;
}
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}
catch (Exception ex) {
triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
}
catch (Error err) {
triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);
}
finally {
if (asyncManager.isConcurrentHandlingStarted()) {
// Instead of postHandle and afterCompletion
if (mappedHandler != null) {
mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
}
}
else {
// Clean up any resources used by a multipart request.
if (multipartRequestParsed) {
cleanupMultipart(processedRequest);
}
}
}
}
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
//  HandlerMappingList  (     HandlerMapping  ),    ,       ,    null
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기