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

Spring MVC: 构建Web应用的强大框架

Spring MVC: 构建现代Web应用的强大框架

1. MVC设计模式简介

MVC (Model-View-Controller) 是一种广泛使用的软件设计模式,它将应用程序的逻辑分为三个相互关联的组件:

  • Model (模型): 负责管理数据、业务逻辑和规则。
  • View (视图): 负责用户界面的展示,将数据呈现给用户。
  • Controller (控制器): 作为模型和视图之间的中介,处理用户请求并控制数据流。

这种分离使得应用程序更易于理解、开发和维护。

2. Spring MVC 简介

Spring MVC 是 Spring Framework 的一个子项目,它基于MVC模式构建。Spring MVC 提供了一种灵活的方式来开发 Web 应用程序,具有以下特点:

  • 清晰的角色分离
  • 可重用和可替换的组件
  • 灵活的配置
  • 与 Spring 生态系统的无缝集成

3. Spring MVC 的工作流程

当一个请求到达 Spring MVC 应用时,它会经过以下步骤:

  1. 客户端发送请求到前端控制器 DispatcherServlet。
  2. DispatcherServlet 咨询 HandlerMapping 以找到合适的 Controller。
  3. Controller 处理请求并返回 ModelAndView。
  4. ViewResolver 解析视图名称。
  5. View 使用模型数据渲染最终输出。

这个流程确保了请求的有序处理和响应的生成。

4. 开始使用 Spring MVC

4.1 创建 Spring Boot 项目

使用 Spring Initializr 可以快速创建一个 Spring Boot 项目。选择以下依赖:

  • Spring Web
  • MyBatis Framework (如果需要数据库访问)
  • MySQL Driver (如果使用 MySQL 数据库)

4.2 配置数据库连接

application.properties 文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/yourdb?serverTimezone=Asia/Shanghai&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=yourpassword

4.3 创建控制器

创建一个简单的控制器:

@Controller
public class HelloController {@RequestMapping("/hello")@ResponseBodypublic String hello() {return "Hello, Spring MVC!";}
}

5. 处理请求和响应

5.1 请求映射注解

  1. @RequestMapping: 这是一个通用的请求处理注解,可以处理任何 HTTP 方法。通常用在类级别来定义基本的请求路径。
@Controller
@RequestMapping("/users")
public class UserController {// 处理 /users 路径下的请求
}
  1. @GetMapping: 专门用于处理 GET 请求。
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {// 获取用户信息
}
  1. @PostMapping: 用于处理 POST 请求,通常用于创建新资源。
@PostMapping
public User createUser(@RequestBody User user) {// 创建新用户
}
  1. @PutMapping: 用于处理 PUT 请求,通常用于更新已存在的资源。
@PutMapping("/{id}")
public User updateUser(@PathVariable Long id, @RequestBody User user) {// 更新用户信息
}
  1. @DeleteMapping: 用于处理 DELETE 请求,用于删除资源。
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {// 删除用户
}
  1. @PatchMapping: 用于处理 PATCH 请求,通常用于部分更新资源。
@PatchMapping("/{id}")
public User partialUpdateUser(@PathVariable Long id, @RequestBody Map<String, Object> updates) {// 部分更新用户信息
}

5.2 接收请求参数

Spring MVC 提供了多种方式来接收请求参数:

  1. 路径变量 (@PathVariable):
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {// 通过 id 获取用户
}
  1. 请求参数 (@RequestParam):
@GetMapping("/users")
public List<User> searchUsers(@RequestParam(required = false) String name) {// 根据名字搜索用户
}
  1. 请求体 (@RequestBody):
@PostMapping("/users")
public User createUser(@RequestBody User user) {// 创建新用户
}
  1. 表单数据:
@PostMapping("/login")
public String login(@RequestParam String username, @RequestParam String password) {// 处理登录
}
  1. 使用 POJO 类:
@PostMapping("/register")
public User register(User user) {// Spring MVC 会自动将请求参数映射到 User 对象的属性return userService.registerUser(user);
}

5.3 返回响应,除了下面的,也可以使用自定义的

  1. 返回视图名:
@GetMapping("/home")
public String home() {return "home";  // 返回 home.html 或 home.jsp
}
  1. 返回 ModelAndView:
@GetMapping("/details")
public ModelAndView getUserDetails(@RequestParam Long id) {ModelAndView mav = new ModelAndView("user-details");mav.addObject("user", userService.getUser(id));return mav;
}
  1. 返回 ResponseVO:
