Spring Web MVC(常用的注解@RequestMapping,@RequestParam,@RequestBody等)

一、Spring MVC

spring的启动类

启动类是看这个 @SpringBootApplication 注解,而不是 类的名字

这个注解在哪,哪个类就是启动类

1.MVC思想

举例

二、Spring MVC

mvc 是一种思想,而spring mvc是对mvc思想的一种实现。全称是 spring web mvc,基于servlet API 构建的web的框架。 

spring mvc看一看作称一个模块,被包含在 spring框架中。

1、建立连接

1)@RequestMapping(“/路径名”):使用这个注解,建立连接

1.1作用域
1.1.1 作用在 方法 上(访问 直接使用 方法路径 即可)

在 demo 包里,创建一个UserController 类,写一个return hello 的方法,在方法前给上 注解 @RequestMapping(‘/hello’)

启动服务器后,发现并没有访问到

原因是,在项目中会有很多个方法,spring不会一个一个检查每一个方法前面是否有 @RequestMapping注解,所以在这里报错了。

在类的前面加上 @RestController

然后就能正常显示了

1.1.2 作用在 类 上(访问路径就成了 类路径+方法路径)

在 user controller类前,加上@RequestMapping 注解

(多个注解之间无优先顺序之分,同时生效)

再用之前的hello路径访问,就没有效果了

 此时需要加上 类 的路径,就能成功访问了

访问的路径,可以是多层的

同时在以往servlet 里,路径里的里的第一个 / ,是要加上的。

但是在 spring 里,这第一个 / ,可加可不加,一样是能正常访问的。

建议还是加上

1.2 请求方式 get 和 post 都支持

使用postman 发送get 和post请求,再用fiddler 抓包

发现 @RequestMapping  这两种方法(get 和post) 都可以

postman的简单介绍

2)指定请求方式

        既然 get 和 post 两种方式都支持,那如果有些方法只能通过某种特定的方式访问,不希望通过其他方式访问的时候,就可以指定HTTP请求方式。 

指定请求方式:

@RequestMapping(value = “/路径名”,method = RequestMethod.方法名)

在括号里,=左边 为属性名,=右边为属性值,多个属性之间使用逗号隔开

@RequestMapping 里的属性

给注解里,指定HTTP请求方法为 get


 

重新启动之后

        get请求能正常拿到返回值 hello

        此时post请求,无法访问了,提示 method not allowed(方法不被允许),就是说请求方式错了。

        这也说明了,指定方法get之后,只能通过get访问了

2、发送请求 @RestController

2.1请求

2.1.1 请求单个参数

例子1:

例子2:

假设没有传参进去,会有怎样的效果

  服务器错误

5开头错误一般是服务器问题,查看后端日志,找问题

(一段一段看,从后往前看,看每段的第一行)

因为定义方法中参数类型是基本类型 int,所以访问的url不写参数是,默认被当作null空值,发送请求了。

        而 null,无法传入到 int 类型中,所以报错了

修改代码,将参数类型改为包装类型 Integer

再次试验

这次就正常响应了

2.1.2 传递多个参数

在接收多个参数时,url地址栏传参的顺序可以变化

 只需要保证这里的属性名相同就行

2.1.3 当参数比较多的时候,可以创建一个对象,作为传入参数 

例如现在要传递的参数有 Integer id,String name,Integer age

此时创建一个对象 UserInfo 

在直接传参时,使用基本数据类型,如果 url里没有写参数,会报错。只能写包装类型。

(2.1.1 请求单个参数 例子2)

        而传递的参数是 对象 时,可以使用基本数据类型

当 传递对象的 id 数据类型是 Integer 时,不传id,返回的是null

当把 Integer 修改为 int 基本类型时,不会报错,返回的是 0 (默认值)

2.2 对参数重命名@RequestParam("新名字")

2.2.1 重命名后,用新名字访问,否则报错 400

