SpringMVC 를 기본 에서 소스 코드 로 상세 하 게 해석 합 니 다.
SpringMVC 프레임 워 크 는 요청 을 구동 하여 Servlet 디자인 을 중심 으로 요청 을 컨트롤 러 에 보 낸 다음 모델 대상,할당 기 를 통 해 요청 결과 보 기 를 보 여 줍 니 다.그 중에서 핵심 클래스 는 Dispatcher Servlet 입 니 다.이것 은 Servlet 이 고 맨 위 는 실 현 된 Servlet 인터페이스 입 니 다.
SpringMVC 처리 요청 과정
SpringMVC 는 Servlet 을 바탕 으로 확장 되 어 그들의 상속 관계 가 어떤 지 살 펴 보 았 다.
Servlet 상속 관계
SpringMVC 상속 관계
Servlet 과 SpringMVC 비교
공통점
모두 MVC 모델 기반 입 니 다.
차이 점
1.ApplicationContext 초기 화 시 모든 URL 과 Controller 의 대응 관계 구축
/**
* ApplicationContext controller url
*/
protected void detectHandlers() throws BeansException {
// Debug
if (logger.isDebugEnabled()) {
//
logger.debug("Looking for URL mappings in application context: " + getApplicationContext());
}
// ApplicationContext bean Name---Controller
String[] beanNames = (this.detectHandlersInAncestorContexts ?
BeanFactoryUtils.beanNamesForTypeIncludingAncestors(getApplicationContext(), Object.class) :
getApplicationContext().getBeanNamesForType(Object.class));
// beanNames, bean url
for (String beanName : beanNames) {
// Controller url( url+ url)
String[] urls = determineUrlsForHandler(beanName);
if (!ObjectUtils.isEmpty(urls)) {
// urls beanName ,put it to Map<urls,beanName>, AbstractUrlHandlerMapping
registerHandler(urls, beanName);
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Rejected bean name '" + beanName + "': no URL paths identified");
}
}
}
}
2.접근 URL 에 따라 대응 하 는 Controller 에서 요청 을 처리 하 는 방법 을 찾 습 니 다.
/** , **/
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpServletRequest processedRequest = request;
HandlerExecutionChain mappedHandler = null;
int interceptorIndex = -1;
try {
ModelAndView mv;
boolean errorView = false;
try {
// 1.
processedRequest = checkMultipart(request);
// 2. controller, hanlder, , .
controller, HandlerExecutionChain , handler interceptors.
mappedHandler = getHandler(processedRequest, false);
// handler , 404
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
//3. request handler adapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// last-modified
String method = request.getMethod();
boolean isGet = "GET".equals(method);
if (isGet || "HEAD".equals(method)) {
long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
if (logger.isDebugEnabled()) {
String requestUri = urlPathHelper.getRequestUri(request);
logger.debug("Last-Modified value for [" + requestUri + "] is: " + lastModified);
}
if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
return;
}
}
// 4.
HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();
if (interceptors != null) {
for (int i = 0; i < interceptors.length; i++) {
HandlerInterceptor interceptor = interceptors[i];
if (!interceptor.preHandle(processedRequest, response, mappedHandler.getHandler())) {
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
return;
}
interceptorIndex = i;
}
}
// 5. ,
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
//
if (mv != null && !mv.hasView()) {
mv.setViewName(getDefaultViewName(request));
}
// 6.
if (interceptors != null) {
for (int i = interceptors.length - 1; i >= 0; i--) {
HandlerInterceptor interceptor = interceptors[i];
interceptor.postHandle(processedRequest, response, mappedHandler.getHandler(), mv);
}
}
}
catch (ModelAndViewDefiningException ex) {
logger.debug("ModelAndViewDefiningException encountered", ex);
mv = ex.getModelAndView();
}
catch (Exception ex) {
Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);
mv = processHandlerException(processedRequest, response, handler, ex);
errorView = (mv != null);
}
if (mv != null && !mv.wasCleared()) {
render(mv, processedRequest, response);
if (errorView) {
WebUtils.clearErrorRequestAttributes(request);
}
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +
"': assuming HandlerAdapter completed request handling");
}
}
//
triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, null);
}
3.반사 호출 처리 요청 방법 결과 보기 되 돌리 기
/** , **/
protected ModelAndView invokeHandlerMethod(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 1.
ServletHandlerMethodResolver methodResolver = getMethodResolver(handler);
// 2. request url, request
// request controller ,request url controller url
Method handlerMethod = methodResolver.resolveHandlerMethod(request);
// 3.
ServletHandlerMethodInvoker methodInvoker = new ServletHandlerMethodInvoker(methodResolver);
ServletWebRequest webRequest = new ServletWebRequest(request, response);
ExtendedModelMap implicitModel = new BindingAwareModelMap();
// 4.
Object result = methodInvoker.invokeHandlerMethod(handlerMethod, handler, webRequest, implicitModel);
// 5.
ModelAndView mav =
methodInvoker.getModelAndView(handlerMethod, handler.getClass(), result, implicitModel, webRequest);
methodInvoker.updateModelAttributes(handler, (mav != null ? mav.getModel() : null), implicitModel, webRequest);
return mav;
}
여기 서 SpringMVC 의 기본 에서 소스 코드 까지 상세 하 게 설명 하 는 이 글 은 여기까지 입 니 다.더 많은 SpringMVC 소스 코드 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ssm 프레임워크 업로드 이미지 로컬 및 데이터베이스에 저장 예시본고는 ssm 프레임워크 업로드 이미지를 로컬과 데이터베이스에 저장하는 예시를 소개하고 주로 Spring+SpringMVC+MyBatis 프레임워크를 사용하여 ssm 프레임워크 업로드 이미지의 실례를 실현했다. 구체...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.