T04BF
👋专栏: 算法|JAVA|MySQL|C语言
🫵 今天你敲代码了吗
文章目录
- 1.建立连接
- 2.请求
1.建立连接
在Spring MVC中,是使用@RequestMapping 来实现路由映射
java
@RestController//这里需要这个注解,表示这个类交给Spring管理
public class UserController {
@RequestMapping("/sayHello")
public String sayHello() {
return "Hello";
}
}
注意:方法名和路径无需一致
此时使用@RequestMapping就是将路径映射到这个方法
RequestMapping
@RequestMapping是Spring Web MVC最常见的注解,他是用来注册接口的路由映射
表示当服务器收到请求的时候,路径为/sayHello的请求就会调用sayHello这个方法
(1)@RequestMapping既可以修饰方法,也可以修饰类
java
@RestController
@RequestMapping("/jWcb")
public class UserController {
@RequestMapping("/sayHello")
public String sayHello() {
return "Hello";
}
}
此时的访问路径就是http://127.0.0.1:8080/jWcb/sayHello
建议都加上类路径,可以减少url的冲突
(2)@RequestMapping既可以支持GET请求也可以支持POST请求
我们使用postman来测试
因此两种实际上都可以
同理,也能支持其他的请求
我们可以指定请求方式
此时如果再通过别的方式请求,就会出错
对于RequestMethod,实际上是一个枚举类,里面集合了所有的请求方法
我们再来看看RequestMapping的原码
会发现实际上参数要求的是数组
当Method参数只有一个的时候,可以省略数组的形式,传多个的时候就要以数组的形式
或者我们通过使用别的注解也可以指定请求方式
2.请求
2.1 对于前端传参的介绍
(1)普通传参(查询字符串)
(2)form-data(multipart/form-data)
通常用于提交文件,对应的Content-Type为multipart/form-data
(3)x-www-form-urlencoded
form表单,对应Content-Type:application/x-www-form-urlencoded
(4)raw
可以上传任意格式的文本,如text,json,xml,html
2.2传递单个参数
直接用方法的参数即可
我们来观察一下这个请求
Spring MVC会根据方法的参数名,找到对应的参数,赋值给方法
(1)如果参数名不一致,是获取不到参数的
(2)如果传递的参数多了,只会匹配名称一样的那一个
(3)如果将参数换成Integer类型
那么Spring会自动将String转化成需要的参数
但是如果转化不了,那就会出错
(4)参数定义为包装类型和基本类型的区别
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
如果正常传参,是没有区别的
但是如果有参数,但是前端没有传
因此我们经常用的是Integer
2.3传递多个参数
直接在方法参数定义多个形参即可
2.4传递对象
那么问题在于前端怎么传??
实际上,传递格式不变,只需要满足对应参数对应对象的属性即可
但是与其他方式有一点区别在于:此时即使是基本类型,不传参,会有默认值
2.5后端参数重命名(后端参数映射)
前端传递的传输key可以与后端接受的传输不一致,但是需要使用@RequestParam来重命名后端的参数值
那如果传递参数名为"userName"呢??
表示"name"不存在
这是因为
使用@RequestParam进行参数重命名时,请求参数只能和@RequestParam声明的一致,并且此时参数默认是必传参数
也可以设置非必传
2.6传递数组
对于前端请求,只要key值一样,就自动转为数组
或者在Body里面,使用,隔开
2.7 传递集合
如果我们简单的定义集合形参
即使是换成ArrayList
虽然不会报错,但是接收不到数据
实际上,对于集合来说,需要加上@RequestParam 绑定参数关系,这是因为请求参数名相同的多个值,是默认封装到数组.如果要封装集合,要使用@RequestParam 绑定参数关系
2.8传递JSON
什么是JSON?
简单来说,JSON就是一种数据格式,有自己的格式和语法,使用文本表示一个对象或者数组的信息,因此实际上本质就是字符串. 主要负责在不同语言中数据的传递和交换
json
{
"squadName": "正义联盟",
"homeTown": "大都会",
"formed": "1939年",
"secretBase": "北极光山洞",
"active": true,
"members": [
{
"name": "超人",
"age": 30,
"secretIdentity": "克拉克·肯特"
},
{
"name": "蝙蝠侠",
"age": 35,
"secretIdentity": "布鲁斯·韦恩"
},
{
"name": "神奇女侠",
"age": 11,
"secretIdentity": "戴安娜·普林斯"
}
],
"reflexes": "超人类反应速度",
"powers": "包括飞行、超级力量、超级速度、X光透视等多种超能力"
}
JSON的语法:
①数据在键值对里面
②数据用逗号隔开
③对象用{ }表示
④数组用[ ]表示
⑤值可以为对象,也可以为数组,数组里面可以包含多个对象
JSON字符串和JAVA对象互相转换
Spring MVC框架也集成了JSON的转换工具,可以直接使用
同时可以使用使用JSON字符串转对象**(对象必须提供无参的构造方法)**
传递JSON对象
接收JSON对象,需要使用@RequestBody注解
RequestBody: 请求正⽂,意思是这个注解作⽤在请求正⽂的数据绑定,请求参数必须在写在请求正文中
使用fiddler来抓包:
发现请求类型为JSON
2.9 获取URL里面的参数
使用的注解是@PathVariable
这个注解主要作用在请求URL路径上的数据绑定
即默认传递参数写在URL上,Spring MVC就能获取到
注意:如果方法参数名称和需要绑定的URL里面的变量一致,可以简写,不用给@PathVariable的属性赋值
如果不一致,就需要赋值
并且默认为必传参数
2.10 上传文件
在Spring里面,用"MultipartFile"来接收文件
可以对文件进行操作
我们先来看看这两者的区别:
运行后,发送请求,查看日志:
不难发现,如果我们要将文件存储到别的路径,需要拿到的是getOriginalFileName的值
运行后发现,此时对应路径就会存在对应的文件
2.11 获取Cookie/Session
Cookie是什么?
首先,HTTP协议是无状态的协议(即本次客户端和服务器的通信和下一次通信没有直接的联系)
但是在实际开发里面,我们通常是需要知道请求之间的联系的(比如某次登录之后,下一次登录就能自动显示登录状态)
此时的"令牌"通常就存在Cookie里面
Session是什么?
首先我们要理解什么是会话,在计算机领域,会话指的是一个客户端与服务器之间的不中断的请求响应,服务器能够识别出请求来自同一个客户端.当一个未知的客户端向服务器发送请求时就开始了一个会话,当客户端明确会话结束或者服务器在对应时限内没有接受到客户端的请求,会话就结束了
但是服务器在同一时刻接受到的请求是很多的,服务器需要区分每个请求是来自于哪个客户,也就是从属于哪个会话,就需要在服务器这边记录每个会话以及用户的信息
Session就是服务器为了保存用户信息而创建的一个特殊的对象
实际上,Session本质上就是一个哈希表,存储的就是键值对结构的数据,Key就是SessionID,Value就是用户信息
SessionID是服务器生成的一个"唯一的字符串",
以登录请求为例:
- 当用户登录的时候,服务器在Session中新增一条新的记录,并把sessionId返回给客户端(通过HTTP响应里面的Set-Cookie实现)
- 客户端后续再给服务器发送请求的时候,需要在请求里面带上sessionId(通过HTTP请求里面的Cookie字段实现)
- 服务器接受到请求之后,就会根据请求里面的sessionId字段在Session信息中获取到对应的用户信息,再进行后续操作,找不过就重新创建Session,并且把sessionId返回
Cookie和Session的区别
- Cookie是客户端保留用户信息的一种机制,Session是服务器保留用户信息的一种机制
- Cookie和Session之间是通过sessionId关联起来的
- Cookie和Session并不一定一直配合使用,完全可以用Cookie来存储一些数据在客户端,这些数据不一定是用户身份信息,也不一定是sessionId;同理,sessionId也不一定非要通过Set-Cookie来传递(比如使用URL传递)
获取Cookie
由于Cookie是存储在客户端的,因此是可以伪造的,我们先伪造一些Cookie
传统方法:
java
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request, HttpServletResponse response) {
Cookie[] cookies = request.getCookies();
StringBuffer stringBuffer = new StringBuffer();
for (Cookie cookie : cookies) {
stringBuffer.append(cookie.getName() + ":" + cookie.getValue());
}
return "获取到Cookie" + stringBuffer;
}
Spring MVC是基于Servlet构建的Web框架
HttpServletRequest,HttpServletResponse是Servlet提供的两个类.是Spring
MVC方法的内置对象需要的时候直接在方法中声明即可
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP访问服务器的时候,HTTP请求头中的所有数据都封装在这个对象里面
HttpServletResponse对象代表服务器的响应,HTTP响应的信息都在这个对象中
访问后得到:获取到Cookie testCookie:test
我们使用fiddler抓包看一下请求:
简洁方法获取:
我们先设置好一下Cookie
java
@RequestMapping("getCookie2")
public String getCookie2(@CookieValue("testCookie") String testCookie) {
return "获取到Cookie: " + testCookie;
}
获取Session
Session是服务器端的机制.我们需要先存储,才能获取
对于Session来说,也是基于HttpServletRequest来存储和获取的
java
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {
//参数为true 如果session不存在,就创建一个Session,如果存在,就直接返回
HttpSession session = request.getSession(true);
session.setAttribute("name","zhangsan");
session.setAttribute("studentId","12345");
return "设置成功";
}
访问后,我们通过Fiddler抓包,就能看到Set-Cookie
同时客户端也能看到对应的Cookie
[图片]
获取Session的几种方式:
(1)
java
@RequestMapping("/getSession1")
public String getSession1(HttpServletRequest request) {
//参数为false 不存在Session就直接返回
HttpSession session = request.getSession(false);
if(session != null) {
System.out.println(session.getAttribute("name"));
System.out.println(session.getAttribute("studentId"));
}
return "获取成功";
}
注意:如果服务器重启了,需要调用getSession重新获取Session
访问运行结果:
(2)
java
@RequestMapping("/getSession2")
public String getSession2(HttpSession session) {
System.out.println(session.getAttribute("name"));
System.out.println(session.getAttribute("studentId"));
return "获取成功";
}
实际上,参数HttpSession session的作用就相当于HttpSession session = request.getSession();
(3)
java
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("name") String name) {
System.out.println("name: " + name);
return "获取成功";
}
对于(2)和(3),当Session不存在的时候有区别:
对于(2),会自己创建一个空的
对于(3),就直接报错了
因为此时的"name"是必传参数,同样可以设置为非必传
2.12 获取Header
传统获取
获取Header也是从HttpServletRequest里面获取
java
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
return "userAgent: "+userAgent;
}
简洁获取
java
@RequestMapping("/getHeader2")
public String getHeader(@RequestHeader("User-Agent") String userAgent) {
return "userAgent: "+userAgent;
}
感谢您的访问!!期待您的关注!!!
T04BF
🫵 今天记得敲代码