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

详解Java之Spring MVC篇一

目录

Spring MVC

官方介绍

MVC

RequestMapping

传递参数 

无参数

单个参数

针对String类型

 针对Integer类型

针对int类型

针对自定义类型

多个参数

参数重命名

参数强制一致

参数不强制一致

传递数组

​编辑传递List

​编辑

传递JSON

​编辑

从路径中获取参数

获取单个参数

 获取多个参数

​编辑

上传文件


Spring MVC

官方介绍

翻译:

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为“Spring MVC”。 

MVC

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分。

Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。
Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。

MVC和Spring MVC的区别

MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。
总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web 框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的 Spring MVC 项⽬就可以感知到⽤户的请求。 

RequestMapping

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路
由映射的。

路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类的某个⽅法的过程就叫路由映射。 

@RequestMapping 即可修饰类,也可以修饰⽅法,当修饰类和⽅法时,访问的地址是类 + ⽅法。 

@RequestMapping是处理get请求还是处理post请求的?

@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello, Spring mvc";}
}

使用get请求 

使用post请求

我们发现, @RequestMapping既能处理get请求也能处理post请求。

传递参数 
无参数
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello, Spring mvc";}
}

结果:

单个参数
针对String类型
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/r1")public String r1(String name){return "接收到参数,name:"+name;}
}

正确传参的结果: 

不传递参数的结果(结果为null):

传递错误参数的结果(结果为null):

由此我们知道,传递单个参数时,参数名必须保持一致!!!

 针对Integer类型
@RequestMapping("/r2")
public String r2(Integer age){return "接收到参数,age:"+age;
}

 正确传参的结果:

 错误传参的结果(结果为null):

不传参的结果(结果为null):

由此我们知道,对于Integer类型的参数,当不传参数时,默认值为null,如果传参名字不一致,值也是默认值null。 

针对int类型
@RequestMapping("/r3")
public String r2(int age){return "接收到参数,age:"+age;
}

正确传参的结果:

错误传参的结果(错误码500) :

不传参的结果(错误码500):

由此我们知道,对于int类型的参数, 如果传参的参数名不一致时,会报错且错误码为500;如果不传参,也会报错且错误码为500,这一点与int的包装类型Integer不一样!!!

针对自定义类型
@RequestMapping("/r5")
public String r5(Student student){return "接收到参数,student:"+student;
}

正确传参的结果: 

部分传参的结果:

错误传参的结果:

由此我们知道,针对自定义类型,如果不传参也不会报错,包装类型参数的默认值为null,如果传参类型不匹配会报错!!!

多个参数
@RequestMapping("/r4")
public String r4(String name,Integer age){return "接收到参数,name:"+name+",age:"+age;
}

参数重命名
参数强制一致
@RequestMapping("/r6")
public String r6(@RequestParam("name") String userName){return "接收到参数,name:"+userName;
}

正确传参的结果:

不传参的结果(错误码400):

 错误传参的结果(错误码400):

由此我们知道,当参数重命名之后,默认要求该参数必须传参,否则会报错!!! 

参数不强制一致
@RequestMapping("/r7")
public String r7(@RequestParam(value = "name",required = false) String userName){return "接收到参数,name:"+userName;
}

正确传参的结果:

错误传参的结果(结果为null):

不传参的结果(结果为null):

由此我们知道,当参数重命名之后,添加required=false之后,该参数就不要求必须传递了. 

传递数组
@RequestMapping("/r8")
public String r8(String[] array){return "接收到参数,array:"+ Arrays.toString(array);
}

可以这样传递:

也可以这样传递:

传递List
@RequestMapping("/r9")
public String r9(List<String> list){return "接收到参数,list:"+list;
}

响应:

 解决方法

@RequestMapping("/r9")
public String r9(@RequestParam(required = false) List<String> list){return "接收到参数,list:"+list;
}

响应:

由此我们知道,当参数类型时List类型时,必须添加@RequestParam注解,否则会报错且错误码为500。

传递JSON
@RequestMapping("/r10")
public String r10(@RequestBody Student student){return "接收到参数,student:"+student;
}

响应:

通过fiddler抓包:

原因分析:

是因为它把Json字符串当成了一个不可拆分的整体,所以这样拿不到传递的参数。

解决办法: 

@RequestMapping("/r10")
public String r10(@RequestBody Student student){return "接收到参数,student:"+student;
}

响应:

由此我们知道,当传递Json字符串时,必须添加@RequestBody注解!!!

从路径中获取参数
获取单个参数
@RequestMapping("/article/{articleId}")
public String r11(Integer articleId){return "接收到参数,article:"+articleId;
}

响应(出错):

解决方法,使用@PathVariable注解。

@RequestMapping("/article/{articleId}")
public String r11(@PathVariable("articleId") Integer articleId){return "接收到参数,article:"+articleId;
}

