Spring Web MVC基础第一篇

目录

1.什么是Spring Web MVC?

2.创建Spring Web MVC项目

3.注解使用

3.1@RequestMapping(路由映射)

3.2一般参数传递

3.3@RequestParam(参数重命名)

3.4@RequestBody(传递JSON数据)

3.5@PathVariable(获取URL中参数)

3.6@RequestParam(上传文件)


1.什么是Spring Web MVC?

Spring Web MVC 是 Spring 框架的一个模块,用于构建基于 Java 的 Web 应用程序。它遵循模型 - 视图 - 控制器(MVC)设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller),以实现关注点分离,提高代码的可维护性和可扩展性。

1.模型(Model)
是应用程序的主体部分,用来处理程序中数据逻辑的部分
2. 视图(View)
指在应用程序中专门用来与浏览器进行交互,展示数据的资源
3. 控制器(Controller)
可以理解为⼀个分发器,用来决定对于视图发来的请求,需要用哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即用来连接视图和模型

MVC 的工作流程
1. 用户通过界面操作向控制器发送请求。
2. 控制器接收请求后,调用模型的相关方法进行业务处理。
3. 模型处理完业务逻辑后,将数据返回给控制器。
4. 控制器根据返回的数据选择合适的视图,并将数据传递给视图。
5. 视图将数据呈现给用户。


Spring Web MVC是 Web 框架, 那么当用户在浏览器中输入了 url 之后,我们的 Spring MVC 项目就可以感知到用户的请求, 并给予响应.

咱们学习Spring MVC, 重点也就是学习如何通过浏览器和用户程序进行交互. 主要分以下三个方面:

1. 建立连接:将用户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调用到我们的Spring 程序。

2. 请求: 用户请求的时候会带⼀些参数,在程序中要想办法获取到参数, 所以请求这块主要是获取参数的功能.

3. 响应: 执行了业务逻辑之后,要把程序执行的结果返回给用户, 也就是响应.

2.创建Spring Web MVC项目

3.注解使用

Spring Web MVC的学习,主要就是学习注解

3.1@RequestMapping(路由映射)

@RequestMapping即可以修饰类也可以修饰方法,它是用来注册接口的路由映射的.表示服务收到请求时, 路径为 /sayHi 的请求就会调用 t1 这个方法的代码.

路由映射: 当用户访问⼀个 URL 时, 将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射.

我们通过在浏览器中输入http://127.0.0.1:8080/user1/t1便可访问到

127.0.0.1是换回地址,访问当前主机,8080是tomcat的端口号,tomcat集成在了Spring MVC项目里面

1.@RequestMapping 的URL 路径最前面加不加 / (斜杠)都可以, Spring程序启动时, 会进行判断, 如果前面没有加 / , Spring会拼接上⼀个 /
2.@RequestMapping 的URL路径也可以是多层路径, 最终访问时, 依然是 类路径 + 方法路径
3.@RequestMapping 既支持Get请求, 又支持Post请求. 同理, 也支持其他的请求方式.

@RequestMapping设置请求方式

@RequestMapping(value = "/t1",method ={RequestMethod.GET,RequestMethod.POST} )public String t1(){return "hello world";}

设置几个请求方式就在{}括号里面写几个请求方式

若不设置,则默认所有请求方式都可以

设置一个请求方式可不写{}

除此之外,还可以使用

@GetMapping()
@PostMapping()

表示只能使用get请求或post请求

    @GetMapping("/t2")public String t2(){return "GetMappiing";}@PostMapping("/t3")public String t3(){return "PostMapping";}

@GetMapping() @PostMapping()路径名可以相同,但方法名要不同

    @GetMapping("/m7")public String m7(){return "m7";}@PostMapping("/m7")
public String m8(){return "m8";}

3.2一般参数传递

传递字符串:

    @RequestMapping("t4")public String t4(String name){return name;}

传递整型:

    @RequestMapping("/t5")public Integer  t5(Integer age){return age;}

当使用包装类型传递参数时:参数为空时,返回结果为空

抓包发现状态码为200,能够正常放回


当不使用包装类传递参数时:当参数为空时

 @RequestMapping("/t6")public int t6(int age){return age;}

抓包发现状态码为500

对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null 所以企业开发中,对于参数可能为空的数据,建议使⽤包装类型

传递多个参数

    @RequestMapping("/t1")public String t1(String name ,Integer age){return "姓名:"+name+"     年龄:"+age;}

当有多个参数时,前后端进行参数匹配时,是以参数的名称进行匹配的,因此参数的位置是不影响后端获取参数的结果.

传递对象

如果参数比较多时, 方法声明就需要有很多形参. 并且后续每次新增⼀个参数, 也需要修改方法声明. 我们不妨把这些参数封装为⼀个对象.

package com.example.demo2;import org.springframework.web.bind.annotation.RequestMapping;@RequestMapping("/U2")
public class UserInfo {String name;Integer age;String gender;public UserInfo(String name, Integer age, String gender) {this.name = name;this.age = age;this.gender = gender;}public UserInfo() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}@Overridepublic String toString() {return "UserInfo{" +"name='" + name + '\'' +", age=" + age +", gender='" + gender + '\'' +'}';}
}
    @RequestMapping("/t2")public String t2(UserInfo userInfo){return "传递对象:"+userInfo.toString();}

Spring 会根据参数名称自动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, 比如int类型的属性, 会被赋值为0)

传递数组

    @RequestMapping("/t5")public String t5(String []str){return Arrays.toString(str);}

传递集合

集合参数:和数组类似, 同⼀个请求参数名有为多个, 且需要使用 @RequestParam 绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组. 如果要封装到集合,要使用@RequestParam 绑定参数关系

    @RequestMapping("/t6")public String t6(@RequestParam List<String> str){return str.toString();}

3.3@RequestParam(参数重命名)

在某些特殊的情况下,前端可能为了加密,传递给后端的数据名称五花八门,后端为了见名知意需要在使用时对前端传过来的数据进行重命名

我们就可以使用 @RequestParam 来重命名前后端的参数值

    @RequestMapping("/t3")
public String t3(@RequestParam("q") String name){return name;}

如果使用前端规定的名字,传递参数是没有问题的

但是如果使用后端重命名的名字传递参数,就会报错

状态码 400 也是一种常见的 HTTP 状态码,它表示客户端发送的请求存在错误,服务器无法理解或处理该请求。

结论:

1. 使用 @RequestParam 进行参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀致, 才能进行参数绑定和赋值.

2. 使用@RequestParam 进行参数重命名时, 参数就变成了必传参数.

查看@RequestParam的源码,我们可以看到required的默认值为true,这代表@RequestParam进行参数重命名时,参数为必传参数,将required修改为false,参数就为非必传参数

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//package org.springframework.web.bind.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {@AliasFor("name")String value() default "";@AliasFor("value")String name() default "";boolean required() default true;String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
}

当将required设置为false,非必传参数,传递参数为空就不会报错

   @RequestMapping("/t4")public String t4(@RequestParam(value = "q",required = false) String name){return name;}

3.4@RequestBody(传递JSON数据)

什么是JSON

JSON即JavaScript Object Notation,是一种轻量级的数据交换格式,以纯文本形式存储和传输数据,在前后端数据交互等场景广泛应用,以下是详细介绍:

数据结构

对象:是一个无序的“键 - 值”对集合以“{ }”包裹键和值之间用冒号“:”分隔,不同“键 - 值”对之间用逗号“,”分隔,比如`{"name": "Alice", "age": 25}` 。

数组:是值的有序集合,以“[ ]”包裹,值之间用逗号“,”分隔,值可以是字符串、数字、对象、数组等数据类型,例如`["apple", "banana", {"color": "red"}]` 。

语法规则

:必须是字符串。

:可以是双引号包裹的字符串、数值、true、false、null、对象或者数组。

特点

轻量级:相比一些其他数据交换格式(如XML),JSON数据格式简洁,文件体积小,在网络传输时能减少带宽占用,提高传输效率。

易于阅读和编写:JSON以人类可读的文本形式表示数据,对于开发人员来说,编写和理解都比较容易。

语言无关性:虽然名称中包含JavaScript,但JSON可以被多种编程语言解析和生成,如Java、Python、C#等,这使得它在不同语言编写的系统间进行数据交互时非常方便。

可以使用JSON检查器来判断JSON是否正确:JSON在线解析格式化验证 - JSON.cn

下面是一段JSON代码,可自行阅读,熟悉JSON语法

{
"squadName": "Super hero squad",//字符串
"homeTown": "Metro City",//字符串
"formed": 2016,//数字
"secretBase": "Super tower",//字符串
"active": true,//布尔类型
"members": [{//数组对象嵌套
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": ["Radiation resistance", "Turning tiny", "Radiation
blast"]
}, {
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": ["Million tonne punch", "Damage resistance", "Superhuman
reflexes"]
}, {
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": ["Immortality", "Heat Immunity", "Inferno",
"Teleportation", "Interdimensional travel"]
}]
}

JSON的语法:

1. 数据在 键值对(Key/Value) 中

2. 数据由逗号 , 分隔

3. 对象用 {} 表示

4. 数组用 [] 表示

5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象

集合嵌套:需要使用@RequestBody修饰,@RequestBody修饰是传递JSON数据,集合会被封装成数组,所以使用JSON使用[ ]

    @RequestMapping("/t7")public String t7(@RequestBody List<List<String>> list){
return list.toString();}

在Postman中,传递JSON数据,Body->raw->JSON

对象传递数据:

@RequestMapping("/t8")
public String t8(@RequestBody UserInfo userInfo){return  userInfo.toString();
}

请求方式为JSON

3.5@PathVariable(获取URL中参数)

path variable: 路径变量

和字面表达的意思⼀样, 这个注解主要作用在请求URL路径上的数据绑定

默认传递参数写在URL上,SpringMVC就可以获取到

@PathVariable可以对参数进行重命名,重命名后便不可以使用之前的参数名了

每一个需要使用参数都要使用@PathVariable修饰

@RequestMapping("/t9/{name}/{age}")
public String t9(@PathVariable String name,@PathVariable("age") Integer userAge){return "name:"+name+"  age:"+userAge;
}

3.6@RequestParam(上传文件)

    @RequestMapping("/m16")public String m16(@RequestParam("file11") MultipartFile file) throws IOException {System.out.println(file.getName());file.transferTo(new File("D:\\图片\\代码测试图片\\"+file.getOriginalFilename()));return "文件上传成功";}

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

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

相关文章

sobel边缘检测算法

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 Sobel边缘检测算法是一种用于图像处理中的边缘检测方法&#xff0c;它能够突出图像中灰度变化剧烈的地方&#xff0c;也就是边缘。该算法通过计算图像在水平方向和垂直方向上的梯度来检测边缘&#xff0c;梯度值越大…

Google Chrome-便携增强版[解压即用]

Google Chrome-便携增强版 链接&#xff1a;https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装&#xff0c;即可以覆盖更新又能解压使用&#xff01; √ 此增强版&#xff0c;支持右键解压使用 √ 加入Chrome增强…

分布式数据库架构与实践:原理、设计与优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 随着大数据和云计算的快速发展&#xff0c;传统单机数据库已难以满足大规模数据存储和高并发访问的需求。分布式数据库&…

设计模式Python版 桥接模式

文章目录 前言一、桥接模式二、桥接模式示例三、桥接模式与适配器模式的联用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&…

【C语言】main函数解析

文章目录 一、前言二、main函数解析三、代码示例四、应用场景 一、前言 在学习编程的过程中&#xff0c;我们很早就接触到了main函数。在Linux系统中&#xff0c;当你运行一个可执行文件&#xff08;例如 ./a.out&#xff09;时&#xff0c;如果需要传入参数&#xff0c;就需要…

CSS核心

CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签&#xff0c;在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方&#xff0c;但一般会放在文档的 <head> 标签中。 <style> div { color: r…

