SpringMVC实现原理和代码解读

一、核心类和接口说明:

1、org.springframework.web.servlet.DispatcherServlet:前端控制器。

在web.xml中的配置如下:
springMVC
org.springframework.web.servlet.DispatcherServlet
1

springMVC
/
load-on-startup: 表示启动容器时初始化该Servlet;
url-pattern: 表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”、“*.jsp”表示拦截所有以html为扩展名的请求。
该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。

SpringMVC实现原理和代码解读_第1张图片

2、org.springframework.web.servlet.HandlerMapping:处理请求的映射:

SpringMVC实现原理和代码解读_第2张图片

3.org.springframework.web.servlet.HandlerMapping的实现类:

SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller,处理url代码如下:
SpringMVC实现原理和代码解读_第3张图片
SpringMVC实现原理和代码解读_第4张图片

4、HandlerAdapter接口 -- 处理请求的映射

AbstractHandlerMethodMapping的initHandlerMethods方法中,首先找到Spring容器中初始化所有的Bean,然后isHandler方法是抽象方法,有其子类RequestMappingHandlerMapping去实现
SpringMVC实现原理和代码解读_第5张图片
RequestMappingHandlerMapping的isHandler函数是查找是否有含有@Controller或RequestMapping注解的类

org.springframework.web.servlet.handler.AbstractHandlerMethodMapping通过url获取映射。
SpringMVC实现原理和代码解读_第6张图片

二、配置文件及说明:

扫描指定的包中的类上的注解,常用的注解有:
@Controller 声明Action组件
@Service    声明Service组件    @Service("myMovieLister") 
@Repository 声明Dao组件
@Component   泛指组件, 当不好归类时. 
@RequestMapping("/menu")  请求映射
@Resource  用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") 
@Autowired 用于注入,(srping提供的) 默认按类型装配 
@Transactional( rollbackFor={Exception.class}) 事务管理
@ResponseBody
@Scope("prototype")   设定bean的作用域
SpringMVC实现原理和代码解读_第7张图片

三、工作流程:

1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;
3. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4.  提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
      HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
      数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5.  Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
6.  根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;
7. ViewResolver 结合Model和View,来渲染视图
8. 将渲染结果返回给客户端。

你可能感兴趣的:(spring)