SpringMvc:spring中的请求处理过程原理分析

简介: SpringMvc:spring中的请求处理过程原理分析

SpringMvc 第二篇

有趣的符号

今天的内容相对就比较少了

主要是讲一下今天学习遇到的很好玩的事情,

1.png

下图是配置我们上篇讲到的控制器,DispatcherServlet的web.xml中的配置


DispatcherServlet这个控制器本质上呢他是一个Serlvet,所以说我们可以在web.xml中配置它,

在第二个箭头指向的


  <!--
  在SpringMVC中 :/ 与 /*的区别
  /:只匹配所有的请求,不匹配jsp
  /*:匹配所有的请求,包括jsp页面
  -->
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

/中的这个/

就是我说的十分有趣的点,这个代表的DispatcherServlet匹配范围,

/*:代表匹配所选定的目录下所有的请求包括静态资源如 html,css,jsp等

/:代表匹配所有选定目录下的所有请求不包括静态资源


Q:这个时候就会有人提出极限二连问:他们是如何执行的呢?,我们该如何判断什么情况去使用他们呢?

关于" / * "的A:

当把所有的请求交给DispatcherServlet来处理的时候,

没有被 @RequestMapping() 映射的资源就无法成功响应,比如静态资源,jsp,html等文件

我们是不会去写@RequestMapping("/.jsp")或是@RequestMapping("/.html")这样的映射

所以当我们在/使用的是 / 的话就会导致我们的所有静态资源无法被访问

报出404等路径问题的异常状态码

所以一般我们在使用过滤器等需要覆盖全部请求的组件中使用 / 来匹配全部

流程图:

2.png


关于" / "的A:

经过阅读一些博客和讨论得知,在使用 / 来处理请求的时候

Servlet执行是有排序的,如下:


1、最先匹配jsp,优先处理(由tomcat处理)

2、@RequestMapping映射的请求(由DispatcherServlet处理)

3、其他请求如html(由DispatcherServlet处理,如果没有映射则无法处理)

所以一般我们会在DispatcherServlet的配置用用到 “/” 来处理所有被@RequestMapping映射的请求

流程图:

3.png

细心的伙伴们会发现,唉这两个家伙一个匹配全部但是不包括html等的一个只匹配映射的那我们在开发中如何去两者都使用呢?

万一我既有静态也有映射的请求呢?

别着急!Spring他都想到了!

在SpringMVC.xml中mvc支持有这么两个好用的功能


mvc:default-servlet-handler/

这个功能有什么作用呢?

他将DispatcherServlet处理的请求转发给tomcat的DefaultServlet来处理,解决了静态请求的问题


mvc:annotation-driven/

这个想必大家也猜到了,

这个功能用来处理使用@@RequestMapping映射的请求


将以上二者搭配使用就可以达到让程序有效处理全部请求了

详细执行图:

4.png


相关文章
|
4月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
576 22
|
4月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
1632 0
|
3月前
|
缓存 监控 Java
《深入理解Spring》拦截器(Interceptor)——请求处理的艺术
Spring拦截器是Web开发中实现横切关注点的核心组件,基于AOP思想,可在请求处理前后执行日志记录、身份验证、权限控制等通用逻辑。相比Servlet过滤器,拦截器更贴近Spring容器,能访问Bean和上下文,适用于Controller级精细控制。通过实现`HandlerInterceptor`接口的`preHandle`、`postHandle`和`afterCompletion`方法,可灵活控制请求流程。结合配置类注册并设置路径匹配与执行顺序,实现高效复用与维护。常用于认证鉴权、性能监控、统一异常处理等场景,提升应用安全性与可维护性。
|
3月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
3月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
3月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
490 2
|
5月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
8月前
|
前端开发 Java 数据库连接
Spring核心原理剖析与解说
每个部分都是将一种巨大并且复杂的技术理念传达为更易于使用的接口,而这就是Spring的价值所在,它能让你专注于开发你的应用,而不必从头开始设计每一部分。
253 32
|
6月前
|
JSON 前端开发 Java
Spring MVC 核心组件与请求处理机制详解
本文解析了 Spring MVC 的核心组件及请求流程,核心组件包括 DispatcherServlet(中央调度)、HandlerMapping(URL 匹配处理器)、HandlerAdapter(执行处理器)、Handler(业务方法)、ViewResolver(视图解析),其中仅 Handler 需开发者实现。 详细描述了请求执行的 7 步流程:请求到达 DispatcherServlet 后,经映射器、适配器找到并执行处理器,再通过视图解析器渲染视图(前后端分离下视图解析可省略)。 介绍了拦截器的使用(实现 HandlerInterceptor 接口 + 配置类)及与过滤器的区别
540 0
|
6月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
224 0

热门文章

最新文章