变量的作用域和生命周期

一、根据变量的作用域不同&#xff0c;可分为 局部变量 和 全局变量 1. 作用域&#xff1a;变量起作用的范围&#xff08;变量定义之后&#xff0c;在哪里可以访问变量&#xff09;。 就近原则&#xff1a;当不同作用域里面有两个或者多个同名变量&#xff0c;那么遵循就近原…

力扣【669. 修剪二叉搜索树】Java题解

一开始在想为什么题目说存在唯一答案。然后发现是二叉搜索树就合理了。如下图&#xff1a;如果0节点小于low&#xff0c;那其左子树也都小于low&#xff0c;故可以排除&#xff1b;对于4&#xff0c;其右子树也是可以排除。 代码如下&#xff1a; class Solution {public Tre…

论文阅读:Realistic Noise Synthesis with Diffusion Models

这篇文章是 2025 AAAI 的一篇工作&#xff0c;主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据&#xff0c;而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…

群晖Alist套件无法挂载到群晖webdav,报错【连接被服务器拒绝】

声明&#xff1a;我不是用docker安装的 在套件中心安装矿神的Alist套件后&#xff0c;想把夸克挂载到群晖上&#xff0c;方便复制文件的&#xff0c;哪知道一直报错&#xff0c;最后发现问题出在两个地方&#xff1a; 1&#xff09;挂载的路径中&#xff0c;直接填 dav &…

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…

全程Kali linux---CTFshow misc入门(25-37)

第二十五题&#xff1a; 提示&#xff1a;flag在图片下面。 直接检查CRC&#xff0c;检测到错误&#xff0c;就直接暴力破解。 暴力破解CRC的python代码。 import binascii import struct def brute_force_ihdr_crc(filename): # 读取文件二进制数据 with open(filen…

对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力

引言 引言部分引入研究主题&#xff0c;明确研究背景、问题陈述&#xff0c;并提出研究的目的和重要性&#xff0c;最后&#xff0c;概述研究方法和论文结构。 下面我们使用DeepSeek、ChatGPT4以及Kimi辅助引言撰写。 提示词&#xff1a; 你现在是一名[计算机理论专家]&#…

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

javaEE-6.网络原理-http

目录 什么是http? http的工作原理&#xff1a; 抓包工具 fiddler的使用 HTTP请求数据: 1.首行:​编辑 2.请求头(header) 3.空行&#xff1a; 4.正文&#xff08;body&#xff09; HTTP响应数据 1.首行&#xff1a;​编辑 2.响应头 3.空行&#xff1a; 4.响应正文…

OpenCV:闭运算

目录 1. 简述 2. 用膨胀和腐蚀实现闭运算 2.1 代码示例 2.2 运行结果 3. 闭运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 闭运算的应用场景 5. 注意事项 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 OpenCV&#xff1a;开运算-CSDN博客 1. 简述…

C++中的类与对象(下)

上一节我们将类与对象中一个比较难的也是一个比较重要的模块学习了&#xff0c;在这节主要是一些细节上的补充。 文章目录 目录 前言 一、初始化列表 初始化列表的性质 初始化列表的总结 二、类型转换 C中的类型转换 三、static成员 static的特点 一般情况下构造函数调用顺序&a…

Versal - 基础4(VD100+Versal IBERT)

1. 简介 在之前的一篇博文中&#xff0c;我分享了在 Zynq Ultrascale MPSoC 中使用 IBERT 的方法。 《Vivado - 集成眼图分析仪 Serial I/O IBERT 误码率_vivado ibert-CSDN博客》 本文进一步探讨 Versal 中使用 IBERT 的方法。 2. 硬件平台 芯片&#xff1a;XCVE2302-SF…

《HelloGitHub》第 106 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、…

英语语法 第一天

I’m a student. 我是个学生 我是个新东方的学生 I’m a student of New Oriental School 我爱你 I love you 我在心中爱你 I love you in my heart. 这是一朵花 This is a flower 这是一朵在公园里的花 This is a flower in the park.(修饰部分在修饰词后面) 主干…