【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 {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 在请求到达Controller之前执行
        System.out.println("Pre Handle method is Calling");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // 在请求处理之后但视图未渲染前执行
        System.out.println("Post Handle method is Calling");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        // 在视图渲染之后执行
        System.out.println("Request and Response is completed");
    }
}

在配置类中注册拦截器:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public DemoInterceptor demoInterceptor() {
        return new DemoInterceptor();
    }

    @Override
    public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科研绘图(五)玫瑰图

柱状图的高级平替可视化 “玫瑰图”&#xff0c;通常也被称为“科克斯图”。它类似于饼图&#xff0c;但不同之处在于每个部分&#xff08;或“花瓣”&#xff09;的角度相同&#xff0c;半径根据它表示的值而变化。这种可视化工具对于周期性地显示信息非常有用&#xff0c;比…

bash shell基础命令(一)

1.shell启动 shell提供了对Linux系统的交互式访问&#xff0c;通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。 /etc/passwd/文件包含了所有用户的基本信息配置&#xff0c; $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ...例如上述root账户信…

使用 Apache POI 更新/覆盖 特定的单元格

使用 Apache POI 更新特定的单元格 一. 需求二. 实现三. 效果 一. 需求 将以下表中第4行&#xff0c;第4列的单元格由“张宇”更新为“汤家凤”&#xff0c;并将更行后的结果写入新的Excel文件中&#xff1b; 二. 实现 使用Apache POI&#xff0c;可以精确定位到需要更改的单…

非递归实现归并排序

目录 非递归的归并排序 非递归的归并排序 实现流程参考图&#xff1a; 1、像递归实现归并排序一样&#xff0c;开辟n个空间大小的临时数组 2、利用变量gap模仿递归的过程&#xff0c;gap表示归并时的每组数据的个数 3、利用while循环实现归并&#xff0c;并且每一次我们要的…

鸿蒙开发笔记(三):页面和自定义组件生命周期

先明确自定义组件和页面的关系&#xff1a; 自定义组件&#xff1a;Component装饰的UI单元&#xff0c;可以组合多个系统组件实现UI的复用。 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c…

Linux环境基础开发工具的使用(下)

文章目录 Linux编译器 - gcc/ggcc/g如何使用预处理阶段编译阶段汇编阶段链接阶段gcc选项汇总静态库与动态库gdb命令汇总 Linux项目自动化构建工具 - make/Makefilemake/Makefile的意义使用make/makefile原理 Linux编译器 - gcc/g 背景知识 我们知道一个代码写完要变为可执行程…

OpenHarmony—编译构建指导

概述 OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统&#xff0c;该系统提供以下基本功能&#xff1a; 以部件为最小粒度拼装产品和独立编译。支持轻量、小型、标准三种系…

大厂咋做支付系统的核对?

核对是保障资金安全的重要机制。 时效角度&#xff0c;主要有&#xff1a; &#xff08;准&#xff09;实时核对 准确性不如离线核对&#xff0c;且需相应实时核对平台建设 离线核对&#xff08;如 T1 核对&#xff09; 主要问题是发现问题的时机较为后置&#xff0c;部分场景…

微信小程序-----全局配置与页面配置

目录 前言 全局配置文件 一、window 1. 小程序窗口的组成部分 2. window 节点常用的配置项 3. 设置导航栏的标题 4. 设置导航栏的背景色 5. 设置导航栏的标题颜色 6. 全局开启下拉刷新功能 7. 设置下拉刷新时窗口的背景色 8. 设置下拉刷新时 loading 的样式 9. 设置…

蓝桥杯备赛 | 洛谷做题打卡day2

​ 蓝桥杯备赛 | 洛谷做题打卡day2 嵌套循环yyds&#xff01;&#xff01; 题目来源&#xff1a;洛谷P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷&am…

跨域请求的API接口调用流程

在Web开发中&#xff0c;前端和后端相互通信是非常常见的需求。通常情况下&#xff0c;前端通过发送HTTP请求调用后端的API接口来获取数据或执行某些操作。然而&#xff0c;由于同源策略的限制&#xff0c;浏览器默认情况下不允许跨域请求&#xff0c;即前端不能直接从一个域名…

48 WAF绕过-权限控制之代码混淆及行为造轮子

目录 Safedog代码层手写及脚本绕过BT Aliyun代码层手写及脚本绕过safedog&#xff0c;BT&#xff0c;Aliyun-基于覆盖加密变异下编码解码绕过-代码层Safedog&#xff0c;BT&#xff0c;Aliyun-基于冰蝎新型控制器绕过全面测试-行为层Safedog,BT,Aliyun-基于手写新型控制器绕过全…

添加 自定义校验方法,让用户自定义校验规则

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 添加 常用校…

软件设计师4--寻址方式

软件设计师4--寻址方式 考点1&#xff1a;指令的基本概念考点2&#xff1a;寻址方式例题&#xff1a; 考点1&#xff1a;指令的基本概念 一条指令就是机器语言的一个语句&#xff0c;它是一组有意义的二进制代码&#xff0c;指令的基本格式如下&#xff1a; 操作码字段地址码…

SpringCloud全链路灰度发布

日升时奋斗&#xff0c;日落时自省 目录 1、实现框架 2、负载均衡模块 3、封装负载均衡器 4、网关模块 5、服务模块 5.1、注册为灰度服务实例 5.2、设置负载均衡器 5.3、传递灰度标签 1、实现框架 Spring Cloud全链路灰色发布实现构架&#xff1a; 灰度发布的具体实现…

【C++ Primer Plus】2.1 进入C++

代码示例 #include <iostream> // a preprocessor directive 预处理器指令 int main () // function header { // start of function bodyusing namespace std; // make definitions visiblecout << "hello!"; // message…

动态路由综合实验-RIP

一.要求 1、R1--R3地址为192.168.1.0/24:请合理分配 2、R3的环回为3.3.3.0/24&#xff0c;该网段不能在rip中宣告 3、整个网络使用RIPV2&#xff0c;全网可达&#xff0c;路由表汇总&#xff0c;防止环路&#xff0c;保障更新安全&#xff0c;加快收敛速度 网络拓扑结构&…

服务器感染了.DevicData-P-XXXXXXXX勒索病毒,如何确保数据文件完整恢复?

引言&#xff1a; 在当今数字化时代&#xff0c;勒索病毒已成为网络安全威胁的一个严峻问题。其中&#xff0c;.DevicData-P-XXXXXXXX 勒索病毒以其恶意加密文件的手段引起了广泛关注。本文将介绍该病毒的特点、数据恢复方法以及如何预防遭受其攻击。 如不幸感染这个勒索病毒&…

workflow源码解析:ThreadTask

1、使用程序&#xff0c;一个简单的加法运算程序 #include <iostream> #include <workflow/WFTaskFactory.h> #include <errno.h>// 直接定义thread_task三要素 // 一个典型的后端程序由三个部分组成&#xff0c;并且完全独立开发。即&#xff1a;程序协议算…

【机器学习入门】机器学习基础概念与原理

*&#xff08;本篇文章旨在帮助新手了解机器学习的基础概念和原理&#xff0c;不深入讨论算法及核心公式&#xff09; 目录 一、机器学习概念 1、什么是机器学习&#xff1f; 2、常见机器学习算法和模型 3、使用Python编程语言进行机器学习实践 4、机器学习的应用领域 二…