当前位置: 首页 > article >正文

Spring MVC 的的核心原理与实践指南

 一、Spring MVC 概述

     Spring MVC 是 Spring 框架中的一个重要模块,用于构建基于 Java 的 Web 应用程序。它遵循模型-视图-控制器(MVC)设计模式,提供了一种结构化的方式来开发灵活、松耦合的 Web 应用。

 Spring MVC 的特点:
1.清晰的分离:严格遵循 MVC 模式,分离业务逻辑、数据和展示层
2.高度可配置:通过 XML 或 Java 注解方式灵活配置
3. 强大的注解支持:简化控制器开发
4. 无缝集成:与 Spring 其他模块(如 Spring Security、Spring Data)完美集成
5. 灵活的视图技术:支持 JSP、Thymeleaf、FreeMarker 等多种视图技术

 二、Spring MVC 核心组件

 1. DispatcherServlet(前端控制器)
作为 Spring MVC 的核心,负责接收所有 HTTP 请求并将它们分发给适当的处理器。

```java

// web.xml 配置示例
<servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring-mvc-config.xml</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>

 2. 处理器映射(HandlerMapping)
确定哪个控制器应该处理传入的请求。

 3. 控制器(Controller)
处理请求并返回适当的模型和视图。

```java
@Controller
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable Long id, Model model) {User user = userService.findById(id);model.addAttribute("user", user);return "userDetail";}
}
```

4. 视图解析器(ViewResolver)
解析逻辑视图名称到实际视图实现。

```java
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {@Beanpublic ViewResolver viewResolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;}
}
```

 三、Spring MVC 请求处理流程

1. 请求到达 DispatcherServlet
2. 查询 HandlerMapping:确定处理请求的控制器
3. 调用控制器方法: 执行业务逻辑
4. 返回 ModelAndView: 包含模型数据和视图名称
5. 解析视图: 通过 ViewResolver
6. 渲染视图: 将模型数据与视图结合
7. 返回响应 给客户端

 四、常用注解详解

 1. @RequestMapping

```java
@Controller
@RequestMapping("/products")
public class ProductController {@RequestMapping(method = RequestMethod.GET)public String listProducts(Model model) {// 获取产品列表return "products/list";}@RequestMapping(value = "/{id}", method = RequestMethod.GET)public String getProduct(@PathVariable Long id, Model model) {// 获取单个产品return "products/detail";}
}

 2. @GetMapping/@PostMapping 等快捷注解

`

``java
@GetMapping("/users")
public String userList(Model model) {// 处理GET请求
}@PostMapping("/users")
public String createUser(User user) {// 处理POST请求
}
```

 3. @RequestParam 和 @PathVariable

```java
@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword, @RequestParam(value = "page", defaultValue = "1") int page) {// 处理查询参数
}@GetMapping("/articles/{id}")
public String getArticle(@PathVariable Long id) {// 处理路径变量
}
```

 4. @RequestBody 和 @ResponseBody

```java
@PostMapping("/api/users")
@ResponseBody
public ResponseEntity<User> createUser(@RequestBody User user) {// 处理JSON请求体并返回JSON响应User savedUser = userService.save(user);return ResponseEntity.ok(savedUser);
}
```

五、数据绑定与表单处理

 1. 表单绑定示例

```java
@Controller
@RequestMapping("/employees")
public class EmployeeController {@GetMapping("/form")public String showForm(Model model) {model.addAttribute("employee", new Employee());return "employeeForm";}@PostMapping("/save")public String submitForm(@Valid @ModelAttribute("employee") Employee employee, BindingResult result) {if (result.hasErrors()) {return "employeeForm";}// 保存员工信息return "redirect:/employees/list";}
}
```

 2. 表单验证

```java
public class Employee {@NotNull@Size(min=2, max=30)private String name;@Min(18)@Max(60)private int age;@Emailprivate String email;// getters and setters
}
```

 六、异常处理

1. @ExceptionHandler

```java
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleResourceNotFound(ResourceNotFoundException ex) {ErrorResponse error = new ErrorResponse("NOT_FOUND", ex.getMessage());return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);}@ExceptionHandler(Exception.class)public ResponseEntity<ErrorResponse> handleAllExceptions(Exception ex) {ErrorResponse error = new ErrorResponse("INTERNAL_ERROR", "发生服务器错误");return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR);}
}
```

 2. @ResponseStatus

```java
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "资源未找到")
public class ResourceNotFoundException extends RuntimeException {// 自定义异常
}
```

 七、RESTful 服务开发

