作者
:学Java的冬瓜
博客主页
:☀冬瓜的主页🌙
专栏
:【Framework】
主要内容
:使用SpringBoot的SpringMVC框架传递各种参数,如传对象,传表单,传文件。后端对前端的请求信息的获取,如Cookie,Header。后端对session进行设置和获取。
文章目录
一、传递不同参数类型
注意:
1> 参数传递不使用基础数据类型,因为容易出错(包装类型最多是参数为null)
2> 在后端路由的方法中仍然可以使用Servlet阶段学的 HttpServletRequest和HttpServletResponse作为参数(这两个相当于隐藏的参数),但是没必要。
3> 当有多个参数时,前后端进行参数匹配,是以参数的名称进行匹配的,与参数的前后位置无关。
4> Spring MVC可以实现自动的参数映射,因此传关于对象的信息时,在后端就可以转成一个对象使用。
1、传递单个参数
前端发送http请求
后端接收参数
//1.传递单个参数
@RequestMapping("/m1")
public Object method_1(String name){
System.out.println("==============================");
System.out.println("参数name:" + name);
System.out.println("==============================");
return "传递单个参数";
}
后端处理结果
2、传递对象
理解:前端发送对象信息,后端将信息获取并封装在对象中。
前端发送http请求
后端接收信息并将信息转为对象
@RequestMapping("/m2")
public String method_2(Person p){
System.out.println("==================================");
System.out.println("p对象username:" + p.getUsername());
System.out.println("p对象password:" + p.getPassword());
System.out.println("==================================");
return "传递对象";
}
后端处理后打印的信息
3、传递表单数据
后端有两种处理方式:1>一个一个获取前端传的参数(类似1) 2>把前端传来的参数封装成一个对象(类似2)。
4、传递Json对象 后端用@RequestBody注解
理解:后端使用@RequestBody注解,表示从请求的请求体获取信息,请求体是个Json格式数据,因此后端可以正常获取前端的数据并封装在对象中
前端发送http请求:
后端使用**@RequestBody注解:**
后端处理后成功打印信息:
5、参数部分传参@RequestParam和 基础URL传参@RequestVariable
理解:
参数部分传参指的是:http://localhost:8080/test/m4?username=‘张三’
基础URL传参指的是:http://localhost:8080/test/m4/zhangsan
。前者传参的username在后面的参数部分,而后者传参的username在基础path中。
区别:
前者适用于要传参数较多的情况;
后者适用于参数较少,且对搜索有关键词要求的情况(基础URL传参对搜索引擎搜索的权重更大,因为要传的参数在path里)。
注意: @RequestParam和@PathVariable都可以重命名参数,也可以设置参数为非必要参数。
基础URL传参前端:
后端接收基础URL部分参数:使用@PathVariable注解
@RequestMapping("/m5/{name}/{pwd}")
public String method_5(@PathVariable String name, @PathVariable String pwd){//@PathVariable注解表示,参数为基础URL传参。
System.out.println("=================================");
System.out.println(name + " " + pwd);
System.out.println("=================================");
return "基础URL传参";
}
后端处理后成功打印信息:
6、上传文件 @RequestPart
注意点:
【SpringBoot文档】
易错点:文件传输有大小限制。在SpringBoot文档中,注明了默认上传文件最大为1MB,请求最大为10MB,这两个参数可以在我们项目的 application配置文件中修改大小。
修改如下图:spring.servlet.multipart.max-file-size和spring.servlet.multipart.max-request-size
上传文件正式操作:
前端上传文件:选择表单,然后填写文件上传的key(后端用这个key接收上传文件),选择上传文件并上传。
后端处理文件上传: 将文件保存在E盘路径下
代码如下:
@RestController
public class UpLoadController {
//4.上传文件
@RequestMapping("/myUpload")
public String Upload(@RequestPart("myImg") MultipartFile file) throws IOException {
System.out.println("=================================");
String originalFileName = file.getOriginalFilename();
// 1>获得上传文件后缀名
String hzName = originalFileName.substring(originalFileName.lastIndexOf("."));
// 2>获得文件保存地址(使用唯一标识,确保同一时刻多个用户上传文件不会覆盖)
String filePath = "E:/"+ UUID.randomUUID() + hzName; //(空指针异常)
System.out.println(filePath);
File saveFile = new File(filePath);
try {
file.transferTo(saveFile);//保存文件
System.out.println("文件上传成功!");
System.out.println("=================================");
return "上传文件成功!";
} catch (IOException e) {
e.printStackTrace();
}
return "上传文件失败!!!";
}
}
二、关于参数的设置
1、后端参数重命名和必传参数 后端用@RequestParam注解
场景描述:
当前端发送和后端接收的参数名称不一致时,可以使用@RequestParam给后端参数重命名。这样就在后端可以使用和前端名称不一致的参数获取到前端的值。具体操作如下:
前端发送http请求:使用name传参
后端接收请求:
@RequestParam会自动给一个必传参数(上图name默认是必传参数),也就是说此时前端必须用name传参,而不能再使用与后端相同名称的参数username传参。
2、非必传参数设置
注意:如果有个参数是非必传参数,可以使用@RequestParam(value = "name", required = false)
来限制,此时该参数就可传可不传,如下代码:
@RequestMapping("/m3")
public String method_3(@RequestParam(value = "name", required = false) String username, String password){
return "后端参数重命名";
}
三、后端关于前端各类参数接收
1、获取Cookie——@CookieValue
获取Cookie的后端代码:使用@CookieValue注解
@RestController
public class TestController {
@RequestMapping("/getCookie")
public String func_1(@CookieValue("cookieKey") String cookie){
return "cookie" + cookie;
}
}
注意后端的CookieKey要和前端的cookie名称相同,可以通过在前端浏览器界面打开开发者工具添加指定的cookie进行验证,如下图。
后端处理后前端显示内容:
2、获取Header参数——@RequestHeader
后端获取Header信息:只需修改代码中注解内的信息,即可得到相应的请求头信息。
//2、获取header
@RequestMapping("/getHeader")
public String func_2(@RequestHeader("User-Agent") String headerMsg){
return headerMsg;
}
前端请求和响应信息:
3、获取Session——@SessionAttribute
要想获取session,得先保存session。如下图:
保存session:
@RequestMapping("/setSession")
public String func_3(HttpServletRequest request){
HttpSession session = (HttpSession) request.getSession(true);
if (session != null){
session.setAttribute("username", "张三");
}
return "set session succeed!";
}
浏览器请求URL和显示信息:
获取session:
@RequestMapping("/getSession")
public String func_4(@SessionAttribute(value = "username", required = false)
String uname){
return "username:" + uname;
}
浏览器请求URL和显示信息: