【Spring 篇】走进SpringMVC的世界:舞动Web的激情

在这里插入图片描述

嗨,亲爱的小白们!欢迎来到这篇关于SpringMVC的博客,让我们一起探索这个舞动Web的框架,感受它带来的激情和便利。在这个世界里,我们将学到SpringMVC的概述、开发步骤以及如何快速入门,一切都是如此的令人兴奋。

踏上舞台:SpringMVC概述

在我们深入了解SpringMVC之前,让我们先简单了解一下它是什么。SpringMVC是Spring框架的一个模块,用于构建Web应用程序。它采用了经典的MVC(Model-View-Controller)设计模式,将应用程序划分为三个主要的组件:

  • Model(模型):负责处理数据逻辑,与数据库交互,提供数据给View展示。
  • View(视图):负责用户界面的展示,将Model提供的数据呈现给用户。
  • Controller(控制器):负责处理用户请求,调用Model获取数据,并将数据传递给View展示。

SpringMVC通过这种分层的方式,使得我们能够更清晰地组织和管理代码,提高了应用程序的可维护性。

舞动的步伐:SpringMVC开发步骤

1. 项目初始化

首先,我们需要创建一个新的SpringMVC项目。可以使用Spring Initializr(https://start.spring.io/)来初始化一个基本的Spring Boot项目。选择你需要的配置,点击"Generate"下载项目压缩包,解压后导入到你喜欢的集成开发环境中。

2. 添加SpringMVC依赖

pom.xml文件中,添加SpringMVC的依赖:

<dependencies><!-- ...其他依赖 ... --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>

这个依赖包含了构建基本的SpringMVC应用所需的一切。

3. 创建一个简单的Controller

src/main/java/com/example/demo目录下,创建一个名为DemoController.java的类,用于处理Web请求:

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class DemoController {@GetMapping("/hello")public String hello(Model model) {model.addAttribute("message", "Hello, SpringMVC!");return "hello";}
}

这个简单的Controller定义了一个/hello的GET请求,返回一条简单的问候语。

4. 创建一个显示结果的View

src/main/resources/templates目录下,创建一个名为hello.html的HTML文件,用于展示Controller返回的数据:

<!DOCTYPE html>
<html>
<body><h2 th:text="${message}"></h2></body>
</html>

5. 启动应用

在项目的根目录下执行以下命令启动应用:

./mvnw spring-boot:run

或者在集成开发环境中直接运行DemoApplication.java中的main方法。

打开浏览器访问:http://localhost:8080/hello,你将看到页面上显示着"Hello, SpringMVC!"。

至此,我们已经成功完成了一个简单的SpringMVC应用的开发。接下来,让我们更深入地了解一下SpringMVC的一些核心概念。

感受激情:快速入门SpringMVC

1. 请求映射

在SpringMVC中,我们通过@RequestMapping注解来定义Controller处理的请求映射。例如,我们想要处理一个路径为/greet的GET请求,可以这样写:

@GetMapping("/greet")
public String greet() {return "greet";
}

这里,我们使用了@GetMapping注解,表示处理GET请求。返回值为字符串"greet",它将会被解析为视图名称,系统将会找到名为greet.html的模板文件。

2. 请求参数

在处理请求时,我们常常需要从URL中获取参数。SpringMVC提供了多种方式来接收请求参数,最简单的方式是直接将参数添加到方法的参数中:

@GetMapping("/greet")
public String greet(@RequestParam String name, Model model) {model.addAttribute("message", "Hello, " + name + "!");return "greet";
}

在这个例子中,我们通过@RequestParam注解将name参数绑定到方法的参数中。当我们访问/greet?name=John时,name参数将被设置为"John"。

3. 路径变量

有时候,我们希望从URL路径中提取参数。这时,我们可以使用路径变量(Path Variable)。例如,我们想要处理类似/greet/{name}的URL:

@GetMapping("/greet/{name}")
public String greetWithPathVariable(@PathVariable String name, Model model) {model.addAttribute("message", "Hello, " + name + "!");return "greet";
}

在这个例子中,我们使用@PathVariable注解将路径中的name提取出来,传递给方法参数。当我们访问/greet/John时,name参数将被设置为"John"。

4. 请求体

有时候,我们需要从请求体中获取数据。例如,处理POST请求时,我们可以通过@RequestBody注解将请求体的内容绑定到方法参数:

@PostMapping("/update")
public String update(@RequestBody User user) {// 处理User对象return "update-success";
}

在这个例子中,我们期望客户端发送一个JSON格式的User对象到/update路径。SpringMVC将自动将请求体中的JSON数据转换为User对象,传递给方法。

5. 视图解析器

SpringMVC使用视图解析器来将Controller返回的逻辑视图名称解析为实际的视图。默认情况下,Spring Boot使用Thymeleaf作为模板引擎,所以我们可以在src/main/resources/templates目录下创建相应的HTML文件,Spring Boot会自动识别并渲染。

6. 拦截器

拦截器允许我们在Controller处理请求前或者请求后执行一些额外的逻辑。我们可以创建一个拦截器类,实现HandlerInterceptor接口,并在配置中注册。

public class DemoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {// 在请求到达Controller之前执行System.out.println("Pre Handle method is Calling");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {// 在请求处理之后但视图未渲染前执行System.out.println("Post Handle method is Calling");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 在视图渲染之后执行System.out.println("Request and Response is completed");}
}

在配置类中注册拦截器:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {@Beanpublic DemoInterceptor demoInterceptor() {return new DemoInterceptor();}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(demoInterceptor());}
}

7. 异常处理

在SpringMVC中,我们可以通过@ExceptionHandler注解来处理Controller内部抛出的异常。在全局范围内,我们可以创建一个@ControllerAdvice注解的类,用于集中处理所有Controller的异常。

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public String handleException(Exception e) {// 处理异常并返回错误页面return "error";}
}

8. 文件上传

处理文件上传是Web应用中常见的需求。SpringMVC提供了MultipartFile类来接收上传的文件,同时我们可以使用@RequestParam注解来绑定文件参数。

@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file, Model model) {// 处理文件上传逻辑return "upload-success";
}

9. 表单验证

在SpringMVC中,我们可以使用@Valid@ModelAttribute注解来进行表单验证。定义一个简单的实体类,加上验证注解,如@NotNull@Size等,然后在Controller方法参数上使用@Valid注解。

@PostMapping("/register")
public String register(@Valid @ModelAttribute User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {// 处理验证失败的逻辑return "registration-form";}// 处理注册逻辑return "registration-success";
}

小结:舞动SpringMVC的激情

在这篇博客中,我们深入学习了SpringMVC的概述、开发步骤和快速入门。通过项目初始化、添加依赖、创建Controller和View,我们成功搭建了一个简单的SpringMVC应用。随后,我们学习了请求映射、请求参数的处理方式,以及如何使用路径变量、处理请求体等高级功能。

除此之外,我们还感受了拦截器的力量,学会了如何处理异常、实现文件上传和表单验证等实用功能。SpringMVC为我们提供了丰富而强大的功能,使得我们能够轻松构建高效、安全且易于维护的Web应用。

希望这篇博客能够激发你对SpringMVC的兴趣,让你在这个舞台上舞动的更加从容。如果你有任何问题或想要分享自己的经验,欢迎在评论区留下你的足迹。让我们一起沉浸在SpringMVC的激情世界,创造出更加出色的Web应用吧!💃🌐

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6 - 常用工具类

目录 1. Scanner 扫描控制台输入 1.1 扫描控制台输入 1&#xff09;nextLine 2&#xff09;nextInt 3&#xff09;其他方法 1.2 扫描文件 1.3 查找匹配项 2. Arrays 数组工具 2.1 创建数组 1&#xff09;copyOf 2&#xff09;copyOfRange 3&#xff09;fill 2.2 比…

解决msvcr110.dll文件丢失的方法,每种方法的优缺点

当在Windows上运行依赖此msvcr110.dll的软件时&#xff0c;如果该文件缺失或损坏&#xff0c;你可能会看到一个错误消息&#xff0c;如&#xff1a;“由于找不到msvcr110.dll无法继续执行”&#xff0c;说明系统找不到msvcr110.dll。以下就和大家解决msvcr110.dll文件丢失的方法…

系统添加深色模式实现方案

业务需求,夜间看系统太刺眼,要求添加夜间模式 效果如下: 依赖如下: 参考了官方解决方案,尝试后没有有效的解决. 官方解决方案 后续打算换框架,发现antdesign pro vue版本的暗黑模式禁用了. ant design pro 预览地址 思路: 引入andesign 暗黑模式的样式 , 手动修改自定义类…

在Linux上使用PHP-FPM与Nginx实现高效的HTTP处理

当谈到高效的HTTP处理时&#xff0c;PHP-FPM&#xff08;FastCGI进程管理器&#xff09;与Nginx的结合是许多web开发者的首选。这种组合提供了出色的性能、可扩展性和稳定性&#xff0c;尤其适用于高流量的网站和应用程序。 1. 为什么选择PHP-FPM与Nginx&#xff1f; 性能优化…

C++I/O流——(3)文件输入/输出(第一节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

【python入门】day27: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

java自动化将用例和截图一起执行测试放入world中直接生成测试报告【搬代码】

1.首先我们得用例写好之后放入文档中,把不用的案例类型、前置条件去掉之后,如图: 放到桌面后,先看执行结果: 首先,我们先创建一个时间,这个时间主要是给图片创建名称,并且要在插入world中使用该时间去查找对应的图片名称,且该图片名称是唯一值 //创建时间public st…

原生js监听当前元素之外的点击事件

监听当前元素之外的点击事件 一、具体场景二、具体实现三、完整代码 一、具体场景 当我们需要实现点击其他位置关闭弹窗的时候&#xff0c;就需要监听当前元素之外的点击事件。 二、具体实现 实现思路&#xff1a;监听整个dom的点击事件&#xff0c;判断当前元素是否包含点击…

Qt 信号和槽机制

一. 简介 在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说&#xff0c;信号和槽都是函数&#xff0c;比如按下窗口上的一个按钮后想要弹出一个对话框&#xff0c;那么就可以将这个按钮的单击信号和我们定义的槽关联起来&#xff0c;在这个槽中可以创建一个对话框&am…

训练DAMO-YOLO(damoyolo_tinynasL25_S.py)

文章目录 参考链接1 准备数据1.1 转为COCO格式1.2 指明数据路径 2 设置训练配置文件&#xff0c;在configs/damoyolo_tinynasL25_S.py进行如下两块修改2.1 关于训练参数的设置2.2 根据自己数据集设置 3 开始训练4 调用tools/eval.py进行测试5 训练时可能遇到的报错5.1 RuntimeE…

详解Matlab深度学习进行波形分割

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

C#编程-实现委托

实现委托 委托是可以存储对方法的引用的对象。在C#中,委托允许您动态地改变类中方法的引用。 考虑咖啡售货机的示例,它配置不同口味的咖啡,例如卡布奇诺咖啡和黑咖啡。在选择所需口味的咖啡时,售货机决定混合各种成分,例如奶粉、咖啡粉、热水、卡布奇诺咖啡粉。所有的材…

.Net Core 使用 AspNetCoreRateLimit 实现限流

上一篇文章介绍过ASP.NET Core 的 Web Api 实现限流 中间件-CSDN博客 使用.NET 7 自带的中间件 Microsoft.AspNetCore.RateLimiting 可以实现简单的Api限流&#xff0c;但是这个.NET 7以后才集成的中间件&#xff0c;如果你使用的是早期版本的.NET&#xff0c;可以使用第三方库…

React函数式组件学习笔记

React是一种用于构建用户界面的JavaScript库&#xff0c;它采用组件化的方式来构建复杂的UI。在React中&#xff0c;函数式组件是一种声明式的方式去描述UI的状态和行为。 React的特性 1.声明式设计-React采用声明范式&#xff0c;可以轻松描述应用 2.高效-React通过对DOM的模…

LaTeX系列1——主结构

初学&#xff0c;可交流&#xff0c;轻喷 \documentclass{book} \begin{document} \title{Book Title} \author{Author Name} \date{\today} \maketitle\chapter{Introduction} This is the introduction chapter of the book.\section{First Section} The first section of t…

【算法】使用栈解决一系列算法题(匹配、表达式、模拟)(C++)

1. 前言&#xff08;栈适用于解哪些题&#xff1f;&#xff09; 栈适合解决需要后进先出&#xff08;LIFO&#xff09;的结构的算法题&#xff0c;例如&#xff1a; 括号匹配问题&#xff1a;判断给定字符串中括号是否匹配。表达式求值问题&#xff1a;将表达式转换为后缀表达…

《每天一分钟学习C语言·十二》各种指针问题

1、 int arr; int * restrict pt &arr; *pt 100; *arr 10;注&#xff1a;restrict只能修饰指针&#xff0c;被restrict修饰的指针指向一块内存后这块内存就归这个指针管理了&#xff0c;其他任何指针都不能修改这块内存的内容&#xff0c;这是一个约定&#xff0c;当…

微信公众号注册(详细图文教程)

目录 一、公众号注册准备1.1 准备事项1.2 个人注册1.3 企业注册 二、公众号注册2.1 基本信息填写2.2 选择类型2.3 信息登记2.4 公众号信息2.5 修改头像2.6 自动回复消息 三、总结 一、公众号注册准备 1.1 准备事项 公众号名称&#xff1a;公众号名称可以由中文、英文、数字、…

李宏毅LLM——ChatGPT原理剖析

文章目录 Chat-GPT引言关键技术——预训练研究问题玩文字冒险游戏 ChatGPT原理剖析 Chat-GPT引言 直观感受&#xff1a;结果有模有样、每次输出结果都不同、可以追问、幻想出的答案误解&#xff1a;罐头回答、答案是网络搜索的结果真正做的事&#xff1a;文字接龙&#xff0c;…

Spring Cloud中的提供者与消费者

在服务调用关系中&#xff0c;会有两个不同的角色&#xff1a; 服务提供者&#xff1a;一次业务中&#xff0c;被其它微服务调用的服务。&#xff08;提供接口给其它微服务&#xff09; 服务消费者&#xff1a;一次业务中&#xff0c;调用其它微服务的服务。&#xff08;调用…