 1. REST 控制器示例

```java
@RestController
@RequestMapping("/api/users")
public class UserApiController {@Autowiredprivate UserService userService;@GetMappingpublic List<User> getAllUsers() {return userService.findAll();}@GetMapping("/{id}")public ResponseEntity<User> getUserById(@PathVariable Long id) {return userService.findById(id).map(ResponseEntity::ok).orElse(ResponseEntity.notFound().build());}@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody User user) {User savedUser = userService.save(user);return ResponseEntity.created(URI.create("/api/users/" + savedUser.getId())).body(savedUser);}
}
```

2. 内容协商

Spring MVC 支持根据请求的 Accept 头或扩展名返回不同格式的数据(JSON/XML等)。

```java
@GetMapping(value = "/{id}", produces = {MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_XML_VALUE})
public User getUser(@PathVariable Long id) {return userService.findById(id).orElseThrow(() -> new ResourceNotFoundException("User not found"));
}
```

 八、Spring MVC 最佳实践

1. 保持控制器简洁:将业务逻辑移到服务层
2. 使用适当的HTTP方法:GET用于检索,POST用于创建,PUT用于更新,DELETE用于删除
3. 合理使用响应状态码:200 OK, 201 Created, 400 Bad Request等
4. 实现全局异常处理:统一处理各种异常
5. 使用DTO而非实体:避免直接暴露领域模型
6. 添加输入验证:确保数据有效性
7. 实现分页和排序:处理大量数据时特别重要
8. 考虑使用HATEOAS:使API更易于发现和使用

九、Spring Boot 中的 Spring MVC

Spring Boot 极大简化了 Spring MVC 的配置:

```java
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}@RestController
@RequestMapping("/api")
public class MyController {@GetMapping("/hello")public String hello() {return "Hello, Spring Boot MVC!";}
}

自动配置包括:
- 自动注册 DispatcherServlet
- 默认视图解析器
- 静态资源处理
- 默认错误页面
- 消息转换器(JSON/XML)

 十、总结

Spring MVC 提供了一个强大而灵活的框架来构建 Web 应用程序。通过其清晰的架构和丰富的功能集,开发者可以快速构建从简单到复杂的企业级应用。掌握 Spring MVC 的核心概念和最佳实践,将帮助您开发出更高效、更易维护的 Web 应用程序。

随着 Spring Boot 的普及,Spring MVC 的开发变得更加简单高效,但底层原理仍然不变。无论是传统的 Web 应用还是现代的 RESTful 服务,Spring MVC 都是一个值得信赖的选择。

相关文章:

Spring MVC 的的核心原理与实践指南

一、Spring MVC 概述 Spring MVC 是 Spring 框架中的一个重要模块&#xff0c;用于构建基于 Java 的 Web 应用程序。它遵循模型-视图-控制器&#xff08;MVC&#xff09;设计模式&#xff0c;提供了一种结构化的方式来开发灵活、松耦合的 Web 应用。 Spring MVC 的特点&#xf…...

轻量级视觉语言模型 Dolphin:高效精准的文档结构化解析利器

在数字化办公和学术研究日益普及的今天&#xff0c;如何高效、准确地处理各类文档图像成为了一个亟需解决的问题。Dolphin 应运而生&#xff0c;作为一款基于异构锚点提示的多模态文档图像解析模型&#xff0c;它不仅打破了传统手动整理文档的繁琐流程&#xff0c;更以远超主流…...

如何安全配置数据库(MySQL/PostgreSQL/MongoDB)

数据库是许多应用程序的核心组成部分&#xff0c;因此保护数据库的安全性至关重要。无论是MySQL、PostgreSQL还是MongoDB&#xff0c;都需要经过适当的安全配置才能防止潜在的安全威胁。本文将介绍如何安全配置这些流行的数据库管理系统&#xff0c;以确保数据的保密性、完整性…...

将 Docker 镜像从服务器A迁移到服务器B的方法

在日常工作中&#xff0c;我们有时会需要将服务器 A上的镜像上传至服务器B上&#xff0c;下面给出具体操作方式&#xff0c;以镜像 postgres:15 为例进行讲解。 首先在服务器A上拉取 镜像 postgres:15 &#xff0c;命令如下&#xff1a; docker pull postgres:15下面再将服务…...

git merge解冲突后,add、continue提交

git merge解冲突后&#xff0c;add、continue提交 git merge操作冲突后&#xff0c;需要手动解冲突&#xff0c;解完冲突后&#xff0c;需要: git add . 然后&#xff0c;进入一般的正常git代码提交流程。 git合并‘merge’其他分支的个别文件到当前branch_gitbash 合并branc…...

Lines of Thought in Large Language Models

Lines of Thought in Large Language Models 《Lines of Thought in Large Language Models》(大语言模型中的思维链)聚焦于分析大语言模型(LLMs)在生成文本时,其内部向量轨迹的统计特性。 核心目标是揭示LLMs复杂的“思维过程”(即文本生成时的隐藏状态变化)能否被简…...

八股战神-JVM知识速查

1.JVM组成 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; JVM是Java程序的运行环境 组成部分&#xff1a; 类加载器&#xff1a;加载字节码文件到内存 运行时数据区&#xff1a;包括方法区&#xff0c;堆&#xff0c;栈&#xff0c;程序计数器&#xff0c;本地…...

机试 | STL | string | 文字处理软件

题目&#xff1a; P5734 【深基6.例6】文字处理软件 - 洛谷 不使用库函数 #include<stdio.h> #include <iostream> #include<string> using namespace std;int main() {int q;//第一行输入一个正整数q&#xff0c;表示操作次数string content;//第二行输入一…...

运动规划实战案例 | 图解基于状态晶格(State Lattice)的路径规划(附ROS C++/Python仿真)

目录 1 控制采样 vs 状态采样2 State Lattice路径规划2.1 算法流程2.2 Lattice运动基元生成2.3 几何代价函数2.4 运动学约束启发式 3 算法仿真3.1 ROS C仿真3.2 Python仿真 1 控制采样 vs 状态采样 控制采样的技术路线源自经典的运动学建模思想。这种方法将机器人的控制指令空…...

深入浅出对抗学习:概念、攻击、防御与代码实践

深入浅出对抗学习&#xff1a;概念、攻击、防御与代码实践 近年来&#xff0c;深度学习在图像识别、自然语言处理等领域取得了巨大成功。然而&#xff0c;研究表明&#xff0c;这些看似强大的模型却异常脆弱&#xff0c;容易受到**对抗样本&#xff08;Adversarial Examples&a…...

Neo4j(二) - 使用Cypher操作Neo4j

文章目录 前言一、Cypher简介二、数据库操作1. 创建数据库2. 查看数据库3. 删除数据库4. 切换数据库 三、节点、关系及属性操作1. 创建节点与关系1.1 语法1.2 示例 2. 查询数据2.1 语法2.2 示例 3. 更新数据3.1 语法3.2 示例 4. 删除节点与关系4.1 语法4.2 示例 5. 合并数据5.1…...

09、供应商管理数字化转型:从潜在评估到战略合作的系统化方法

在全球化竞争和供应链日益复杂的商业环境下&#xff0c;供应商管理已成为企业核心竞争力的关键组成部分。优秀的供应商管理体系不仅能确保物料和服务的稳定供应&#xff0c;更能成为企业创新、降本增效的战略资源。本文将系统性地介绍供应商管理的完整框架&#xff0c;从潜在供…...

AI时代新词-AI增强现实(AI - Enhanced Reality)

一、什么是AI增强现实&#xff08;AI - Enhanced Reality&#xff09;&#xff1f; AI增强现实&#xff08;AI - Enhanced Reality&#xff09;是指将人工智能&#xff08;AI&#xff09;技术与增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术相结合…...

批量转存夸克网盘内容并分享实操教程

批量转存夸克网盘内容并分享 经常使用我AI工具&#xff08;圈友互联AI&#xff09;的应该在每日资源这里看到&#xff0c;会每天自动更新最新资源信息&#xff0c;这些资源是自动从各处爬取出来再批量转存进行分享处理的&#xff01; 今天就和大家分享下&#xff0c;如何对夸克…...

Swagger与go-zero框架生成和展示API文档详解

在现代API开发中&#xff0c;清晰、准确的接口文档是前后端协作的重要基础。作为一款功能强大的Go语言微服务框架&#xff0c;go-zero提供了简便的方式来生成Swagger文档&#xff0c;极大地提高了API开发的效率与质量。今天&#xff0c;我们将深入探讨Swagger的作用以及如何通过…...

“安康杯”安全生产知识竞赛活动流程方案

一、竞赛组织部门&#xff1a;排水公司安全生产办公室 二、竞赛说明&#xff1a; 1、由安全生产办公室组编辑、整理&#xff0c;安全生产领导小组审核。竞赛时由公司领导及各部门负责人对本次知识竞赛进行监督评比&#xff0c;以保证竞赛活动的公平、公正。本次竞赛活动由闫红…...

特征分解:线性代数在AI大模型中的核心工具

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…...

sqlite的拼接字段的方法(sqlite没有convert函数)

我在sqlserver 操作方式&#xff1a; /// <summary>///获取当前门店工资列表/// </summary>/// <param name"wheres">其他条件</param>/// <param name"ThisMendian">当前门店</param>/// <param name"IsNotU…...

【SSL部署与优化​】​​OCSP Stapling配置指南:减少证书验证延迟​​

以下是 通过 Nginx 和 Apache 启用 OCSP Stapling 的详细配置指南&#xff0c;帮助您减少证书验证延迟并提升 HTTPS 性能&#xff1a; 一、OCSP Stapling 核心原理 • 目的&#xff1a;服务器定期从 CA 获取 OCSP&#xff08;在线证书状态协议&#xff09;响应&#xff0c;缓存…...

【C#】Invalidate()的使用

Invalidate()的使用 Invalidate() 是 C# 中用于通知控件需要重新绘制的方法。它通常用于 Windows Forms 应用程序中&#xff0c;当想要更新控件的显示内容时使用。调用 Invalidate() 方法后&#xff0c;系统会安排对该控件进行重绘&#xff0c;这将导致后续调用 OnPaint 方法&…...

理解计算机系统_并发编程(10)_线程(七):基于预线程化的并发服务器

前言 以<深入理解计算机系统>(以下称“本书”)内容为基础&#xff0c;对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 接续理解计算机系统_并发编程(9)_线程(六):读者-写者问题-…...

身份认证: JWT和Session是什么?

一、为什么需要临时凭证&#xff1f; 系统面临三个核心约束&#xff1a; 唯一鉴权方式只有&#xff08;账号&#xff0c;密码&#xff09; 服务端不记录请求状态&#xff0c;服务端不知道用户已登录了 避免重复传输敏感信息&#xff0c;不能每次都携带(账号&#xff0c;密码…...

OpenFOAM 字典系统与求解器配置解析机制

文章目录 OpenFOAM 字典系统与求解器配置解析机制字典系统的基本结构配置文件解析流程字典实现细节1. 字典存储结构2. 条目类型3. 令牌系统4. 解析过程 典型配置文件示例解析字典访问机制高级特性性能考虑 OpenFOAM 字典系统与求解器配置解析机制 OpenFOAM 使用一套独特的字典…...

机器学习中的多GPU训练模式

文章目录 一、数据并行&#xff08;Data Parallelism&#xff09;二、模型并行&#xff08;Model Parallelism&#xff09;1. 模型并行2. 张量并行&#xff08;Tensor Parallelism&#xff09; 三、流水线并行&#xff08;Pipeline Parallelism&#xff09;四、混合并行&#x…...

TPAMI 2025 | CEM:使用因果效应图解释底层视觉模型

底层视觉可解释性专题&#xff1a;https://x-lowlevel-vision.github.io/ 论文&#xff1a;https://arxiv.org/abs/2407.19789 代码&#xff1a;https://github.com/J-FHu/CEM 动机 在底层视觉领域&#xff0c;深度学习模型虽极大提升了任务性能&#xff0c;但其内部运行机…...

小红书文章内容提取免费API接口教程

接口简介&#xff1a; 提取指定小红书文章内容。本接口仅做内容提取&#xff0c;未经作者授权请勿转载。 请求地址&#xff1a; https://cn.apihz.cn/api/caiji/xiaohongshu.php 请求方式&#xff1a; POST或GET。 请求参数&#xff1a; 【名称】【参数】【必填】【说明】 【…...

Halcon 图像预处理②

非线性图像分段变化&#xff1a; 先窗体打开图片 对数非线性变化&#xff1a; 结果图像的亮度/对比度显著增加 log_image(Image,LogImag1,e) 参数1&#xff1a;输入图像 参数2&#xff1a; 输出图像 参数3&#xff1a;底数 log_image(Image,LogImage2,0.1) 图像结果亮度和…...

20250526-C++基础-函数指针

C基础-函数指针 函数指针&#xff0c;顾名思义就是指向函数的指针&#xff0c;用一个变量来存储函数的地址&#xff0c;可以通过这个变量&#xff08;指针&#xff09;间接访问函数。&#xff08;可以把函数指针名看作函数名来进行函数调用&#xff09;。代码及说明如下&#…...

软考 系统架构设计师系列知识点之杂项集萃(73)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;72&#xff09; 第126题 可一次性编程的只读存储器是( )。 A. ROM B. PROM C. EPROM D. EEPROM 正确答案&#xff1a;B。 解析&#xff1a; ROM&#xff1a;出厂时已编程&#xff0c;用户无…...

大模型训练中的GPU作用解析

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型辅助完成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认…...