spring mvc -> springboot
- 配置方式
1. 配置方式
mvc:
- spring容器配置:application.xml,对应web.xml的ContextLoaderListener, 扫描除了controller的其他bean
- servletContext配置:servlet.xml,对应web.xml的DispatcherServlet
- 加载spring容器: 相当于配置web.xml(servlet3.0), 继承AbstractAnnotationConfigDispatcherServletInitializer,因为spring只要实现了WebApplicationInitializer接口的,spring全部进行加载
实战Spring Boot 2.0系列(五) - Listener, Servlet, Filter和Interceptor - 掘金
- Listener
- Servlet
- Filter
- Controller
- Interceptor
1. listener
配置一个 ServletContext 监听器,使用 @WebListener 标示即可。在 Servlet 容器 初始化 过程中,contextInitialized() 方法会被调用,在容器 销毁 时会调用 contextDestroyed()。
这里在容器初始化时,往 ServletContext 上下文设置了参数名称为 INITIAL_CONTENT,可以全局直接访问。
2. Servlet
配置 IndexHttpServlet,重写 HttpServlet 的 doGet() 方法,直接输出 IndexHttpServlet 定义的 初始化参数 和在 IndexServletContextListener 设置的 ServletContext 上下文参数。
配置 @WebServlet 注解用于注册这个 Servlet,@WebServlet 注解的 各个参数 分别对应 web.xml 中的配置
3. Filter
一个 Servlet 请求可以经由多个 Filter 进行过滤,最终由 Servlet 处理并响应客户端。这里配置两个过滤器示例
配置 FirstIndexFilter,使用 @WebFilter 注解进行标示。当 FirstIndexFilter 初始化时,会执行 init() 方法。每次请求路径匹配 urlPatterns 配置的路径时,就会进入 doFilter() 方法进行具体的 请求 和 响应过滤。
当 HTTP 请求携带 filter1 参数时,请求会被放行;否则,直接 过滤中断,结束请求处理
配置 SecondIndexFilter,使用 @WebFilter 注解进行标示。当 SecondIndexFilter 初始化时,会执行 init() 方法。每次请求路径匹配 urlPatterns 配置的路径时,就会进入 doFilter() 方法进行具体的 请求 和 响应过滤。
当 HTTP 请求携带 filter2 参数时,请求会被放行;否则,直接 过滤中断,结束请求处理。
来看看 doFilter() 最核心的三个参数:
- ServletRequest: 未到达 Servlet 的 HTTP 请求;
- ServletResponse: 由 Servlet 处理并生成的 HTTP 响应;
- FilterChain: 过滤器链 对象,可以按顺序注册多个 过滤器。
FilterChain.doFilter(request, response);
4. controller
这个没什么好讲的…业务入口.
5. Interceptor
拦截器 Interceptor 只对 Handler 生效。Spring MVC 会为 Controller 中的每个 请求方法 实例化为一个 Handler对象,由 HandlerMapping 对象路由请求到具体的 Handler,然后由 HandlerAdapter 通过反射进行请求 处理 和 响应,这中间就穿插着 拦截处理。
原理剖析
我们通过实现 HandlerInterceptor 接口来开发一个 拦截器,来看看 HandlerInterceptor 接口的三个重要的方法:
- preHandle(): 在 controller 接收请求、处理 request 之前执行,返回值为 boolean,返回值为 true 时接着执行 postHandle() 和 afterCompletion() 方法;如果返回 false 则 中断 执行。
- postHandle(): 在 controller 处理请求之后, ModelAndView 处理前执行,可以对 响应结果 进行修改。
- afterCompletion(): 在 DispatchServlet 对本次请求处理完成,即生成 ModelAndView 之后执行。
下面简单的看一下 Spring MVC 中心调度器 DispatcherServlet 的 doDispatch() 方法的原理,重点关注 拦截器 的以上三个方法的执行顺序。
下面简单的看一下 Spring MVC 中心调度器 DispatcherServlet 的 doDispatch() 方法的原理,重点关注 拦截器 的以上三个方法的执行顺序。