十四:java web(6)-- Spring Spring MVC
目录
Spring MVC
1.1 Spring MVC 概述
1.1.1 什么是 MVC 模式
1.1.2 Spring MVC 工作原理
1.2 Spring MVC 核心组件
1.2.1 DispatcherServlet
1.2.2 控制器(Controller)
1.2.3 请求映射(@RequestMapping)
1.2.4 视图解析器(View Resolver)
在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如 @Controller, @RequestMapping, @ResponseBody 等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过 @ResponseBody 注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。
1.3 RESTful API 开发
1.3.1 构建 RESTful 控制器
1.3.2 返回 JSON 数据(@RestController)
1.3.3 RESTful API 的常见返回格式
1.4 常用注解:
Spring MVC
-
1.1 Spring MVC 概述
- Spring MVC(Model-View-Controller)是 Spring 框架的一部分,提供了基于请求的 Web 应用程序开发框架。它通过分层架构帮助开发者将应用程序的关注点分离,使得应用更易于管理、扩展和测试。
-
1.1.1 什么是 MVC 模式
-
MVC 模式是一种软件架构设计模式,它将应用程序的业务逻辑、用户界面和输入控制分离开来。MVC 模式的主要目的是为了提高代码的可维护性、可扩展性和可测试性。具体来说,MVC 模式由以下三个部分组成:
-
Model(模型):表示应用程序的数据和业务逻辑。模型层通常负责数据的持久化操作(例如与数据库的交互)和业务逻辑的处理。
-
View(视图):负责展示模型数据,并且通常会响应用户输入。视图层主要包括界面显示部分,如 HTML 页面、JSP 页面、Thymeleaf 模板等。
-
Controller(控制器):处理用户请求,调用业务逻辑并返回相应的视图。控制器作为调度器,协调模型和视图之间的交互。用户输入通过控制器转发到相应的服务层或模型层,并选择合适的视图呈现给用户。
-
-
MVC 的优势:
-
分离关注点,简化了代码的维护。
-
增强了代码的重用性,视图可以改变而不影响模型和控制器。
-
业务逻辑与界面解耦,提高了应用程序的灵活性。
-
-
-
1.1.2 Spring MVC 工作原理
-
请求到达 DispatcherServlet:客户端的请求首先会被 DispatcherServlet 接收。DispatcherServlet 是一个前端控制器,它负责将请求转发到对应的处理逻辑。
-
请求映射(HandlerMapping):DispatcherServlet 根据请求的 URL 调用 HandlerMapping 获取请求与相应的处理器(Controller)之间的映射关系。这个映射信息通常是由注解或 XML 配置来指定的。
-
调用 Controller 方法:一旦找到匹配的控制器(Controller)及其方法,DispatcherServlet 会调用该控制器的方法来处理请求。Controller 通常会调用服务层(Service)来执行业务逻辑,可能会返回一个模型数据。
-
返回模型数据:控制器方法返回的数据(通常是一个模型对象或一个视图名称)被传递给 ViewResolver(视图解析器)进行处理。
-
视图渲染:ViewResolver 会根据返回的视图名称找到对应的视图(如 JSP、HTML、Thymeleaf 等),并将模型数据渲染到视图中,生成最终的 HTML 内容。
-
响应返回给客户端:最后,渲染后的视图会返回给客户端,完成一次完整的请求-响应周期。
-
-
- Spring MVC(Model-View-Controller)是 Spring 框架的一部分,提供了基于请求的 Web 应用程序开发框架。它通过分层架构帮助开发者将应用程序的关注点分离,使得应用更易于管理、扩展和测试。
-
1.2 Spring MVC 核心组件
-
1.2.1 DispatcherServlet
-
DispatcherServlet
是 Spring MVC 的前端控制器(Front Controller),它是整个 Web 应用的核心组件之一。所有的请求都首先通过DispatcherServlet
,然后由它来分发和处理请求。具体来说,DispatcherServlet
主要负责以下几个方面:-
请求接收:当用户发起一个 HTTP 请求时,该请求会首先到达
DispatcherServlet
。 -
请求转发:
DispatcherServlet
根据请求的 URL,使用HandlerMapping
查找并调用合适的Controller
来处理请求。 -
DispatcherServlet
是由 Web 容器(如 Tomcat)启动的,它在应用的web.xml
或 Spring Boot 的配置文件中配置。 -
返回视图:处理完请求后,
DispatcherServlet
会使用ViewResolver
解析视图并将结果返回给用户。
-
-
-
1.2.2 控制器(Controller)
-
控制器是 Spring MVC 中负责处理用户请求的组件。它的主要功能是接收来自
DispatcherServlet
转发的请求,执行具体的业务逻辑,并返回数据或视图。在 Spring MVC 中,控制器通常是用
@Controller
或@RestController
注解标记的类,@RequestMapping
注解用于将 HTTP 请求映射到具体的控制器方法。 -
@Controller
注解的类是一个普通的控制器,返回视图模型。 -
@RestController
是一个特殊的控制器,它默认将返回的对象转换为 JSON 或 XML 格式,通常用于构建 RESTful 风格的 Web 服务。 -
@Controller public class UserController {@RequestMapping("/user")public String getUser(Model model) {User user = userService.getUser();model.addAttribute("user", user);return "userView"; // 返回视图的名称} }
-
-
1.2.3 请求映射(@RequestMapping)
-
@RequestMapping
是用于映射 HTTP 请求到控制器方法的注解。通过这个注解,开发者可以将不同的 URL 映射到不同的控制器方法上,并且可以指定请求类型(如 GET、POST 等)以及其他参数(如请求头、请求参数等)。@RequestMapping
可以用于类级别和方法级别。类级别的@RequestMapping
用于指定该类中的所有请求路径的公共部分,方法级别的@RequestMapping
用于指定具体的 URL 路径和请求方式。@RequestMapping
示例: -
@Controller @RequestMapping("/user") // 类级别的请求映射 public class UserController {@RequestMapping("/info") // 方法级别的请求映射public String getUserInfo() {return "userInfo"; // 返回视图}@RequestMapping("/details") // 方法级别的请求映射public String getUserDetails() {return "userDetails"; // 返回视图} }
常见的
@RequestMapping
变体:-
@GetMapping
:用于处理 HTTP GET 请求。 -
@PostMapping
:用于处理 HTTP POST 请求。 -
@PutMapping
:用于处理 HTTP PUT 请求。 -
@DeleteMapping
:用于处理 HTTP DELETE 请求。 -
@RestController @RequestMapping("/api/users") public class UserRestController {@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getUserById(id); // 返回 JSON 格式的用户信息} }
-
-
-
1.2.4 视图解析器(View Resolver)
-
视图解析器(
ViewResolver
)是 Spring MVC 中的一个重要组件,它负责将控制器返回的视图名称解析为实际的视图对象(如 JSP 页面、HTML 页面、PDF 文件等),并将模型数据填充到视图中,最终渲染并返回给客户端。Spring MVC 提供了多种类型的视图解析器,最常见的是 InternalResourceViewResolver,它用于解析 JSP 视图。视图解析器的配置可以指定前缀和后缀,帮助确定视图文件的位置。
ViewResolver
配置示例: -
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/views/" /><property name="suffix" value=".jsp" /> </bean>
-
-
-
在 Spring MVC 中,视图层的处理已经不再是重点,因为现在大多数项目采用了前后端分离的架构。即使使用 JSP,也往往通过 Ajax 请求进行数据交互,视图层的渲染和控制并不需要过多关注,重点是如何通过注解(如
@Controller
,@RequestMapping
,@ResponseBody
等)来处理请求和响应。例如,使用 Ajax 请求时,前端发送一个 JSON 数据,后端通过@ResponseBody
注解将数据返回给前端,而视图部分则通过 JavaScript 动态更新,不再依赖传统的 JSP 渲染。 -
1.3 RESTful API 开发
- RESTful API 是一种基于 REST (Representational State Transfer) 架构风格的 API 设计风格,它通过 HTTP 协议的标准方法(GET、POST、PUT、DELETE)进行操作。Spring MVC 提供了强大的支持来开发 RESTful API,通常通过
@RestController
注解来简化 API 开发。 -
1.3.1 构建 RESTful 控制器
-
RESTful 控制器的设计遵循 HTTP 协议的约定,使用标准的 HTTP 方法来处理不同的操作。
常见的 RESTful API 操作:
-
GET:获取资源(数据)。
-
POST:创建资源。
-
PUT:更新资源。
-
DELETE:删除资源。
-
-
@RestController @RequestMapping("/api/users") public class UserRestController {@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {User user = userService.getUserById(id);if (user != null) {return ResponseEntity.ok(user);} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}}@PostMappingpublic ResponseEntity<User> createUser(@RequestBody @Valid User user) {User savedUser = userService.save(user);return ResponseEntity.status(HttpStatus.CREATED).body(savedUser);}@PutMapping("/{id}")public ResponseEntity<User> updateUser(@PathVariable Long id, @RequestBody User user) {User existingUser = userService.getUserById(id);if (existingUser != null) {user.setId(id);User updatedUser = userService.save(user);return ResponseEntity.ok(updatedUser);} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {if (userService.exists(id)) {userService.delete(id);return ResponseEntity.noContent().build();} else {return ResponseEntity.status(HttpStatus.NOT_FOUND).build();}} }
-
@RestController
:该注解标记的类用于处理 RESTful 请求,默认返回 JSON 格式的数据。 -
@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
:分别用于处理 GET、POST、PUT 和 DELETE 请求。 -
@PathVariable
:用于从 URL 中提取路径变量。 -
@RequestBody
:用于从请求体中提取数据并绑定到 Java 对象。
-
-
1.3.2 返回 JSON 数据(@RestController)
-
@RestController
是@Controller
和@ResponseBody
的组合注解,用于将方法返回的对象自动转化为 JSON 格式并返回。 -
@RestController @RequestMapping("/api/products") public class ProductRestController {@GetMapping("/{id}")public Product getProduct(@PathVariable Long id) {// 假设通过 id 获取产品信息return productService.getProductById(id);}@PostMappingpublic Product createProduct(@RequestBody Product product) {return productService.saveProduct(product);} }
-
@GetMapping("/{id}")
:通过 GET 请求获取资源。 -
@PostMapping
:通过 POST 请求创建新资源。 -
@RequestBody
:将请求体中的 JSON 数据自动绑定到Product
对象。 -
返回的
Product
对象会被自动转化为 JSON 格式并返回给客户端。
-
-
-
1.3.3 RESTful API 的常见返回格式
-
{"id": 1,"name": "Product A","price": 100.0 }
通常 RESTful API 会返回一个标准化的响应格式,以便客户端处理。例如,可以包装响应数据和状态码:
-
public class ApiResponse<T> {private String status;private T data;private String message;// Getter 和 Setter }
-
- RESTful API 是一种基于 REST (Representational State Transfer) 架构风格的 API 设计风格,它通过 HTTP 协议的标准方法(GET、POST、PUT、DELETE)进行操作。Spring MVC 提供了强大的支持来开发 RESTful API,通常通过
-
1.4 常用注解:
- 常用控制器注解
@Controller:
用于标记一个类为 Spring MVC 的控制器类,表示该类将处理 Web 请求。@RestController:
是@Controller
和@ResponseBody
的组合注解,表示该类的所有方法都会返回 JSON 或其他格式的数据,而不是视图。@RequestMapping:
用于定义请求的映射,支持多种 HTTP 方法(GET、POST、PUT、DELETE 等)。可以用于类或方法级别,类级别的@RequestMapping
会作为方法级别的基础路径。@GetMapping:
用于处理 HTTP GET 请求。是@RequestMapping
的快捷方式,专门用于 GET 请求。@PostMapping:
用于处理 HTTP POST 请求。是@RequestMapping
的快捷方式,专门用于 POST 请求。@PutMapping:
用于处理 HTTP PUT 请求。是@RequestMapping
的快捷方式,专门用于 PUT 请求。@DeleteMapping:
用于处理 HTTP DELETE 请求。是@RequestMapping
的快捷方式,专门用于 DELETE 请求。@PatchMapping:
用于处理 HTTP PATCH 请求。是@RequestMapping
的快捷方式,专门用于 PATCH 请求。
- 请求参数相关注解
@RequestParam:
用于从请求的查询参数、表单参数或 URL 中提取参数。@PathVariable:
用于从 URL 路径中提取变量,常用于 RESTful 风格的 API 中。@RequestBody:
用于将 HTTP 请求的内容(通常是 JSON 数据)绑定到方法的参数上。常用于 POST、PUT 和 PATCH 请求中。@RequestHeader:
用于获取 HTTP 请求头中的参数。@CookieValue:
用于获取请求中的 Cookie 值。
- 响应相关注解
@ResponseBody:
用于将控制器方法的返回值直接写入 HTTP 响应体,通常用于返回 JSON、XML 或其他格式的数据。@ResponseStatus:
用于指定方法执行完成后返回的 HTTP 状态码,可以直接将状态码应用于方法。@ExceptionHandler:
用于在控制器中处理异常。当方法抛出异常时,Spring MVC 会调用带有该注解的方法来处理异常。
- 常用控制器注解
相关文章:
十四:java web(6)-- Spring Spring MVC
目录 Spring MVC 1.1 Spring MVC 概述 1.1.1 什么是 MVC 模式 1.1.2 Spring MVC 工作原理 1.2 Spring MVC 核心组件 1.2.1 DispatcherServlet 1.2.2 控制器(Controller) 1.2.3 请求映射(RequestMapping) 1.2.4 视图解析器…...

Java代码实现策略模式处理支付付款业务
1.需求:因为付款功能集成的第三方支付SDK越来越来多不好维护,改用策略模式实现,来代替代码中多余的if else 判断。 2.什么是策略模式? 策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时选择算法的行为。该模式将不同的算法封装成独立的策略类,并使这些…...

unity3d————四元数概念
一、定义与表示 四元数是由一个实数部分和三个虚数部分组成,通常表示为q w xi yj zk,其中w是实数,x、y、z是实数系数,i、j、k是虚数单位,满足以下关系: i j k -1ij k,ji -kjk i&…...
spring相关的面试题
Spring 框架是 Java 开发中最常用的框架之一,因此在面试中经常会被问到与 Spring 相关的问题。以下是一些常见的 Spring 面试题及其答案。 基础概念 什么是 Spring 框架? Spring 框架是一个开源的 Java 平台,用于构建企业级应用程序。它提供…...

STM32外设之SPI的介绍
### STM32外设之SPI的介绍 SPI(Serial Peripheral Interface)是一种高速的,全双工,同步的通信总线,主要用于EEPROM、FLASH、实时时钟、AD转换器等外设的通信。SPI通信只需要四根线,节约了芯片的管脚&#x…...

二十三、Mysql8.0高可用集群架构实战
文章目录 一、MySQL InnoDB Cluster1、基本概述2、集群架构3、搭建一主两从InnoDB集群3.1、 安装3个数据库实例3.2、安装mysqlrouter和安装mysqlshell3.2.1、安装mysql-router3.2.2、安装mysql-shell 3.3、InnoDB Cluster 初始化3.3.1、参数及权限配置预需求检测3.3.2、初始化I…...
docker file 精简规则
在编写 Dockerfile 时,精简规则不仅有助于减小镜像大小,还能提高构建速度和可维护性。以下是一些常见的精简 Dockerfile 规则: 1. 尽量合并 RUN 指令 每个 RUN 指令会产生一个新的镜像层,因此多个命令可以合并为一个 RUN 指令&a…...
前端加密方式详解与选择指南
在当今数字化时代,前端数据安全的重要性日益凸显。本文将深入探讨前端加密的多种方式,为你提供选择适合项目加密方式的实用策略,并分享一些实际案例及相应代码。 一、前端加密方式汇总 (一)HTTPS 加密 HTTPS 是在 H…...

【React】条件渲染——逻辑与运算符
条件渲染——逻辑与&&运算符 你会遇到的另一个常见的快捷表达式是 JavaScript 逻辑与(&&)运算符。在 React 组件里,通常用在当条件成立时,你想渲染一些 JSX,或者不做任何渲染。 function Item({ nam…...

MATLAB中eig函数用法
目录 语法 说明 示例 矩阵特征值 矩阵的特征值和特征向量 排序的特征值和特征向量 左特征向量 不可对角化(亏损)矩阵的特征值 广义特征值 病态矩阵使用 QZ 算法得出广义特征值 一个矩阵为奇异矩阵的广义特征值 eig函数的功能是求取矩阵特征值…...

Chrome(谷歌浏览器中文版)下载安装(Windows 11)
目录 Chrome_10_30工具下载安装 Chrome_10_30 工具 系统:Windows 11 下载 官网:https://chrome.google-zh.com/,点击立即下载 下载完成(已经下过一遍所以点了取消) 安装 解压,打开安装包 点击下一步…...

Linux 配置JDK
文章目录 一、下载Oracle-JDK1.1、如何正确的下载JDK 二、配置JDK环境变量2.1 环境变量配置2.1.1、修改vim /etc/profile 添加jdk的路径 一、下载Oracle-JDK 1.1、如何正确的下载JDK 首先我要安装的是oracle-jdk,这个时候什么地方都不要去,就去oracle的…...

目前主流的人工智能学习框架有哪些?
随着人工智能(AI)技术的蓬勃发展,越来越多的AI学习框架相继推出,成为开发者、研究人员和企业构建机器学习(ML)和深度学习(DL)模型的首选工具。AI学习框架不仅提供了丰富的工具库和函…...
100种算法【Python版】第57篇——贝叶斯优化算法
本文目录 1 算法说明2 贝叶斯优化的步骤3 算法应用1:目标函数最大值4 算法应用2:确定最佳试验参数1 算法说明 贝叶斯优化是一种旨在优化黑箱目标函数的策略,通常适用于评估代价高昂或时间消耗长的函数。它利用贝叶斯统计方法来构建目标函数的概率模型,进而指导下一步的采样…...
在Ubuntu 上实现 JAR 包的自启动
在 Ubuntu 上实现 JAR 包的自启动,可以通过以下几种方法: 方法一:使用 systemd 创建一个服务文件: 在 /etc/systemd/system/ 目录下创建一个新的服务文件,例如 myapp.service: sudo nano /etc/systemd/sys…...

【智能算法应用】哈里斯鹰算法优化二维栅格路径规划问题
摘要 本文研究了基于哈里斯鹰优化算法(Harris Hawks Optimization, HHO)的二维栅格路径规划方法。HHO算法模拟哈里斯鹰的猎食行为,通过迭代搜索过程找到从起点到终点的最优路径,避开栅格中的障碍物。实验结果表明,HHO…...

单品年销10亿!看麻辣王子是如何布局软文营销为品牌赋能的?
说到辣条,除了大家熟知的卫龙之外,还有一个不得不提的品牌就是——麻辣王子。 作为来自辣条发源地湖南平江的老牌辣条企业,麻辣王子近几年通过打造品牌,积极破圈,2023年凭借一款单品狂揽超10亿年销售额,稳…...

【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
博主说明:本文项目编号 T 062 ,文末自助获取源码 \color{red}{T062,文末自助获取源码} T062,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…...
C++:模拟实现STL的string
目录 一.实现string类 1.string的构造及析构 2.string类的遍历 3.string类的插入和删除 4.string类的空间处理 5.string类的查找 6.string类的输出和输入 7.string类的常用判断 二.整体代码 1.string.h 2.string.cpp 一.实现string类 在前一节中我们了解了STL中stri…...

【Python TensorFlow】入门到精通
TensorFlow 是一个开源的机器学习框架,由 Google 开发,广泛应用于机器学习和深度学习领域。本篇将详细介绍 TensorFlow 的基础知识,并通过一系列示例来帮助读者从入门到精通 TensorFlow 的使用。 1. TensorFlow 简介 1.1 什么是 TensorFlow…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...
自定义线程池1.2
自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案
以下是一个结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案,包含完整数学推导、PyTorch/TensorFlow双框架实现代码及对比实验分析。 基于PINN的反应扩散方程稀疏数据预测与大规模数据泛化能力研究 1. 问题定义与数学模型 1.1 反应扩散方程 考虑标…...