目录
Spring MVC 的拦截器和 Filter 过滤器有什么差别?
重点
SpringMVC的工作原理
1、客户端向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet(也叫中央控制器)。
2、DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)。
3、DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller。
4、HandlerAdapter处理器适配器去执行Controller并得到 ModelAndView(数据和视图),并层层返回给DispatcherServlet。
5、DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
6、DispatcherServlet将模型数据填充到视图中。
7、DispatcherServlet将结果响应给客户端。
Spring MVC 拦截器
Spring MVC 拦截器对应HandlerInterceor接口,该接口位于org.springframework.web.servlet的包中,定义了三个方法,若要实现该接口,就要实现其三个方法:
- 前置处理(preHandle()方法):该方法在执行控制器方法之前执行。返回值为Boolean类型,如果返回false,表示拦截请求,不再向下执行,如果返回true,表示放行,程序继续向下执行(如果后面没有其他Interceptor,就会执行controller方法)。所以此方法可对请求进行判断,决定程序是否继续执行,或者进行一些初始化操作及对请求进行预处理。
- 后置处理(postHandle()方法):该方法在执行控制器方法调用之后,且在返回ModelAndView之前执行。由于该方法会在DispatcherServlet进行返回视图渲染之前被调用,所以此方法多被用于处理返回的视图,可通过此方法对请求域中的模型和视图做进一步的修改。
- 已完成处理(afterCompletion()方法):该方法在执行完控制器之后执行,由于是在Controller方法执行完毕后执行该方法,所以该方法适合进行一些资源清理,记录日志信息等处理操作。
注册拦截器:
1、使用Java配置
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SimpleInterceptor());
}
}
2、在xml配置文件中配置
<mvc:interceptors>
<bean class="com.example.SimpleInterceptor" />
</mvc:interceptors>
Spring MVC 的拦截器和 Filter 过滤器有什么差别?
-
实现原理:
- 过滤器(Filter)是基于函数回调的,它依赖于Servlet容器,在实现上基于Java Servlet规范。每个过滤器会执行自身的过滤逻辑,并通过回调机制与其他过滤器交互。
- 拦截器(Interceptor)则是基于Java的反射机制实现的,属于面向切面编程(AOP)的一种应用。拦截器可以在service或方法前后调用特定逻辑,如动态代理就是拦截器的简单实现。
-
使用范围:
- 过滤器需要依赖于Servlet容器,如Tomcat等,因此只能在Web程序中使用。
- 拦截器是一个Spring组件,由Spring容器管理,不依赖特定的容器,因此不仅可以用于Web程序,还可以用于Application、Swing等程序。
-
触发时机:
- 过滤器在请求进入容器后、进入servlet之前进行预处理,而在请求结束时是在servlet处理完以后。
- 拦截器在请求进入servlet后、进入Controller之前进行预处理,请求结束时是在Controller中渲染了对应的视图之后。
-
拦截的请求范围:
- 过滤器对所有访问进行增强处理。
- 拦截器仅针对SpringMVC的访问进行增强。
-
注入Bean情况:
- 过滤器作为Servlet规范的一部分,不依赖于Spring容器,因此不能注入Spring管理的Bean。
- 拦截器作为Spring的一个组件,可以注入Spring管理的Bean,实现更复杂的业务逻辑。
-
控制执行顺序:
- 过滤器的执行顺序由web.xml文件中的配置顺序决定。
- 拦截器的执行顺序由Spring配置文件中的顺序决定,可以有多个拦截器按照配置的顺序依次执行。一般来说,首先执行过滤器,然后再执行拦截器。
基础
什么是SpringMVC
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。它将model、view、controller分离,对web层进行解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。
SpringMVC的优点
清晰的角色划分,控制器(controller)、验证器(validator)、命令对象(command obect)、表单对象(form object)、模型对象(model object)、Servlet分发器(DispatcherServlet)、处理器映射(handler mapping)、试图解析器(view resoler)等等。每一个角色都可以由一个专门的对象来实现。
代码可重用性高,可以使用现有的业务对象作为命令或表单对象,而不需要去扩展某个特定框架的基类。
强大而直接的配置方式:将框架类和应用程序类都能作为JavaBean配置,支持跨多个context的引用,例如,在web控制器中对业务对象和验证器validator)的引用。
可适配、非侵入:可以根据不同的应用场景,选择何事的控制器子类(simple型、command型、from型、wizard型、multi-action型或者自定义),而不是一个单一控制器(比如Action/ActionForm)继承。
可定制的绑定(binding)和验证(validation):比如将类型不匹配作为应用级的验证错误,这可以保证错误的值。再比如本地化的日期和数字绑定等等。在其他某些框架中,你只能使用字符串表单对象,需要手动解析它并转换到业务对象。
灵活的model转换:在Springweb框架中,使用基于Map的键/值对来达到轻易的与各种视图技术集成。
Spring MVC的核心组件
DispatcherServlet:前置控制器,是整个流程控制的核心,控制其他组件的执行,进行统一调度,降低组件之间的耦合性,相当于总指挥。
Handler:处理器,完成具体的业务逻辑,相当于 Servlet 或 Action。
HandlerMapping:DispatcherServlet接收到请求之后,通过HandlerMapping将不同的请求映射到不同的Handler。
HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
HandlerExecutionChain:处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor(系统会有一个默认的 HandlerInterceptor,如果需要额外设置拦截,可以添加拦截器)。
HandlerAdapter:处理器适配器,Handler 执行业务方法之前,需要进行一系列的操作,包括表单数据的验证、数据类型的转换、将表单数据封装到 JavaBean 等,这些操作都是由 HandlerApater 来完成,开发者只需将注意力集中业务逻辑的处理上,DispatcherServlet 通过 HandlerAdapter 执行不同的 Handler。
ModelAndView:装载了模型数据和视图信息,作为 Handler 的处理结果,返回给 DispatcherServlet。
ViewResolver:视图解析器,DispatcheServlet 通过它将逻辑视图解析为物理视图,最终将渲染结果响应给客户端。
Spring MVC的常用注解由有哪些
- @Controller:用于标识此类的实例是一个控制器。
- @RequestMapping:映射Web请求(访问路径和参数)。
- @ResponseBody:注解返回数据而不是返回页面
- @RequestBody:注解实现接收 http 请求的 json 数据,将 json 数据转换为 java 对象。
- @PathVariable:获得URL中路径变量中的值
- @RestController:@Controller+@ResponseBody
- @ExceptionHandler标识一个方法为全局异常处理的方法。
@Controller 注解有什么用
@Controller
注解标记一个类为 Spring Web MVC 控制器。Spring MVC 会将扫描到该注解的类,然后扫描这个类下面带有 @RequestMapping
注解的方法,根据注解信息,为这个方法生成一个对应的处理器对象