一、SpringMVC调用流程图
二、源码分析
1、请求到DispatcherServlet
springmvc结构在servlet框架的基础上发展而来,请求会交由servlet来进行处理,而我们的DispatcherServlet实现了servlet接口。
在springmvc容器初始化的时候会调用initStrategies方法;初始化initHandlerMappings和initHandlerAdapters;
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
2、通过处理器映射器找到合适的处理器
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
3、返回处理器执行链
包含Handler和interceptors
public class HandlerExecutionChain {
private static final Log logger = LogFactory.getLog(HandlerExecutionChain.class);
private final Object handler;
@Nullable
private HandlerInterceptor[] interceptors;
.........
}
4、处理器适配器
在DispatcherServlet#doDispatch中获取适合的HandlerAdapter
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
5、调用执行器方法
在DispatcherServlet#doDispatch中调用执行器方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
SimpleControllerHandlerAdapter类
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return ((Controller) handler).handleRequest(request, response);
}
调用你自己写的controller方法;
6、你自己写controller中返回modelAndView
7、返回modelAndView
8、视图解析
DefaultRequestToViewNameTranslator#getViewName;完善view的名称
public String getViewName(HttpServletRequest request) {
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request, HandlerMapping.LOOKUP_PATH);
return (this.prefix + transformPath(lookupPath) + this.suffix);
}
DispatcherServlet#processDispatchResult方法中调用如下的方法,开始视图解析的流程
render(mv, request, response);
9、返回View
protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
Locale locale, HttpServletRequest request) throws Exception {
if (this.viewResolvers != null) {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
}
return null;
}
10、将Model中的数据填充到view中
AbstractView#render
public void render(@Nullable Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
if (logger.isDebugEnabled()) {
logger.debug("View " + formatViewName() +
", model " + (model != null ? model : Collections.emptyMap()) +
(this.staticAttributes.isEmpty() ? "" : ", static attributes " + this.staticAttributes));
}
Map<String, Object> mergedModel = createMergedOutputModel(model, request, response);
prepareResponse(request, response);
renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
}