《JavaEE进阶》----4.<SpringMVC①简介、基本操作>

本篇博客讲解

MVC思想、及Spring MVC(是对MVC思想的一种实现)。

Spring MVC的基本操作、学习了六个注解

@RestController注解

@RequestMappering注解

@RequestParam注解

@RequestBody注解

@PathVariable注解

@RequestPart注解

MVC

View(视图)

指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.

Model(模型)

是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.

Controller(控制器)

可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型。

CM相当于后端

V相当于前端。如今前后端分离。因此实际上我们已经不学V。虽然叫SpringMVC。

实际上我们学的是Spring Web。 


一、什么是SpringMVC 

官方解释:

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

MVC是⼀种架构设计模式,也⼀种思想,而SpringMVC是对MVC思想的具体实现.除此之外,Spring
MVC还是⼀个Web框架.
总结来说,SpringMVC是⼀个实现了MVC模式的Web框架.
所以,SpringMVC主要关注有两个点:
1. MVC
2. Web框架

Spring MVC全称是Spring Web MVC
在创建SpringBoot项⽬时,我们勾选的Spring Web框架
其实就是Spring MVC框架:

Spring实现了MVC这个思想。因此叫做SpringMVC。


二、在IDEA创建项目方式

和上文Springboot创建方式是一样的


三、学习SpringMVC(基本操作)

既然是Web框架,那么当⽤⼾在浏览器中输⼊了url之后,我们的 SpringMVC项⽬就可以感知到⽤⼾
的请求,并给予响应.
咱们学习SpringMVC,重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.
主要分以下三个⽅⾯:

 
3.1 建立+连接(两大注解):

使用@ReQuestMapping注解,设置网址中资源访问的部分。

3.1.1 @RequestMappering作用在类上

作用在类上就是类路径。

3.1.2 @RequestMappering作用在方法上

作用在类上就是方法路径。

如上图,访问时:类路径+方法路径

我们通常会加上类路径的,这样方便我们查找是哪里的问题出错。如果只有方法路径,不好找并且容易冲突。如果加上类路径,那么这个路径通常对应这个类名。因此方便我们找到对应的代码。

端口号是1208

因此它的访问地址就是127.0.0.1:1208/calc/sum

程序写好之后要建立连接

通过@RequestMappering注解和浏览器建立连接。是url的一个映射。通过这个还是不能成功建立连接。因为项目中会有很多文件代码。为了更方便Spring找到建立了连接的方法。

通过

3.1.3 @RestController注解

来告知程序这边代码里建立连接了

将⽤⼾(浏览器)和Java程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring程序。

注解括号中的 / 也可以不写。建议加上。

注:路径是不能重复的,不然会报错。  

3.2. 使用Postman请求:

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

我们可以通过postman来查看请求方式是get还是post 

通过浏览器访问的方式都是get。

Spring既支持get请求方式,又支持post请求方式。

后端请求时:使用postman或者浏览器,前端form表单等方式都可以。对于后端都是一样的。

也可以

使用Fiiddler

来查看请求和响应的数据

传入url,请求时可以设置请求方式、设置cookie 、添加参数

点击Send后我们可以查看响应、查看HTTP请求状态。

在body中,有

none:代表什么都没有 

form-data:代表form表单,有两种form表单形式,第一种是普通form表单,第二种可以上传一些图片、文件。

raw:表示请求体中的数据是原始的、未经过编码的数据。传递json数据就可以用到。

3.2..1指定请求方式 :

在@RequestMapping传入参数method = RequestMethod.GET可以指定请求方式为get,此时就只能通过get来进行请求而不能使用别的方式了。

如果使用别的方式请求,则会报错。405表示请求方式出错。

    @RestControllerpublic class HelloController {@RequestMapping(value = "/hello",method = RequestMethod.GET)public String hello(){return "呜呜呜zzx大笨蛋!!!!!!";}}

注解里双引号的值会赋值给value这个属性。如果对多个属性赋值,需要写上属性的名字。如果只有一个属性且为value,那么属性名字可以省略。如下图就省略了value这个属性名字。

按住ctrl点进去可以查看注解里有什么属性。

@RestController

@RequestMapping

3.2.2请求单个参数

注:不能使用基本类型。默认值为null。基本类型不支持。Spring范畴

方法名和路径我们可以保持一样也可以保持不一样,最好保持一样方便我们好找。

        @RequestMapping("/r1")public String r1(String name){return "接收到参数 name:"+name;}