响应:

关于为什么需要加@PathVariable("articleId"),这里有几个关键点:

1.明确性:@PathVariable注解明确指出了哪个URL模板变量应该被绑定到方法的哪个参数上。虽然Spring MVC也可以尝试通过参数名来自动匹配(如果参数名与URL模板中的变量名相同),但使用@PathVariable增加了代码的清晰度和明确性。

2.灵活性:在某些情况下,URL模板中的变量名可能与你想在控制器方法中使用的参数名不同。通过@PathVariable,你可以指定一个不同的参数名,这提供了额外的灵活性。

3.可读性:对于阅读代码的人来说,@PathVariable注解使得URL模板变量到方法参数的绑定一目了然,有助于理解代码的功能和目的。

4.强制类型转换:@PathVariable注解允许你指定参数的类型(如Integer),这意味着Spring MVC会尝试将URL模板变量的值转换为指定的类型。如果没有这个注解,你可能需要手动进行类型转换。

5.必需性:虽然在这个特定示例中@PathVariable可能看起来不是绝对必需的(因为参数名与URL模板变量名相同),但在更复杂的URL模板或更复杂的控制器方法中,使用@PathVariable可以确保你的代码更加健壮和易于维护。

 获取多个参数
@RequestMapping("/article/{articleId}/{name}")
public String r12(@PathVariable("articleId") Integer articleId,@PathVariable("name") Integer name){return "接收到参数,article:"+articleId+",name:"+name;
}

响应:

在通过路径获取参数时,如果从路径中获取多个参数,传参时必须每个都传递,否则会报错,因为不知道是哪个/哪些参数没有传递!!!

上传文件
@RequestMapping("/r13")
public String r13(@RequestPart("file")MultipartFile file){String originalFilename=file.getOriginalFilename();return "接收到参数,文件名称:"+originalFilename;
}

响应:

在上传文件时,文件不能太大,否则会上传失败!!! 

 

  • 欢迎您在主页查看我的更多文章--》主页链接
  • 欢迎您订阅我的博客专栏--》专栏链接

相关文章:

详解Java之Spring MVC篇一

目录 Spring MVC 官方介绍 MVC RequestMapping 传递参数 无参数 单个参数 针对String类型 针对Integer类型 针对int类型 针对自定义类型 多个参数 参数重命名 参数强制一致 参数不强制一致 传递数组 ​编辑传递List ​编辑 传递JSON ​编辑 从路径中获取参…...

ubuntu20.04上使用 Verdaccio 搭建 npm 私有仓库

安装nvm 首先安装必要的工具&#xff1a; apt update apt install curl下载并执行nvm安装脚本&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash添加环境变量&#xff08;如果安装脚本没有自动添加&#xff09;。编辑 ~/.bash…...

Python实现办公自动化的数据可视化与报表生成

在 Python 中&#xff0c;可以利用多个库来实现办公自动化中的数据可视化与报表生成。以下是具体的方法&#xff1a; 一、数据可视化 使用 matplotlib 库 matplotlib 是一个强大的 Python 绘图库&#xff0c;可以创建各种类型的静态、动态和交互式图表。示例代码&#xff1a;i…...

前端知识串联笔记(更新中...)

1.MVVM MVVM 是指 Model - View - ViewModel&#xff0c;Model 是数据与业务逻辑&#xff0c;View 是视图&#xff0c;ViewModel 用于连接 View 和 Model Model ---> View&#xff1a;将数据转化成所看到的页面&#xff0c;实现的方式&#xff1a;Data Bindings -- 数据绑定…...

PostgreSQL根据字符串的长度排序

PostgreSQL根据字符串的长度排序 在 PostgreSQL 中&#xff0c;你可以使用 LENGTH 函数来获取字符串的长度&#xff0c;并根据这个长度进行排序。LENGTH 函数会返回字符串的字符数。 以下是一个基本的 SQL 查询示例&#xff0c;它根据 some_column 字符串列的长度对表中的行进…...

计算机网络:网络层 —— IP数据报的发送和转发过程

文章目录 IP数据报的发送和转发过程主机发送IP数据报路由器转发IP数据报示例 IP数据报的发送和转发过程 IP 数据报的发送和转发过程包含以下两个过程&#xff1a; 主机发送IP数据报路由器转发IP数据报 直接交付&#xff1a;源主机与目的主机在同一网络中间接交付&#xff1a;…...

【算力基础】GPU算力计算和其他相关基础(TFLOPS/TOPS/FP32/INT8...)

文章目录 :one: 算力的常见指标:two: 算力计算:three: 常用链接 &#x1f680; 本文主要是聚焦于深度学习领域的 GPU的算力估计&#xff0c;其他类型的硬件设备如CPU可以类比参考。 1️⃣ 算力的常见指标 算力衡量主要与运算速度和精度这两个指标有关。 &#x1f314;速度指…...

