十四: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…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...