@GetMapping("/{id}")
public ResponseVO<User> getUser(@PathVariable Long id) {User user = userService.getUser(id);if (user != null) {return ResponseEntity.ok(user);} else {return ResponseEntity.notFound().build();}
}
  1. 使用 @ResponseBody:
@GetMapping("/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {return userService.getUser(id);
}
  1. 在类级别使用 @RestController:
@RestController
@RequestMapping("/api/users")
public class UserController {// 所有方法都默认返回响应体,无需单独添加 @ResponseBody
}

6. 数据持久化

6.1 使用 MyBatis

MyBatis 是一个流行的 ORM 框架,可以方便地与 Spring MVC 集成。

  1. 创建 Mapper 接口:
@Mapper
public interface UserMapper {@Insert("INSERT INTO users(username, password) VALUES(#{username}, #{password})")void insertUser(User user);
}
  1. 在 Service 层使用 Mapper:
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public void registerUser(User user) {userMapper.insertUser(user);}
}

7. RESTful API 设计

Spring MVC 支持 RESTful API 设计。使用 @RestController 注解可以简化 RESTful 服务的创建:

@RestController
@RequestMapping("/api/users")
public class UserController {@GetMapping("/{id}")public User getUser(@PathVariable Long id) {// 获取用户逻辑}@PostMappingpublic User createUser(@RequestBody User user) {// 创建用户逻辑}
}

8. 异常处理

Spring MVC 提供了全局异常处理机制:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception e) {return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());}
}

9. 总结

Spring MVC 是一个功能强大且灵活的框架,适用于构建各种规模的 Web 应用。通过合理的结构设计和丰富的功能支持,它大大简化了 Web 开发的复杂性。随着不断的实践和学习,你会发现 Spring MVC 能够满足几乎所有的 Web 开发需求。

在实际开发中,记得遵循最佳实践,如合理的分层设计、代码复用、安全性考虑等。同时,持续关注 Spring 社区的最新动态,以便及时了解新特性和改进。

希望这篇文章能够帮助你更好地理解和使用 Spring MVC。祝你在 Web 开发的道路上一帆风顺!

相关文章:

Spring MVC: 构建Web应用的强大框架

Spring MVC: 构建现代Web应用的强大框架 1. MVC设计模式简介 MVC (Model-View-Controller) 是一种广泛使用的软件设计模式,它将应用程序的逻辑分为三个相互关联的组件: Model (模型): 负责管理数据、业务逻辑和规则。View (视图): 负责用户界面的展示,将数据呈现给用户。Con…...

网络学习-eNSP配置NAT

NAT实现内网和外网互通 #给路由器接口设置IP地址模拟实验环境 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]interface gigabitethernet 0/0/0 [Huawei-Gigabi…...

动态规划-最长回文子串

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 对于该题使用中心扩展法在某些情况下可以比动态规划方法更优&#xff0c;尤其是在处理较长字符串时。这是因为中心扩展法具有更好的空间复杂度&#xff0c;并且在实际应用中可能具有更快的运行速度&#xf…...

海康威视 嵌入式 面经 海康威视嵌入式软件 嵌入式硬件总结面试经验 面试题目汇总

标题海康威视 嵌入式 面经 海康威视嵌入式软件 嵌入式硬件总结面试经验 面试题目汇总 整理总结了海康威视嵌入式的面试题目&#xff01;&#xff0c;可以供大家面试参考 标题海康威视 嵌入式 面经 五月底投递&#xff0c;六月初面试&#xff0c;一场技术面&#xff0c;一场H…...

使用图论技巧——有遍数限制的最短路

给定一个 n个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 11 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…...

flume 使用 exec 采集容器日志,转储磁盘

flume 使用 exec 采集容器日志&#xff0c;转储磁盘 在该场景下&#xff0c;docker 服务为superset&#xff0c;flume 的sources 选择 exec &#xff0c; sinks选择 file roll 。 任务配置 具体配置文件如下&#xff1a; #simple.conf: A single-node Flume configuration#…...

459重复的子字符串

给定一个非空的字符串 s &#xff0c;检查是否可以通过由它的一个子串重复多次构成。 public repeatedSubstringPattern(String s){int n s.length();for(int i 1; i < n / 2; i){if(n % i ! 0) continue;// substring获取子字符串是左闭右开的String ss s.substring(0,…...

【HarmonyOS NEXT】实现截图功能

