springMVC执行流程

SpringMVC执行流程(包含步骤解析)

1.用户发送请求来到DispatcherServlet前端控制器

2.前端控制器接受请求并调用HandlerMaping处理器映射器

3.DispatcherServlet通过HandlerMaping处理器映射器获取到HandlerAdapter处理器适配器(生成执行链–>拦截器和适配器对象)

4.HandlerAdapter处理器适配器生成拦截链(拦截器和适配器对象)

5.HandlerAdapter处理器适配器调用所对应具体控制器方法controller

6.控制器方法controller执行完成返回ModelAndView

7.HandlerAdapter处理器适配器将ModelAndView返回给DispatcherServlet

8.DispatcherServlet将ModelAndView交给ViewResolver视图解析器

9.ViewResolver视图解析器解析后返回具体的View

10.DispatcherServlet根据View进行填充数据 以及 视图渲染

11.DispatcherServlet响应用户

逐步解析

// 前端控制器,springmvc最核心的类
public class DispatcherServlet extends FrameworkServlet {
    //前端控制器最核心的方法,这个是负责处理请求的,一次请求,调用一次 doDispatch 方法
    protected void doDispatch(HttpServletRequest request, HttpServletResponse response) {
        //根据请求获取执行链对象(把拦截器和处理器串起来了)
        HandlerExecutionChain mappedHandler = getHandler(request);
        
        //根据处理器获取处理器适配器对象
        HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
        
        //执行改请求对应的所有拦截器的 preHandle 方法
        if (!mappedHandler.applyPreHandle(processedRequest, response)) {
			return;
		}
        
        //处理器适配器调用 处理器方法 返回ModelAndView对象
        //在这里进行数据绑定,实际上调用处理器方法之前要给处理器方法传参
        //这个参数要经过复杂的数据绑定过程(将前端提交的表单数据,转化为POJO对象)
        mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
        
        //执行该请求对应的所有拦截器的 post	Handle 方法
        mappedHandler.applyPostHandle(processedRequest, response, mv);
        
        //处理分发结果(本质上就是响应结果到浏览器)
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    }
    
    //处理分发结果
	private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
			@Nullable HandlerExecutionChain mappedHandler, @Nullable ModelAndView mv,
                                       @Nullable Exception exception) throws Exception {
        
        //渲染页面
        render(mv, request, response);
        
        //执行该请求所对应的所有拦截器的 afterCompletion方法
        mappedHandler.triggerAfterCompletion(request, response, null);
    }
    
    //渲染页面
    protected void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
        //通过视图解析器进行解析,返回视图View对象
        View view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
        
        //调用视图对象渲染方法(完成响应)
        view.render(mv.getModelInternal(), request, response);
    }
    //解析视图名称
	protected View resolveViewName(String viewName, @Nullable Map<String, Object> model,
                                   Locale locale, HttpServletRequest request) throws Exception {
        //视图解析器
        ViewResolver viewResolver;
        //通过视图解析器返回视图对象View
        View view = viewResolver.resolveViewName(viewName, locale);
    }
}
  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值