UI自动化测试(app端)4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…...

C#与C++交互开发系列(十):数组传递的几种形式

前言 在C#和C的交互开发中&#xff0c;数组传递是一个非常常见且实用的场景。数组可以作为方法的参数&#xff0c;也可以作为响应结果返回。在本篇博客中&#xff0c;我们将探讨几种常见的数组传递方式&#xff0c;展示如何在C#与C之间进行有效的数据交换。我们将主要介绍以下…...

【C++复习】第一弹-基础性语法

前言 学习了C语法这么久了&#xff0c;我其实觉得&#xff0c;我们学习一门语言应该更加注重使用性&#xff0c;对于语法的细节可以通过具体的项目去重新造轮子的时候再去抠细节&#xff0c;也就是说你得学会先走&#xff0c;在去想我们如何走的&#xff0c;身体的哪些肌肉在发…...

软考高级备考记录

一 报考条件和报名流程 报考条件 该考试具有水平考试性质&#xff0c;报考任何级别不需要学历、资历条件&#xff0c;只要达到相应的专业技术水平就可以报考相应的级别 报名流程 软考报名官网&#xff1a;中国计算机技术职业资格网 官网上有 报名时间&#xff0c;考试…...

图为大模型一体机新探索,赋能智能家居行业

在21世纪的今天&#xff0c;科技的飞速进步正以前所未有的速度重塑着我们的生活方式。从智能手机到物联网&#xff0c;从大数据到人工智能&#xff0c;每一项技术创新都在为人类带来前所未有的便利与效率。其中&#xff0c;图为AI大模型一体机作为人工智能领域的最新成果&#…...

精氨酸/赖氨酸多肽(芋螺肽)

产品简介&#xff1a; 芋螺肽&#xff0c;源自瑞士尖端科技&#xff0c;是一种模拟芋螺毒素的生物活性肽。它以其独特的分子结构和高选择性作用于电压门控钠离子通道&#xff08;特别是Nav1.4&#xff09;&#xff0c;为您提供安全、自然且不僵硬的回春效果。芋螺肽&#xff0…...

C++音视频04:音视频编码、生成图片

视频编码 #include <libavutil/log.h> #include <libavutil/opt.h> #include <libavcodec/avcodec.h>static int encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt, FILE *out) {int ret -1;ret avcodec_send_frame(ctx, frame);if (ret < …...

ImageSharp报错

错误信息 System.MissingMethodException: Method not found: System.Span1<SixLabors.ImageSharp.PixelFormats.Rgba32> SixLabors.ImageSharp.Memory.Buffer2D1.GetRowSpan(Int32).需要升级项目 原来仅升级了SixLabors.ImageSharp没有升级drawing&#xff0c;都升级到…...

Android中常用adb命令

目录 1.adb连接安卓模拟器 2.adb列出所有已经连接的设备 3.adb显示设备的日志信息 4.adb 电脑文件推送到安卓模拟器中 5.adb 手机传送文件到电脑 6.adb获取安卓应用的包名和Activity名 附录 1--命令 1&#xff09;adb devices 2&#xff09;adb install 路径> 3&#xff09;…...

PostgreSQL的奥秘:全面解读JSONB——非结构化数据支持的深入探索

引言 PostgreSQL的JSONB数据类型非常灵活&#xff0c;提供了一套操作符来操作JSON数据。本指南将引导您创建一个包含JSONB数据的表&#xff0c;演示各种JSONB操作符&#xff0c;并讨论如何使用倒排索引和部分索引来优化性能。 理解PostgreSQL中的JSONB JSONB&#xff0c;即JS…...

tornado,flaskd这两个框架主要是干什么的

Tornado是一个Python的Web框架&#xff0c;主要用于构建高性能的异步Web应用程序。它基于非阻塞的网络I/O模型&#xff0c;可以处理大量并发连接&#xff0c;适用于需要处理实时性要求较高的应用场景&#xff0c;如实时聊天、实时数据推送等。 Flask是另一个Python的Web框架&a…...

Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导

Sigrity Power SI Noise coupling analysis模式如何进行压降仿真分析操作指导 Sigrity除了可以进行交流噪声分析,同样也可以进行压降仿真分析,以下图为例. 3D view...

国产游戏技术能否引领全球?

国产游戏技术能否引领全球&#xff1f; 引言 近年来&#xff0c;中国游戏产业如同春天的嫩芽&#xff0c;迅速成长为全球最大的市场之一。或许你会想&#xff0c;国内的游戏开发者到底在技术上取得了多大的成就&#xff1f;这些成就又能否推动中国游戏走向世界&#xff0c;甚…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...