springmvc中DispatcherServlet执行流程:
代码:
//经过精减的DispatcherServlet:
public class DispatcherServlet extends FrameworkServlet {
//DispatcherServlet分发请求
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
//获取Hander。getHandler返回HandlerExecutionChain mappedHandler(简称Hander),HandlerExecutionChain包含了核心Handler和拦截器。
/**
* public class HandlerExecutionChain {
* private final Object handler;//保存了处理请求Controller中的方法信息
* private List<HandlerInterceptor> interceptorList;
*}
*/
HandlerExecutionChain mappedHandler = getHandler(request);
//创建HandlerAdapter
/**
* protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
* //handlerAdapters是一个List<HandlerAdapter>集合
* for (HandlerAdapter ha : this.handlerAdapters) {
* //判断是否适合
* if (ha.supports(handler)) {
* return ha;
* }
* }
* }
*/
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
//通过HandlerAdapter获取ModelAndView
ModelAndView mv = ha.handle(request, response, mappedHandler.getHandler());
//处理程序调用的结果
processDispatchResult(request, response, mappedHandler, mv, dispatchException);
}
//处理程序调用的结果
private void processDispatchResult(HttpServletRequest request, HttpServletResponse response, HandlerExecutionChain mappedHandler, ModelAndView mv, Exception exception) throws Exception {
if (mv != null) {
//渲染视图,获取视图并渲染
render(mv, request, response);
}
}
//渲染视图,获取视图并渲染
protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception { Locale locale = this.localeResolver.resolveLocale(request);
//获取View视图,通过视图名称找到网页,并读取网页代码。
View view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);
//渲染视图,就是将数据绑定到网页代码中,再写入response输出流中。
view.render(mv.getModelInternal(), request, response);
}
//获取View视图,就是通过视图名称找到网页,并读取网页代码。
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale, HttpServletRequest request) throws Exception {
//从viewResoluers集合中找到适合的viewResolver,来获取视图。
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
}