对springmvc的简单的理解?

springmvc是对servlet的封装,屏蔽了servlet很对的细节。
举个例子,刚学servlet的时候,要获取参数需要不断的getParameter。现在只要在springMvc方法定义对应的JavaBean,只要属性名与参数名一致,springMVC就可以帮我们实现【将参数封装到JavaBean】上了。
又比如:以前使用servlet【上传文件】,需要处理各种的细节,写一大堆的处理逻辑(还需要导入jar)
现在一个在springmvc的方法上定义出MutipartFile接口,就可以屏蔽掉上传文件的细节了。

了解springMVC的执行流程吗?

  1. 首先有一个统一处理请求的入口。
  2. 随后根据请求路径找到对应的映射器。
  3. 找到处理请求的适配器
  4. 拦截器的前置处理
  5. 真实处理请求(调用真正的代码)
  6. 视图解析器处理
  7. 拦截器的后置处理。

    能从源码级别进行讲解执行流程吗?

    统一处理入口,对应springMVC下的源码是在DispatcherServlet下实现的。
    该对象在初始化就会把映射器,适配器,视图解析器,异常处理器,文件处理器等等给初始化。
    至于会初始化那些实例,看些DispatcherServlet.properties就可以了,都配置在里面。
    所有的请求其实都会被doService方法处理,里面最主要就是调用doDispatch方法。
    通过doDispatch方法我们可以看到整个springmvc的执行流程。
    查找映射器的时候其实就是找到【最佳匹配路径】,具体的方法实现我记得好像实在lookupHandlerMethod方法上。
    从源码可以看到【查找映射器】实际上返回的是HandlerExecutionChain,里面有映射器Handler+拦截器List。

前面提到的拦截器前置处理和后置处理就是用HandlerExecutionChain中的拦截器List。
获取得到HandlerExecutionChain后,就会去获取适配器,一般获取得到的就是RequestMappingHandlerAdapter。
在代码中可以看到的是,经常用到的@ResponseBody和@RequestBody的解析器。就会在初始化的时候加到参数解析器List中。

得到适配器后,就会执行拦截器前置处理。
拦截器前置处理执行完毕后,就会调用适配器对象实例方法handle方法执行真正的代码逻辑处理。
核心的处理逻辑在invokeAndHandle方法中,会获取得到请求参数并调用,处理返回值。
参数的封装以及处理会被适配器的参数解析器进行处理,具体的处理逻辑取决于HttpMessageConverter的实例对象。
微信图片_20210421163808.jpg