前言:
访问不同路径就是在发送不同的请求,在发送请求时,可能会带有一些参数,所以Spring的请求主要是为了学习如何传递参数到后端以及后端如何接收。
在SpringMVC中使用@RequestMapping来实现路由映射,也就是浏览器连接程序的作用。
第一个Spring代码 :
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/hello/a")
@RestController//创建一个controller类,实现用户通过浏览器和程序的交互
public class HelloController {
@RequestMapping(value = "/sayhi/b",method = RequestMethod.GET)
public String sayHi(){
return "hi,SpringBoot";
}
@RequestMapping("/sayhello")
public String sayHello(){
return "hello,SpringBoot";
}
}
通过路径 (127.0.0.1:8080/hello/a/sayhi/b)直接访问得到如下结果:
@RestController的作用
@RequestMapping是SpringMVC中常用的注解之一,是用来注册接口的路由映射的。
路由映射:当用户访问一个url时,将用户的请求对应到程序中某个类的某个方法的过程。
既然 @RequestMapping可以达到我们的目的,为啥还要加@RestController?
删除@RestController试一试,可以看到:
所以 @RestController不能删!!!因为每个类可能有很多的方法,Spring不知道执行哪个方法,因此会对所有类进行扫描,如果这个类添加了注解@RestController,Spring才会去看这个类里面的方法有没有加@RequestMapping这个注解。
@RequestMapping的使用
@RequestMapping既可以修饰类也可以修饰方法,修饰类和方法时,访问的地址是类路径+方法路径。
@RequestMapping标识一个类:设置映射请求的请求路径的初始信息,如:@RequestMapping("/hello/a")
@RequestMapping标识一个方法:设置映射请求请求路径的具体信息,如:@RequestMapping(value = "/sayhi/b")
@RequestMapping("/hello/a")
@RestController//创建一个controller类,实现用户通过浏览器和程序的交互
public class HelloController {
@RequestMapping(value = "/sayhi/b")
public String sayHi(){
return "hi,SpringBoot";
}
}
访问地址为: 127.0.0.1:8080/hello/a/sayhi/b
@RequestMapping是GET还是POST请求?
@RequestMapping 既支持GET请求,也支持POST请求,但是浏览器发送的请求类型都是GET请求,也可指定自己所需要的请求:
1.传递单个参数
接收单个参数,在SpringMVC中直接用方法中的参数就可以了,比如:
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/m1")
public String m1(String name){
return "接收到的参数name:"+name;
}
}
请求的URL: 127.0.0.1:8080/param/m1?name=zhangsan
注意:使⽤基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误;类型不匹配时, 会报400错误。
500报错:
400报错:
2.传递多个参数
@RequestMapping("/m2")
public String m2(String name, Integer age){
return "接收到的参数name:"+name + ",age:"+age;
}
访问的URL:http://127.0.0.1:8080/param/m2?name=zhangsan&age=18
3.传递对象
给一个Person对象:
package com.example.demo;
public class Person {
Integer id;
String name;
Integer age;
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + 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;
}
}
传递对象代码实现:URL:http://127.0.0.1:8080/param/m4?id=123&name=zhangsan&age=18
@RequestMapping("/m4")
public String m4(Person person){
return "接收到的参数person:"+person.toString();
}
4.传递数组
Spring MVC可以自动绑定数组参数的赋值
@RequestMapping("/m6")
public String m6(String[] arrayParam){
return "接收到的参数arrayParam:"+ Arrays.toString(arrayParam) + ",长度:"+arrayParam.length;
}
Postman传参测试: 127.0.0.1:8080/param/m6?arrayParam=zhangsan
浏览器传参:127.0.0.1:8080/param/m6?arrayParam=zhangsan
5.传递集合
集合参数:和数组类似,同一个请求参数名有多个,且需要使用@RequestParam绑定参数关系
默认情况下,请求中参数名相同的多个值,是封装到数组。但是!如果要封装到集合,要使用@RequestParam绑定参数关系
代码:
@RequestMapping("/m7")
public String m7(@RequestParam(required = false) List<String> listParam){
return "接收到的参数listParam:"+ listParam + ",长度:"+listParam.size();
}
Postman传参测试:http://127.0.0.1:8080/param/m7?listParam=zhangsan
6.传递JSON数据
JSON:JavaScript Object Notation【JavaScript对象表示法】
JSON是一种轻量级的数据交互格式,它有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换
JSON和JavaScript没有关系,只是语法比较相似,JavaScript开发者能更快的上手,语法本身比较简单。
JSON语法:
1.数据在键值对(key/value)中
2.数据由逗号,分割
3.对象用{}表示(保存的对象是一个无序的键值对集合,一个对象以左括号{开始,右括号}结束。每一个”键“后面跟一个冒号:,键值对使用逗号,分割。
4.数组用[]表示(中括号保存的数组是值(value)的有序集合,一个数组以左括号[开始,右括号]结束,值之间使用逗号,分隔。
5.值可以为对象,也可以为数组,数组中可以包含多个对象
{
"Name ": "zhangsan ",
"ID": "City",
"formed": 2023,
"active": true,
"members": {
"name": "lisi",
"age": 18,
"array": ["zhangsan", "lisi", "wangwu"]
}
}
JSON优点
1.简单易用:语法简单,易于理解和编写,可以快速的进行数据交换
2.跨平台支持:JSON可以被多种语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输。
3.轻量级:相对于XML格式,JSON数据格式更加轻量级,传输数据时占用宽带较小,可以提高数据传输速度
4.易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用。
5.安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性。
JSON在Web应用程序中被广泛使用,如前后端数据交互,API接口数据传输等。
后端代码:
@RequestMapping("/m8")
public String m8(@RequestBody Person person){
return "接收的数据person:" + person.toString();
}
Postman发送json请求参数:
Fiddler抓包:
7.获取URL中参数@PathVariable(路径变量)
这个注解主要作用就是在请求URL路径上的数据绑定(默认传递参数写在URL上,SpringMVC就可以获取到)
后端代码:
@RequestMapping("/m9/{userId}")
public String m9(@PathVariable Integer userId){
return "userId:"+userId ;
}
Postman:127.0.0.1:8080/param/m9/5
8.上传文件@RequestPart
后端代码:
@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());
file.transferTo(new File("D:/temp/"+file.getOriginalFilename()));
return "success";
}
Postman传参测试:http://127.0.0.1:8080/param/m10
9.获取Cookie/Session/Header
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request,HttpServletResponse response){
Cookie[] cookies = request.getCookies();//request中拿cookie
// for (Cookie cookie : cookies) {
// System.out.println(cookie.getName()+":"+cookie.getValue());
// }
//lambda表达式方式写
if (cookies!=null){//判断空指针异常
Arrays.stream(cookies).forEach(cookie->{
System.out.println(cookie.getName()+":"+cookie.getValue());
});
}
return "获取cookie成功";
}
//开发过程中只获取一个cookie用这种
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue String bite,@CookieValue String aaa){
return "cookie存取的值bite:"+bite+",aaa:"+aaa;
}
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("username","zhangsan");
return "success";
}
//原始方式
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request){
HttpSession session = request.getSession(false);
if (session!=null){
String username = (String)session.getAttribute("username");
return "登录用户:"+username;
}
return "session 为空";
}
@RequestMapping("/getSession2")//下面的@SessionAttribute默认是一个必传参数
public String getSession2(@SessionAttribute(required = false) String username){
return "username:"+username;
}
//通过内置对象(需要的时候直接加上,不需要的时候不用去写)
@RequestMapping("/getSession3")
public String getSession3(HttpSession session){//HttpSession session等同于HttpSession session=request.getSession(true)
String username = (String)session.getAttribute("username");
return "登录用户:"+username;
}
Cookie 和 Session 的区别
Cookie 是客⼾端保存⽤⼾信息的⼀种机制Session 是服务器端保存⽤⼾信息的⼀种机制。
Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。
Cookie 和 Session 经常会在⼀起配合使⽤.,但是不是必须配合。
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent = request.getHeader("User-Agent");//User—Agent获取使用是哪个浏览器
return "userAgent:"+userAgent;
}
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){//通过注解的方式拿取信息
return "userAgent:"+userAgent;
}