核心组件介绍
- 前端控制器(DisatcherServlet)
- 处理器映射器(HandlerMapping)
- 处理器(Handler)
- 处理器适配器(HandlerAdapter)
- 视图解析器(ViewResovler)
组件内容简单介绍
1.DispatcherServlet 是 SpringMVC统一的入口,所有的请求都通过它。DispatcherServlet 是前端控制器,配置在web.xml文件中。
2.Handler的声明方式有以下几种:Controller接口,HttpRequestHandler,@RequestMapping、Servlet
不同的请求使用不同的实现方式: @RequestMapping定义的Handler,用的是RequestMappingHandlerMapping,其他用的是BeanNameUrlHandlerMapping,静态资源的请求,用的是SimpleUrlHandlerMapping。
3.当 Spring 容器发现一个方法用@RequestMapping注解标注的时候,就用RequestMappingHandlerMapping这个类去实例化,当发现一个类实现了org.springframework.web.servlet.mvc.Controller这个接口的时候,就用BeanNameUrlHandlerMapping去实例化,然后将所有请求放在一个Map里,用请求路径(比如:/index)和对应的Handler做映射处理,这样是不是更好理解。
4.HandlerMapping的作用:主要是根据request请求匹配/映射上能够处理当前request的Handler.
5.HandlerAdapter的作用:因为Spring MVC中的Handler可以有多种实现形式,但是Servlet需要的处理方法的结构却是固定的,都是以request和response作为方法入参,那么如何让固定参数的Servlet处理方法调用灵活的Handler来进行处理呢?这就需要HandlerAdapter来做适配。
6.为什么需要HandlerAdapter?:
Spring MVC的Handler(Controller接口,HttpRequestHandler,@RequestMapping、Servlet)有多种表现形式,不同的Handler,处理请求的方式是不一样的,注解@RequestMapping方式使用的是用方法处理请求,而实现Controller接口和HttpRequestHandler接口方式使用的是一个类,而适配器模式就能模糊掉具体的实现,从而就能提供统一访问接口,所以这地方就要使用适配器了。
整体的流程图如下所示:
步骤总结:
1、用户发送请求到前端控制器(DispatcherServlet);
2、前端控制器调用处理器映射器(HandlerMapping)去查找具体的处理器(Handler);
3、处理器映射器找到处理器或拦截器后向前端控制器返回执行链(HandlerExecutionChain);
4、前端控制器调用处理器适配器(HandlerAdapter)去执行处理器(Handler);
5、处理器适配器执行处理器Handler(Controller);
6、处理器执行完业务流程后向适配器返回ModelAndView;
7、适配器向前端控制器返回ModelAndView;
8、前端控制器将ModelAndView交给视图解析器(ViewResolver)去视图解析;
9、视图解析器向前端控制器返回解析后的视图View;
10、前端控制器对视图进行渲染产生视图如html;
11、前端控制器将产生的视图html通过http返回给前端用户;