十四: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…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
