📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

一、基础架构
Spring MVC 是 Spring 框架的一部分,它提供了一个全面的 MVC(Model-View-Controller)模式实现,用于开发 Web 应用程序。以下是 Spring MVC 的基础架构和相关知识点,我们将以专业且通俗易懂的方式展开描述。
前端控制器模式
Spring MVC 采用前端控制器模式,这种模式的核心是 DispatcherServlet,它充当了所有请求的入口点。DispatcherServlet 不仅仅是一个简单的转发器,它负责解析请求、选择合适的处理器(Handler)、组装响应等。在这种模式中,DispatcherServlet 的职责可以细分为以下几个步骤:
- 请求解析:解析请求内容,包括请求方法、请求参数、URL等。
- 处理器映射:根据请求信息,通过处理器映射器(HandlerMapping)找到对应的处理器。
- 处理器适配:通过处理器适配器(HandlerAdapter)适配处理器,执行处理器的方法。
- 响应组装:组装响应,包括模型数据、视图名等。
前端控制器模式使得请求的处理流程更加清晰,同时降低了业务逻辑与视图逻辑的耦合,便于维护和扩展。
MVC组件协作流程
在 Spring MVC 中,MVC 模式中的三个核心组件——模型(Model)、视图(View)和控制器(Controller)——通过以下流程协作:
-
控制器(Controller):控制器负责接收用户请求,通过调用业务逻辑处理,将处理结果封装成模型数据,并返回相应的视图名或模型数据。
- 请求处理:控制器通过请求映射规则识别请求,并调用相应的业务逻辑。
- 模型组装:控制器将业务逻辑处理的结果封装成模型对象,供视图使用。
- 响应返回:控制器根据视图名或模型数据返回响应。
-
模型(Model):模型封装业务数据,提供给视图。
- 数据封装:模型对象通常包含业务逻辑处理的结果,如实体对象、数据列表等。
- 数据访问:模型对象可以通过数据访问对象(Data Access Object,DAO)访问数据库或其他数据源。
-
视图(View):视图展示数据,通常是一个 HTML 页面。
- 模板引擎:视图可以使用模板引擎(如 Thymeleaf、JSP、Freemarker)来动态生成 HTML 页面。
- 数据绑定:视图通过模板引擎将模型数据绑定到页面元素,实现数据的展示。
RESTful支持
Spring MVC 提供了对 RESTful 风格的支持,允许开发者以资源的方式处理 HTTP 请求,使用标准的 HTTP 方法(GET、POST、PUT、DELETE 等)来操作资源。
- 资源映射:通过
@RequestMapping
注解,将 HTTP 请求映射到对应的控制器方法。 - RESTful 风格控制器:控制器方法可以接受请求参数,并返回相应的资源表示,如 JSON 或 XML。
二、核心组件
控制器(Controller)
控制器是 Spring MVC 的核心组件之一,负责处理用户请求并返回响应。
注解驱动开发
Spring MVC 使用注解来简化控制器开发,如 @Controller
、@RequestMapping
等。
@Controller
注解:用于声明一个类作为控制器。@RequestMapping
注解:用于指定请求的 URL 映射规则。
请求映射规则
控制器通过 @RequestMapping
注解指定请求的 URL 映射规则。
- 路径匹配:URL 路径与
@RequestMapping
注解中的值进行匹配。 - 参数匹配:URL 路径中的参数可以通过
@PathVariable
注解与控制器方法的参数进行绑定。
返回值处理
控制器可以返回多种类型的返回值,如字符串(视图名)、ModelAndView
、@ResponseBody
等。
- 视图名返回:返回视图名,Spring MVC 将根据视图名查找对应的视图解析器,并渲染视图。
ModelAndView
返回:返回ModelAndView
对象,其中包含模型数据和视图名。@ResponseBody
返回:返回响应体,如 JSON 或 XML。
视图解析器(ViewResolver)
视图解析器负责将控制器返回的视图名解析为具体的视图对象。
模板引擎集成
Spring MVC 支持 Thymeleaf、JSP、Freemarker 等模板引擎。
- Thymeleaf:基于 Java 的模板引擎,支持丰富的表达式和条件语句。
- JSP:Java Server Pages,是传统的 Web 开发技术,支持 JSTL 和 EL 表达式。
- Freemarker:基于 Java 的模板引擎,支持丰富的模板语法。
内容协商策略
视图解析器可以根据请求的 Accept 头信息选择合适的视图。
- 内容协商:根据请求的 Accept 头信息,选择最合适的视图类型,如 HTML、JSON、XML 等。
- 多视图支持:Spring MVC 支持多种视图类型,可以根据请求信息动态选择。
视图重定向
控制器可以通过返回特定的字符串(如 "redirect:/some/path")来触发视图重定向。
- 重定向规则:Spring MVC 支持多种重定向规则,如客户端重定向、服务器端重定向等。
- 重定向目标:重定向目标可以是 URL、视图名等。
处理器映射(HandlerMapping)
处理器映射负责将请求映射到相应的控制器方法。
- 默认实现类:Spring MVC 默认使用
RequestMappingHandlerMapping
。 - 自定义映射规则:开发者可以通过实现
HandlerMapping
接口来自定义映射规则。
拦截器链
处理器映射可以与拦截器结合使用,形成拦截器链,对请求进行处理。
- 拦截器:拦截器可以用来拦截请求和响应,进行预处理和后处理。
- 拦截器链:拦截器链是由多个拦截器组成的,请求在经过拦截器链时,每个拦截器都会进行处理。
三、数据处理
参数绑定机制
Spring MVC 提供了强大的参数绑定机制,可以将请求参数绑定到控制器方法的参数上。
- 类型转换:Spring MVC 可以自动将请求参数转换为控制器方法的参数类型。
- 自定义类型转换器:开发者可以自定义类型转换器,实现复杂的参数转换。
数据转换器
Spring MVC 使用数据转换器将请求参数转换为模型对象。
- 内置转换器:Spring MVC 提供了内置的数据转换器,如 StringToIntegerConverter、DateToStringConverter 等。
- 自定义转换器:开发者可以自定义数据转换器,以支持更多类型的转换。
表单验证
Spring MVC 提供了表单验证功能,可以通过注解来指定验证规则。
- 内置验证器:Spring MVC 提供了内置的验证器,如 RequiredValidator、MinMaxValidator 等。
- 自定义验证器:开发者可以自定义验证器,以支持更复杂的验证规则。
四、文件操作
多文件上传
Spring MVC 支持多文件上传,通过 @RequestParam
注解和 MultipartFile
类型来接收上传的文件。
- 文件上传请求:文件上传请求通常使用
multipart/form-data
请求体类型。 - 文件接收:Spring MVC 通过
@RequestParam
注解和MultipartFile
类型接收上传的文件。
下载响应控制
控制器可以通过 HttpServletResponse
对象来控制下载响应,如设置内容类型、内容长度等。
- 设置内容类型:通过
HttpServletResponse.setContentType()
方法设置下载文件的内容类型。 - 设置内容长度:通过
HttpServletResponse.setContentLength()
方法设置下载文件的内容长度。
静态资源处理
Spring MVC 默认支持静态资源处理,可以将静态资源放在特定的目录下,如 /resources/
。
- 静态资源目录:Spring MVC 默认将
/resources/
目录下的资源视为静态资源。 - 资源映射:可以通过配置
web.xml
或application.properties
文件来映射静态资源。
五、异常处理
全局异常处理器
Spring MVC 提供了全局异常处理器,可以通过实现 HandlerExceptionResolver
接口来处理异常。
- 异常处理规则:全局异常处理器可以映射异常到特定的 HTTP 状态码或错误页面。
- 异常处理逻辑:全局异常处理器可以执行异常处理逻辑,如记录日志、返回错误信息等。
状态码映射
全局异常处理器可以映射异常到特定的 HTTP 状态码。
- 异常映射:通过配置
HandlerExceptionResolver
,可以将异常映射到特定的 HTTP 状态码。 - 状态码返回:当异常发生时,Spring MVC 会返回对应的 HTTP 状态码。
错误页面定制
开发者可以自定义错误页面,通过配置 error
路径来实现。
- 错误页面路径:配置
error
路径,指定错误页面所在的目录或文件。 - 错误页面内容:错误页面可以包含错误信息、提示信息等。
六、扩展机制
拦截器开发
拦截器是 Spring MVC 的重要组成部分,可以用来拦截请求和响应,进行预处理和后处理。
- 拦截器规则:拦截器可以拦截特定的请求或响应,执行预处理和后处理逻辑。
- 拦截器链:拦截器链是由多个拦截器组成的,请求在经过拦截器链时,每个拦截器都会进行处理。
跨域解决方案
Spring MVC 提供了跨域请求的支持,可以通过配置 CORS
来允许跨域请求。
- CORS 配置:通过配置
CORS
,可以允许来自不同域的请求访问 Spring MVC 应用程序。 - CORS 头信息:Spring MVC 会自动添加必要的 CORS 头信息,如
Access-Control-Allow-Origin
、Access-Control-Allow-Methods
等。
异步请求处理
Spring MVC 支持异步请求处理,通过 @Async
注解来实现。
- 异步请求:异步请求允许控制器方法在执行时释放线程,等待操作完成后再返回结果。
@Async
注解:通过@Async
注解,可以将控制器方法标记为异步方法。
总结
Spring MVC 是一个功能强大且灵活的框架,通过以上核心知识点的理解和应用,开发者可以构建高性能、可扩展的 Web 应用程序。在实际开发中,需要根据具体需求灵活运用这些知识点,以达到最佳的开发效果。
📥博主的人生感悟和目标

- 💂 博客主页: Java程序员廖志伟希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 👉 开源项目: Java程序员廖志伟
- 🌥 哔哩哔哩: Java程序员廖志伟
- 🎏 个人社区: Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码--沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~