SpringMVC
1.什么是SpringMVC
- 目前最好的实现MVC设计模式的框架
- Spring框架的一个后续产品
- Spring框架的一个子模块,二者可以很好的结合使用,不需要整合。
2.SpringMVC的核心组件以及实现原理
- DispatcherServlet:前置控制器,它是整个流程控制的核心,用来控制其他组件的执行,进行组件之间的调度,降低各个组件之间的耦合度,相当于总指挥的位置。
- Handler:处理器,完成具体业务逻辑。DispatcherServlet接收到请求之后,需要将不同的请求分发到不同的Handler当中。
- HandlerMapping:将请求映射到Handler,DispatcherServlet接收到请求之后,将不同的请求分发给不同的Handler是如何实现的呢?就需要借助HandlerMapping。简单讲就是根据不同的请求,找不到不同的handler。
- HandlerInterceptor:处理器拦截器。它是一个接口,如果我们需要做一些拦截处理,可以实现这个接口,完成相应的功能。
- HandlerExecutionChain:处理器执行链。它包括两部分内容,分别是Handler、HandlerInterceptor,一般会有一个默认的拦截器,如果我们需要做一些拦截处理,可以实现这个接口添加一些拦截器。但是至少都会返回一个拦截器。
- HandlerAdapter:处理器适配器。Handler在执行业务方法之前,需要执行一系列的操作。包括:对表单数据的验证、表单数据数据类型的转换以及将表单数据封装到JavaBean当中。这一系列操作都是由HandlerAdapter完成的。DispatcherServlet通过HandlerAdapter执行不同的Handler。
- ModelAndView:装载模型数据和视图信息。这里的视图信息指的是逻辑视图,它是作为Handler的处理结果,返回给DispatcherServlet的,DispatcherServlet拿到这个ModelAndView之后,是需要进行解析的。
- ViewResolver:视图解析器。那怎么进行解析呢,就需要借助ViewResolver。视图解析器会将逻辑视图解析为物理视图,最终将结果渲染给客户端。
3.SpringMVC的实现流程
- 客户端请求被DispatcherServlet接收。
- DispatcherServlet调用HandlerMapping。
- 调用HandlerMapping的时候会生成Handler和HandlerInterceptor。并且Handler和HandlerInterceptor是结合起来的,以一个HandlerExecutionChain(Handler + HandlerInterceptor)的结果返回给DispatcherServlet。
- DispatcherServlet拿到Handler之后,通过调用HandlerAdapter执行具体的Handler业务方法。并且在这些业务方法执行之前,它会做一系列处理,例如:对表单数据的处理。
- Handler业务方法执行完成之后会通过HandlerAdapter返回一个ModelAndView的结果给DispatcherServlet,这个结果包括一个逻辑视图和一个模型数据,DispatcherServlet拿到这个模型数据和逻辑视图之后,需要进行解析
- 这时候DispatcherServlet就通过ViewResolver进行解析。ViewResolver将逻辑视图转换为我们web工程中的一个物理视图,并且完成模型数据的封装。
- 最终会返回一个填充了模型数据的View,相应给客户端,进行一个渲染,这样用户就能看到结果了。
4.SpringMVC的使用
1.大部分组件由框架提供,开发者只需通过配置进行关联。
2.开发者只需手动编写Handler、View。
a.基于xml文件的方式使用
1.SpringMVC的基本配置(导入相应的jar包、以及DispatcherServlet的配置)
2.Xml配置Controller、HandlerMapping组件映射
3.Xml配置ViewResolver组件映射
b.基于注解的方式使用
1.SpringMVC的基本配置
2.通过注解的方式配置Controller、HandlerMapping
3.Xml配置ViewResolver
5.SpringMVC数据绑定
- 什么是数据绑定?
- 将HTTP请求中的参数绑定到Handler业务方法的形参
- 没有使用SpringMVC框架时的处理方式:在servlet中doGet或doPost方法中,使用HttpServletRequest的对象request来获取参数,但是通过这个request拿到的参数都是String类型的。如果在后台使用不同的数据类型,则需要进行数据类型转换。
- 当只用SpringMVC框架之后,需要获取什么类型参数,直接去形参列表中定义就行了。
- SpringMVC底层实现:
- 实现原理:通过HandlerAdapter调用HttpMessageConverter这样一个组件,将Http请求中的参数取出,进行数据类型的转换,包括对象的封装,然后将封装的结果,直接赋值给Handler业务方法的形参,然后Handler就能拿到这个形参进行后续业务逻辑操作。
- 常用的数据绑定类型?
- 基本数据类型、包装类、数组、对象、集合(List、Set、Map)、JSON
6.SpringMVC拦截器
1.
SpringMVC拦截器作用在第4、5步中。
- 拦截器是使用JDk动态代理实现的,拦截的是对应调用方法的拦截
- 过滤器是使用Filter实现的,拦截的是request对象
实例:就相当于当我们进入一个网站时,所有操作都需要进行一个用户登录验证操作,这时候就需要靠拦截器来实现。
7.SpringMVC拦截器的配置和应用
- SpringMVC也可以使用拦截器对所有路由(即:需要执行Controller中的方法)进行拦截处理。用户可以自定义拦截器来实现自定义的功能,自定义拦截器必须实现HandlerInterceptor接口。
- preHandler():这个方法在业务处理器处理请求之前被调用,在该方法中对用户请求request进行处理。
- 如果程序员决定该拦截器对请求进行拦截处理后还要调用其他的拦截器,或者是业务处理器去进行处理,则返回true;如果程序员决定不需要再调用其他的组件去处理请求,则返回false。
- postHandle():这个方法在业务处理器处理完请求后,但是DispatcherServlet向客户端返回响应前被调用,在该方法中对用户请求request进行处理。
- afterCompletion():这个方法在DispatcherServlet完全处理完请求后被调用,可以在该方法中进行一些资源清理的操作。
具体的使用见项目,springMVCInterceptor。
当配置了多个拦截器时,执行顺序如下: