spring mvc -> springboot

spring mvc -> springboot

  1. 配置方式

1. 配置方式

mvc:

  1. spring容器配置:application.xml,对应web.xml的ContextLoaderListener, 扫描除了controller的其他bean
  2. servletContext配置:servlet.xml,对应web.xml的DispatcherServlet
  3. 加载spring容器: 相当于配置web.xml(servlet3.0), 继承AbstractAnnotationConfigDispatcherServletInitializer,因为spring只要实现了WebApplicationInitializer接口的,spring全部进行加载

实战Spring Boot 2.0系列(五) - Listener, Servlet, Filter和Interceptor - 掘金

  1. Listener
  2. Servlet
  3. Filter
  4. Controller
  5. 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() 方法的原理,重点关注 拦截器 的以上三个方法的执行顺序。

发布了161 篇原创文章 · 获赞 140 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/qq_37933685/article/details/103755751