定义参数要使用包装类型

        @RequestMapping("/r2")//注:传入数字类型不能使用int,因为int为基本数据类型,不能转换为空值// 其默认值不为null,我们需要将int写变为Integer。包装类型。public String r2(Integer age){return "age:"+age;}

我们使用postman来传入参数。

 3.2.2请求多个参数

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

 

3.2.3传入对象参数

添加有参构造函数时,记得把无参构造函数补上

首先新建一个类,对参数进行包装,利用get,set方法和toStirng方法。来进行构造。

注:这里可以使用基本类型,如int 默认值为0;java范畴。

package org.example.springbootdemo;public class UserInf {private Integer id;private String name;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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;}@Overridepublic String toString() {return "UserInf{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

使用刚刚新建的类,来传入类参数,返回一个toString方法。 

        @RequestMapping("/r4")public String r4(UserInf user){return user.toString();}

 传参与之前一样。 

 3.2.4参数重命名(@RequestParam注解)

        @RequestMapping("/r5")//重命名后,才能正常访问到url//必须传入正确的参数?name =  age =public String r5(@RequestParam("name") String username,Integer age){return "username:"+username+",age:"+age;}

我们需要重命名哪个参数就在哪个参数前使用@RequestParam注解。

前端传参时我们使用重命名的参数来传参,在后端操作时我们继续使用原来的名字 

注:加上@RequestParam注解重命名后的参数为必传参数。否则会报错400

若发生缓存错误我们进行clean。

 

从请求中获取name的参数,并赋值给username参数。

后端要用的话只能使用username,而前端那边使用name。 

令参数为非必传参数 (required = false)。

在@RequestParam注解的第二个参数传入

        @RequestMapping("/r5")//重命名后,才能正常访问到url//必须传入正确的参数?name =  age =public String r5(@RequestParam(value = "name",required = false) String username,Integer age){return "username:"+username+",age:"+age;}

3.2.5传递数组参数 

        @RequestMapping("/r6")public String r6(String[] arr){return Arrays.toString(arr)+"数组长度:"+arr.length;}

它可以是数组,也可以是字符串。 

 

如上图这样传,那么他就是一个数组。 

这样传那么就相当于传入字符串 

当我们有多个名字一个的参数时,会把他拼接成一个数组 

3.2.5传递集合参数(List<String> list)

集合参数:和数组类似,同一个请求参数名有为多个,但需要@RequestParam来绑定参数关系

如果我们这样写会发生500错误,服务器端错误,在传入集合类时,我们需要用到

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

@RequestParam注解来绑定list这个参数才可以。

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

注:加上@RequestParam注解的参数为必传参数,如果我们不想传参就可以令@RequestParam注解第二个参数为required = false。

        @RequestMapping("/r7")public String r7(@RequestParam(value = "list",required = false) List<String> list){return list.toString();}

 

如果定义集合为非必传,如果没有传入,此时如果运行,我们会发现会报一个500的错误,是因为此时list发生空指针异常。我们需要额外添加代码。 

        @RequestMapping("/r7")public String r7(@RequestParam(value = "list",required = false) List<String> list){if(list != null){return list.toString()+"size:"+list.size();}return "list为空";}

3.2.6传递json(@RequestBody注解)

Json(JavaScript Object Notation)【JavaScript对象表示法】

Json和JavaScript没有关系,只是语法相似。

简单来说:json就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON的本质是字符串,主要负责在不同语言中数据传递和交换。

Json的两种结构:

1.对象用{}表示

2.数组用[]表示

        @RequestMapping("/r8")public String r8(@RequestBody UserInf userInf){return userInf.toString();}

 

将{}中的参数转成了userinfo。传给了服务器。

区别是之前写的参数都是key,value的形式。

使用json传的是一个json字符串。也可以传入一个压缩的形式:

{"name":"张三","age":18,"id":120}

在企业开发中,用的最多的就是json和对象的方式,因为这两个扩展性很好。可以很好的增减参数。

注意:在body中raw中传入json数据时,如果params中还有参数存在,可以会影响json数据的传入。

用的最多的就是使用对象,和json的方式


3.2.7获取url中的参数 (@PathVariable注解)

 path variable:路径变量

必传参数,虽然可以修改required = false 我们尽量不去修改。

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

    @RequestMapping("/r9/{articleId}")public String r9(@PathVariable Integer articleId){return "articleId:"+articleId;}

对参数重命名 

    @RequestMapping("/r9/{article}")public String r9(@PathVariable("article") Integer articleId){return "article:"+articleId;

要注意红方框中的数据要保持一致。 


3.2.8上传文件(@RequestPart)

file.getOriginalFilename();返回文件原始名称

注解不加也可以运行成功,建议加上

    //虽然注解不加也可以,但是建议加上@RequestMapping("/r11")public String r11(@RequestPart MultipartFile file) throws IOException {String FileName = file.getOriginalFilename();//获取文件名file.transferTo(new File("J:/Test/"+FileName));//将此文件传到..目录下return "获取上传文件"+ file.getOriginalFilename();}

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

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

相关文章

四大名著改编的ip大作,一个巨亏2亿,一个狂赚20亿!选择决定成败!

最近讨论热度比较高的当属《红楼梦》和《西游记》了 胡玫导演的《红楼梦之金玉良缘》耗费了18年的心血&#xff0c;投资了2个多亿 却仅仅只有600万票房&#xff0c;还被网友调侃称“一黛不如一黛” 而由《西游记》改编的游戏《黑神话悟空》&#xff0c;研发10年投资6亿&…

【drools】Rulesengine构建及intelj配置

7.57.0.FinalRulesengineApplication 使用maven构建 intelj 打开文件资源管理器实在是太慢了所以直接把pom 扔到其主页识别为maven项目,自动下载maven包管理器 然后解析依赖: 给maven加一个代理 -DproxyHost=127.0.0.1 -DproxyPort=7890 还是卡主

机器人拾取系统关节机械臂通过NY-PN-EIPZ进行命令控制

关节机械臂是一种精密的机器&#xff0c;旨在模拟人类手臂在订单拣选操作中的运动。这些多功能机器人由多个关节组成&#xff0c;通常有 4 到 7 个轴&#xff0c;使它们能够高度自由地移动&#xff0c;并在仓库内以各种方向和位置接触物品。 制造工厂智能仓库系统中的关节机械臂…

Mobile-Agent项目部署与学习总结(DataWhale AI夏令营)

前言 你好&#xff0c;我是GISer Liu&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本文是DataWhale 2024 AI夏令营的最后一期——Mobile-Agent赛道&#xff0c;这是作者的学习文档&#xff0c;这里总结一下&#xff0c;和作者一起学习这个多模态大模型新项目吧&#x1f6…

AMEYA360 :“Radisol”,一款可改善智能手机Wi-Fi天线性能的村田电子新产品

株式会社村田制作所开发了村田首款(1)天线抗干扰器件‘Radisol’。Radisol是一款可配备到天线上来抑制无线性能下降的新产品&#xff0c;该产品已于2024年6月开始量产&#xff0c;并已用在Motorola Mobility LLC 2024年8月开始销售的智能手机“Edge系列”新机型。摩托罗拉通过采…

【Qt】垂直布局管理器QVBoxLayout

垂直布局管理器QVBoxLayout 在之前学习Qt的过程中&#xff0c;将控件放在界面上&#xff0c;都是依靠“手动”的方式来布局的&#xff0c;但是手动调整的方式是不科学的。 手动布局的方式非常复杂&#xff0c;而且不精确无法对窗口大小进行自适应 因此Qt引入布局管理器来解决…

缓存Mybatis一级缓存与二级缓存

缓存 为什么使用缓存 缓存(cache)的作用是为了减去数据库的压力,提高查询性能,缓存实现原理是从数据库中查询出来的对象在使用完后不销毁,而是存储在内存(缓存)中,当再次需要获取对象时,直接从内存(缓存)中提取,不再向数据库执行select语句,从而减少了对数据库的查询次数,因此…

无法启动此程序,因为计算机中丢失dll,整理了7种解决方法!

当电脑出现“无法启动此程序&#xff0c;因为计算机中丢失dll”的错误弹窗时&#xff0c;这通常意味着系统中的DLL文件出现了缺失或错误。DLL文件是动态链接库文件&#xff0c;它们在软件运行中起着至关重要的作用。 造成dll文件缺失和错误的原因有很多&#xff0c;大部分问题都…

python爬虫,使用pyppeteer异步,爬取,获得指定标签内容

获得指定 #pip install pyppeteer,使用 Pyppeteer&#xff08;异步方案&#xff09; import asyncio from pyppeteer import launch async def main():browser await launch()page await browser.newPage()await page.goto(http://xxx/#/login)# 等待页面加载完成await page…

算法-容斥原理

venn图&#xff1a; 如何求三个圆圈的面积之和&#xff1f; 此时&#xff0c;||不代表绝对值&#xff0c;代表集合的个数 解题思路&#xff1a; 实际上&#xff0c;我们不需要知道每个集合中的元素具体是什么&#xff0c;只需要知道每个集合的大小 例如 &#xff0c;表示10以…

Golang小项目(1)

Golang小项目(1) 前言 本项目适合Golang初学者,通过简单的项目实践来加深对Golang的基本语法和Web开发的理解。 建议前往 torna.top 查阅效果更佳 项目结构 . ├── main.go └── static├── form.html└── index.html项目流程图 定义三个路由: /:首页,显示static…

Windows隐藏起你的秘密文件以及文件夹工具

我们都知道&#xff0c;在 Windows 中可以右键文件夹&#xff0c;选择”属性“&#xff0c;勾选”隐藏“来实现隐藏某个文件夹。 我们还知道&#xff0c;在 Windows 中可以选择勾选 ”显示隐藏的项目和文件夹“&#xff0c;来使上述方法变得形同虚设。 本工具就是用于解决以上…

计算机网络模型

应用层 应用层的作用是为应用程序或用户请求提供各种请求服务。 该层协议定义了应用进程之间的交互规则&#xff0c;通过不同的应用层协议为不同的网络应用提供服务。例如域名系统DNS、支持万维网应用的HTTP协议&#xff0c;电子邮件系统采用的SMTP协议等。 表示层 表示层&…

记录|Form1中嵌套Form2时的频闪问题解决[不同于常见的三部曲]

目录 前言一、常见的解决方案二、自己创建渐变色组件GradientPanel三、最终效果展示更新时间 前言 参考文章&#xff1a; C#画图解决闪烁问题 [解决winform中重绘时控件闪烁的问题](panel1.GetType().GetProperty(“DoubleBuffered”,System.Reflection.BindingFlags.Instance …

东芝玉兔2.0明日震撼开售,洗衣机界的全新革命

明天&#xff0c;备受瞩目的东芝玉兔2.0 Pro洗烘套餐将正式开售。这款产品不仅在外观上采用了超薄全嵌的设计&#xff0c;梨川白的配色更是让人眼前一亮。更重要的是&#xff0c;它在功能上进行了全面升级&#xff0c;为用户提供了更全能的服务。 UFB超威跑2.0银离子除菌升级版…

JAVA中的线程池说明一

目录 1.为什么需要线程池? 2.什么是线程池? 3.标准库中的线程池 4.实现自定义线程池 1.为什么需要线程池? 线程的存在意义在于解决并发编程中进程开销过大的问题&#xff0c;因此引入了线程&#xff0c;也被称为"轻量级线程"。相比于创建进程&#xff0c;创建…

【学术会议征稿】第五届机械工程、智能制造与自动化技术国际学术会议(MEMAT 2024)

第五届机械工程、智能制造与自动化技术国际学术会议&#xff08;MEMAT 2024&#xff09; The 5th International Conference on Mechanical Engineering, Intelligent Manufacturing and Automation Technology 目前&#xff0c;我国自动化技术随着科学技术水平的不断提高已经…

功率器件和滤波器件的选型及测试方法

目录 一、功率器件的选型及测试方法 1.1功率器件的选型 1.2功率器件的测试方法 二、滤波器件的选型及测试方法 2.1滤波器件的选型 2.2滤波器件的测试方法 三、表格总结 一、功率器件的选型及测试方法 1.1功率器件的选型 在电子电路设计中&#xff0c;功率器件的选择是…

Mysql索引不当引发死锁问题

1. 前言 在并发量很低的情况下&#xff0c;mysql的响应时延一切正常&#xff0c;一旦并发量上去了&#xff0c;mysql就会出现死锁的情况&#xff0c;你有没有遇到过&#xff1f;到底是是什么原因导致的呢&#xff0c;让我们一起看看真实的案例。 2.遇到的问题 先介绍一下我们…

二进制、十进制转换进阶--小数点后的转换

上一篇文章详细介绍了整数的二进制,八进制,十进制,十六进制之间的转换 详情可前往:二进制、八进制、十进制、十六进制的相互转换-CSDN博客 这篇介绍含有小数点之间的转换 一:二进制转十进制 二进制 101.11 可以分为两部分 101 和 0.11 整数部分 101 转换的方式是从右到左,…