原本传递的参数名应该是 usernmae,但是修改为 name后

在url地址栏就应该是 name了

使用重命名后的参数名 name 就可以访问了

当使用原来的参数名username访问时,报错 400

2.2.2 重命名后,默认该参数成为必传项,不传会报错 400;也可修改为非必传项 required = false ;

修改 required = false ,就可以不用传这个参数了

修改为非必传项后,不传递该参数,就不会报错了

 2.3 请求参数为数组 

第一种传递方式:一个参数里有多个值

第二种传递方式:有多个参数名相同的值传递时

2.4 请求参数为 顺序表 List(集合@RequestParam 来绑定参数关系)

发现报错500 ,服务器这边出现问题 

 

查看日志

对于list接口,没有找到构造函数

原因是:spring中规定了,请求中相同参数名的多个值,默认封装到数组。要想封装到集合,需要用 @RequestParam 来绑定参数关系

而这里的请求参数为list,是集合,所以要用 @RequestParam 绑定list

修改代码

发现绑定list之后,能正常访问了

同样的,加上 @RequestParam注解之后,该参数默认就为必传项了,不传会报错

如果想修改为 非必传项,就需要 加上 requeired = false

但是发现 现在又是 500 的错误了,解决完400的错误,现在是服务器端的错误了

查看日志

错误原因,list是null空指针

于是在服务器代码里,添加一个空指针的判断

解决问题了

2.5 传递 JSON 数据

         json是一个字符串,key : value这样的键值对,key 只能是字符串(引号引起来的),而value可以是字符串、数字、布尔、数组、list等;多个键值对之间用 都好分隔

对象用{}表示,数组用[]表示,json就是用{}或者[],将键值对包含起来的

        在工作中广泛使用

JSON对象的创建

请求 Json 数据 @RequestBody

直接在 Params这里是没有用的,报了400的错误,客户端这边的问题,传递数据的方式有问题

查看日志

发现请求正文没有

重新传递正确Json数据

2.6 请求 URL 中的参数 @PathVariable

常见的网站也可能使用这样的方式,例如CSDN、今日头条

{}里面是定义的路径

2.6.1单个路径变量

 2.6.2多个路径变量

要按照这个路径规则访问,才能正常访问 假设不按照规则访问,例如故意将类型为Integer 的 age写成 字符

就会发生错误

2.6.3 同时被 @PathVariable 注解 修饰后,也会变成 必填项

如果不填也会报错

2.6.4 重命名

2.7 上传文件 @RequestPart

2.7.1 获取原始文件名 .getOriginalFilename()

代码中的 MultipartFile 是文件的类型,自定义文件名为 file

在下面这张图测试发送请求的时候, key 也要与这里的 file 对应上

2.7.2 将获取的到的文件,转移到新的目录下 .transferTo

目的路径下找到了该文件

测试了 ,不加注解 @RequestPart 也能正常上传,但是还是建议加上,不然不知道以后会不会有其他的问题。

重命名之后,新的名字newfile 也要与 请求中的 key值 newfile 对应上,否则就会出现以下的错误

正确请求应该是 newfile

2.8 获取 cookie 和 session

2.8.1 cookie和session的概念
cookie和 session

举例:

1.用户提供账号和密码,服务器进行验证

2.服务器验证通过,会把信息存储在session中,并且把 sessionId 返回给客户端(通过set - Cookie 的方式)

3.客户端收到响应,吧sessionID 存储在Cookie中

4.后续的请求中,客户端带着SessionId 去请求(带着 Cookie 信息去请求)

共同点:

都是会话机制

区别:

1.虽然都是保存用户信息的一种机制,但是

        cookie是客户端机制

        session是服务器机制

2.cookie 和 session 主要是通过 session ID 关联起来的,session ID 是cookie 和 session 之间的桥梁。

3.cookie 和 session 通常是一起出现配合使用的,但不是必须配合。

        完全可以用 cookie 来保存一些数据在客户端。这些数据不一定是用户身份信息,也不一定是sessionID。

        session 中的 sessionID 也不需要非得通过 Cookie/set-Cookie 传递,比如通过URL 传递。

2.8.2 获取cookie
2.8.2.1 传统方式 servlet 获取 cookie

启动之后,发现报错了

查看日志,发现是空指针问题

修改代码

可以在浏览器设置cookie

再次刷新,成功获取到 cookie了

在日志中可以看到获取的cookie 值,这个就是刚才在浏览器中设置的cookie值

在postman里也可以设置cookie

2.8.2.2 Springboot 获取 cookie (使用注解@CookieValue)

传统的方式 :使用 servlet 获取 cookie 是获取到的所有的 cookie

而 spring boot 只能获取一个 特定的 cookie,使用注解 @CookieValue("对应的cookie名")

现在有两个Cookie

先使用 传统方式 获取所有cookie

在日志里看到了所有的 cookie

再使用 spring boot 的方式 获取 指定的 ameris 这个cookie

获取成功

 2.8.3 获取session
2.8.3.1 传统方式获取 session

 

一开始获取 session 为空

设置 session 的 参数之后

就能成功获取到 session了

 2.8.3.2 Spring boot方式获取 session (使用注解 @SessionAttribute)

发现报错了

原因是 加上注解之后,session里面这个 userName属性 变成必传项了,如果不传就会报错

修改代码

2.9 获取 header

 2.9.1 传统方式获取 header(HttpServletRequest )

当使用postman发送请求时,获取的User-Agent(用户代理:显示请求时所用的浏览器相关信息)就是 postman

使用谷歌浏览器,响应的就是谷歌浏览器的相关信息

  2.9.2 Spring boot方式获取 header(使用注解 @RequestHeader("要获取的字段名"))

总结 请求的几个注解

@RestController 在代码最前面写上,将方法返回的结果直接作为响应内容发送到客户端。(只返回数据,不返回页面)

@RequestMapping("/路径名") 通过URL进行路由映射 。既是类注解,又是方法注解。

访问的URL路径 = 类路径+方法路径

指定请求方式:@RequestMapping(value = “/路径名”,method = RequestMethod.方法名)

@RequestParam(“重命名参数”)和绑定(“绑定集合类型对象比如List”)

@RequestBody 请求Json格式数据

@PathVariable 请求URL 中的变量

@RequestPart 上传文件

获取cookie

传统使用servlet获取所有的cookie,spring使用的是@CookieValue(“cookie”) 获取指定的cookie

获取session

传统使用servlet,spring使用的是@SessionAttribute(“session的字段名”)获取session会话中指定的字段

获取header

传统使用servlet,spring使用的是@RequestHeader(“header的字段名”)获取header会话中指定的字段

3.响应 @Controller

3.1 返回静态页面

先在static包下写一个index页面

在浏览器直接访问这个页面的方法

static目录下的页面,直接写在  “127.0.0.1:端口号/"  后面

如果 static目录下还有文件夹,则需要写上 文件夹名/页面名

写了响应代码,最开始使用@RestController

期望的结果是,响应index这个页面内容

这里的 /index.html中 的 / ,指的是127.0.0.1:端口号

 

当访问r1时,响应的不是 index页面 ,而是一个字符串

然后将注解改成 @Controller

发现返回了正确的 index页面

3.1.2 @Controller  与 @RestController 的区别

@RestController源码

@Target 指的是使用范围 。TYPE指的是类,METHOD指的是方法。

@Retention 指的是生命周期。

SOURCE:生命周期为编译期间。 CLASS:类中存活。 RUNTIME:代码运行期间。(最长寿)

@Document 指的是一些文档。

前面三个注解是 元注解,就是能给其他注解前面注解。

@Controller 默认返回的是页面
@RestController = @Controller (管理spring中的代码)+ @ResponseBody(仅返回数据本身)

所以在最开始,使用@RestController,原本期望返回index页面,结果只返回了数据本身,也就是 “/index.html” 这个字符串。

在改成@Controller后,就返回的是对应的index.html这个页面了。

3.2 返回数据 (@ResponseBody)
 那在@Controller 下只想返回数据本身怎么办?
加上 @ResponseBody 这个注解就好了.

@ResponseBody源码

既能修饰类,也能修饰方法。

        修饰类:该类下所有方法,返回的仅仅是数据本身。

        修饰方法:该方法返回的仅仅是数据本身。

3.3 返回HTML片段
返回HTML片段,其实就是 HTML标签语言

由于返回的HTML语句本质上还是数据本身,不是页面,所以要写上注解 @ResponseBody

3.4 返回JSON格式、js格式、css格式等
Spring会根据返回的数据类型,自动转换相应的格式。

当返回类型是 对象 时,自动转换为 JSON格式

当返回的是Map,自动转换为 JSON

 

当返回的是 js 页面,响应时自动转换为 application/javascript

当返回的是css文件时,响应自动转换为 text/css 格式

 

 3.5 设置响应头(状态码,编码,或者其他header)
3.5.1设置响应的状态码

状态码的设置,不影响页面的显示

3.5.2 设置content-type

content-type:默认是 html

指定返回的类型  @RequestMapping(value = "/r9",produces = "application/json")

3.5.3 自定义Header

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

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

相关文章

笔记 2 : 课本第 3 章开始,记录 arm 的汇编指令的格式

(13) 介绍 arm 中的第一个汇编指令的用法 mov : (14)立即数的概念: (15) 汇编中的移位写法: 举例 : (16) 学习一个新的指令 cmp &a…

【大型实战】企业网络实验(华为核心交换、ESXI7.0vmware虚拟机、DHCP中继、服务端网络及用户端网络配置)

需求 实验 vmware网络配置(企业内部一般为ESXI) 这样服务器虚拟机使用192.168.200.X网段才能与用户侧互通 vmware虚拟机配置(DHCP服务器网络配置) 打开网络管理页面 nmtui重置一下网络连接(重启网卡) …

ubuntu24.04 linux bcm94352hmb 无线网卡(带蓝牙功能)无法连接蓝牙设备的解决办法

ubuntu24.04 linux bcm94352hmb 无线网卡(带蓝牙功能)无法连接蓝牙设备的解决办法 问题描述 小本是自己换装的bcm94352hmb,现在跑不动黑苹果了,换装ubuntu,该网卡在黑苹果上和windows上都能正常工作,到了…

Go语言中的并发

简单介绍go中的并发编程. 涉及内容主要为goroutine, goroutine间的通信(主要是channel), 并发控制(等待、退出). 想查看更多与Go相关的内容, 可以查看我的Go编程栏目 Goroutine 语法 在一个函数调用前加上go即可, go func(). 语法很简单, 可以说是并发写起来最简单的程序语言…

Mongodb多键索引中索引边界的混合

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第93篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关…

linux进程——概念理解与PCB

前言:本篇讲解Linux进程概念相关内容。 操作系统被称为计算机世界的哲学, 可以见得操作系统的知识并不好理解。 对于这篇进程概念的讲解, 博主认为, 如果没有一些前置知识的话,里面的有些概念并不好理解。 但是如果学习…

TDesign组件库日常应用的一些注意事项

【前言】Element(饿了么开源组件库)在国内使用的普及率和覆盖率高于TDesign-vue(腾讯开源组件库),这也导致日常开发遇到组件使用上的疑惑时,网上几乎搜索不到其文章解决方案,只能深挖官方文档或…

防溺水预警系统引领水域安全新篇章

一、系统概述 随着人们对水域活动的需求增加,溺水事故频发,给人们的生命安全带来了严重威胁。然而,如今,一项创新科技正在以强大的功能和无限的潜力引领着水域安全的新篇章。智能防溺水预警系统,作为一种集成了智能感知…

文心一言:如何备考软考架构师

提问:软考高级:架构师指导,有哪些考点、重点考点有哪些?需要如何备考?案例分析题如何做?论文如何写? 文心一言回答1700字如下: 针对软考高级架构师的考试,以下是对考点、重点考点、备…

MongoDB自学笔记(三)

一、前文回顾 上一篇文章中我们学习了更新操作&#xff0c;以及讲解了部分的更新操作符&#xff0c;今天我们继续学习剩余的更新操作符。 二、更新操作符 1、$rename 语法&#xff1a;{ $rename: { < field1 >: < newName1 >, < field2 >: < newName2…

JDK、JRE、JVM的区别java的基本数据类型

说一说JDK、JRE、JVM的区别在哪&#xff1f; JDK&#xff1a; Java Delopment kit是java工具包&#xff0c;包含了编译器javac&#xff0c;调试器&#xff08;jdb&#xff09;以及其他用于开发和调试java程序的工具。JDK是开发人员在开发java应用程序时候所需要的的基本工具。…

Linux - 基础开发工具(yum、vim、gcc、g++、make/Makefile、git、gdb)

目录 Linux软件包管理器 - yum Linux下安装软件的方式 认识yum 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 vim的简单配置 Linux编译器 - gc…

R语言实现SVM算法——分类与回归

### 11.6 基于支持向量机进行类别预测 ### # 构建数据子集 X <- iris[iris$Species! virginica,2:3] # 自变量&#xff1a;Sepal.Width, Petal.Length y <- iris[iris$Species ! virginica,Species] # 因变量 plot(X,col y,pch as.numeric(y)15,cex 1.5) # 绘制散点图…

[Redis]典型应用——缓存

什么是缓存 缓存&#xff08;Cache&#xff09;是一种用于临时存储数据的机制&#xff0c;目的是提高数据访问速度和系统性能。 核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方&#xff0c;方便随时读取 缓存是一个相对的概念&#xff0c;比如说&#xff0c…

uniapp转小程序,小程序转uniapp方法

&#x1f935; 作者&#xff1a;coderYYY &#x1f9d1; 个人简介&#xff1a;前端程序媛&#xff0c;目前主攻web前端&#xff0c;后端辅助&#xff0c;其他技术知识也会偶尔分享&#x1f340;欢迎和我一起交流&#xff01;&#x1f680;&#xff08;评论和私信一般会回&#…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

给Wordpress添加评分功能到评论表单

今天要 给你的 Wordpress 添加评分功能到评论表单 吗&#xff1f; 评分功能效果图 什么类型的网站需要评分&#xff1f; 资源站教程站其他&#xff0c;我也没想到。。。 但我这个网站&#xff0c;因为是电影类的网站&#xff0c;好像还是有点需要的&#xff0c;所以&#xf…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎&#xff1a;内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测&#xff0c;针对完整的数据包&#xff0c;进行内容的识别和检测 1、基于特征子的检…

【字幕】字幕特效入门

前言 最近两周调研了一下字幕特效的底层程序逻辑&#xff0c;因为工作内容的原因&#xff0c;就分享几个自己找的链接具体细节就不分享了&#xff0c;CSDN也是我的个人笔记&#xff0c;只记录一些简单的内容用于后续自己方便查询&#xff0c;顺便帮助一下正在苦苦查阅资料入门…

详细的等保测评攻略

信息安全等级保护是中国特有的信息安全保障体系&#xff0c;旨在根据信息系统的重要性对其进行分级保护。随着技术的进步和威胁的变化&#xff0c;等保标准也在不断更新。等保2.0自2019年12月1日起施行&#xff0c;相较于之前的版本&#xff0c;它不仅涵盖了传统信息系统&#…