【HarmonyOS NEXT】实现截图功能 【需求】 实现&#xff1a;实现点击截图按钮&#xff0c;实现对页面/组件的截图 【步骤】 编写页面UI Entry Component struct Screenshot {BuildergetSnapContent() {Column() {Image().width(100%).objectFit(ImageFit.Auto).borderRadi…...

小皮面板webman ai项目本地启动教程

1.前置条件 下载小皮面板 下载后&#xff0c;双击安装&#xff0c;一路next&#xff08;下一步&#xff09;&#xff0c;无需更改配置。 2.安装必须软件 在小皮面板的软件管理页&#xff0c;安装编号①②③④下面四个软件。 3.启动本地服务 进入到小皮面板的首页&#x…...

从零实现诗词GPT大模型:实现多头自注意力

专栏规划: https://qibin.blog.csdn.net/article/details/137728228 在上一篇文章的最后,我们已经介绍了为什么要使用多头注意力了,本篇文章我们主要来实现多头自注意力,然后综合我们之前实现的FFN和TransformerBlock其实就差不多完成了整个GPT模型的实现了。 在开始实现之…...

[rk3399 android11]关闭声卡

使用以下命令查看声卡&#xff0c;可以看到目前有三个声卡 cat /proc/asound/cards 修改设备树 diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-jw-d039.dts b/kernel/arch/arm64/boot/dts/rockchip/rk3399-jw-d039.dtsindex 515334c127..5b592a852f 100755--- a/…...

项目实战 ---- 商用落地视频搜索系统(7)---预处理二次优化

目录 背景 要解决的问题 技术理念与落地思路 完整代码 另外的问题与解决 优化运行效果 log 效果图 背景 作为商用落地系统,我们当然希望搜索视频的关联度或者说准确性与我们希望查询的视频相关度越高越好。为此,除了在query 层面上优化,我们还需要注重我们的录入数…...

【干货分享】央企国企的群面、半结构面试复习方法和经验总结

目录 0.前言1.个人背景介绍2.行业选择心路历程3.求职历程3.1 网申如何准备&#xff1f;3.2 笔试考什么&#xff1f;如何准备3.2.1 笔试考什么&#xff1f;3.2.2 笔试如何准备4.面试如何准备&#xff1f;敲黑板&#xff01;重点&#xff01;4.1 面试题收集来源、我的准备方法4.…...

前端HTML基础笔记

HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是一种用于创建网页的标准标记语言。它通过一系列的元素&#xff08;或称为标签&#xff09;来定义网页的结构和内容。HTML文档由一系列的元素组成&#xff0c;这些元素可以包含文本、图片、链…...

用三极管搭建简易电流源

目录 一、三极管搭建电流源设计思路二、实例及搭建仿真1.电阻分压偏置 2.齐纳二极管偏置 3.串联二极管偏置 一、三极管搭建电流源设计思路 设计思路&#xff1a;利用分压电路&#xff0c;可用多种方式给基极提供偏压&#xff0c;使三极管处于放大区&#xff0c;VB保持稳定电压&…...

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页&#xff1a;https://tangyuan96.github.io/minigpt_3d_project_page/ 代码&#xff1a;https://github.com/TangYuan96/MiniGPT-3D 论文&#xff1a;https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA&#xff0c;被ACM MM2024接收&#xff0c;只拥…...

Android Google Maps

Android 谷歌地图 前言正文一、设置Google Cloud 项目二、项目配置① 设置SDK② 配置API密钥③ 配置AndroidManifest.xml 三、添加地图四、定位当前① 请求定位权限② 我的位置控件③ 获取当前位置 五、配置地图① xml配置地图② 代码配置地图③ 地图点击事件④ 管理Marker 六、…...

Linux——进程概念

什么是操作系统 操作系统管理各种计算机硬件、为应用程序提供基础、并且充当计算机硬件与用户之间的中介。 冯诺依曼体系 这里的存储器指的是内存不考虑缓存情况&#xff0c;这里的CPU能且只能对内存进行读写&#xff0c;不能访问外设(输入或输出设备)外设(输入或输出设备)要…...

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么&#xff1f; HTML是什么&#xff1f; 如何运行HTML文件&#xff1f; 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关 项目合作管理相关 后话 前…...

Oracle(111) 如何使用RMAN备份数据库?

使用 RMAN&#xff08;Recovery Manager&#xff09;备份 Oracle 数据库是确保数据安全和可恢复性的关键步骤。下面是详细的指导和代码示例&#xff0c;展示如何使用 RMAN 进行数据库备份。 1. 准备工作 在开始备份之前&#xff0c;需要确保以下几点&#xff1a; 已安装并配…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...