springmvc
概念
springmvc 属于表现层的框架,它是 Spring 框架的一部分,我们可以从 Spring 的整体结构中看得出来:
处理流程
框架流程
流程图
\
流程解析
1、 用户发送请求至前端控制器 DispatcherServlet(配置在 web.xml 中)
2、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器(HandlerMapping 处理器映射器存储请求的 url 和对应的方法之间的映射关系,方法上的注解@ RequestMapping 来建立这种映射关系)。
3、 处理器映射器根据请求 url 找到具体的处理器,返回处理器执行链 HandlerExecutionChain,执行链包含生成的所有处理器对象 handler 及处理器拦截器(如果有则生成),一并返回给 DispatcherServlet。
4、 DispatcherServlet 将处理器执行链 HandlerExecutionChain 交给 HandlerAdapter 处理器适配器,HandlerAdapter 处理器适配器根据 handler 的类型(类型可以是注解,配置文件等)调用不同的处理器适配器(例如专门处理注解类型的适配器)。
5、 对应类型的处理器适配器会执行 controller 中 url 对应的 handler,也就是方法执行了 。(handler 是方法,Controller 是指表现层处理的类)
6、 Controller 执行完成返回 ModelAndView
7、 HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet
8、 DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器
9、 ViewReslover 根据 ModelAndView 中设置的视图的类型(类型可以是 jsp,报表,pdf 等),使用对应类型的视图解析器进行解析,解析后返回具体 View
10、 DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中,将后台数据填充到前台页面)。
11、 DispatcherServlet 响应用户
组件说明
以下组件通常使用框架提供实现:
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
* HandlerMapping:处理器映射器**
HandlerMapping 负责根据用户请求找到 Handler 即处理器,springmvc 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式(实际开发中只用注解的方式)等。**
DispatcherServlet.properties 配置文件中 HandlerMapping 默认加载 DefaultAnnotationHandlerMapping 和 BeanNameUrlHandlerMapping。
DefaultAnnotationHandlerMapping 用来解析 Spring MVC 里面的 annotation 对应的 Controller,也就是通过这个类,给 Annotation 设置映射关系,如@RequestMapping。
Handler:处理器
Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。而 Controller 是指表现层处理的类
由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。
** HandlAdapter:处理器适配器**
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
补充:
DispatcherServlet.properties 配置文件中 HandlAdapter 默认加载 AnnotationMethodHandlerAdapter
AnnotationMethodHandlerAdapter 对 Annotation 设置的方法进行处理的类,通过此类,解析 annotation 设置的类的处理(解析 url 和方法之间的映射关系),也就是有请求时,通过此类,可以调用 annotation 设置 controller 的方法,主要处理方法,handle(HttpServletRequest req, HttpServletResponse resp, Object handler)
** View Resolver:视图解析器**
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
DispatcherServlet.properties 配置文件中 ViewResolver 默认加载 InternalResourceViewResolver
*View:视图\\
springmvc 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。我们最常用的视图就是 jsp。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。
说明:在 springmvc 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 springmvc 的三大组件。
需要用户开发的组件有 handler、view
手写自己的 springmvc
设计思路
配置阶段
1.替换 web.xml 中配置的 DispatcherServlet 为我们自己实现的 DispatcherServlet 2.实现自己的@Controller @Service @Autowired@RequestMapping
初始化阶段
1.加载配置文件
加载配置的 spirngmvc.xml 或者 application.properties 2.扫描配置的相关类
根据加载的配置文件内中配置的扫描包路径,查找对应包路径下的类 3.实例化扫描到的类,并放入到 IOC 容器中
将扫描到的类 实例化 并放入 IOC 容器中 4.依赖注入
对已经实例化的类中,有@Autowired 注解的属性进行动态注入实例引用 5.整理 requertMapping,把 url 和 method 对应起来放在一个 k-v 的 Map 中,在运行阶段取出
**
运行阶段
1.获取请求中的 url ,从 requestMapping 中获取对应的方法 2.参数处理 3.执行方法 4.返回结果
demo
annotation:注解类
1 | import java.lang.annotation.*; |
1 | import org.springframework.stereotype.Component; |
1 | import java.lang.annotation.*; |
1 |
|
通用 controller or service
1 | /** |
1 | /** |
V1 版本
1 |
|
**