目录
[2.4 请求:后端如何获取前端传递的参数](#2.4 请求:后端如何获取前端传递的参数)
[2.4.1 传递单个参数](#2.4.1 传递单个参数)
[2.4.2 传递多个参数](#2.4.2 传递多个参数)
[2.4.3 传递对象](#2.4.3 传递对象)
[2.4.4 @RequestParam 参数重命名映射](#2.4.4 @RequestParam 参数重命名映射)
[2.4.5 传递数组](#2.4.5 传递数组)
[2.4.6 传递集合List](#2.4.6 传递集合List)
[2.4.7 接收JSON请求 @RequestBody](#2.4.7 接收JSON请求 @RequestBody)
[2.4.8 路径变量 @PathVariable](#2.4.8 路径变量 @PathVariable)
[2.4.9 文件上传 @RequestPart](#2.4.9 文件上传 @RequestPart)
[2.4.10 获取Cookie与Session](#2.4.10 获取Cookie与Session)
[2.4.11 获取请求头Header](#2.4.11 获取请求头Header)
[2.5 响应:后端返回数据给客户端](#2.5 响应:后端返回数据给客户端)
[2.5.1 返回静态页面](#2.5.1 返回静态页面)
[2.5.2 @ResponseBody 返回数据](#2.5.2 @ResponseBody 返回数据)
[2.5.3 返回HTML代码片段](#2.5.3 返回HTML代码片段)
[2.5.4 返回JSON](#2.5.4 返回JSON)
[2.5.5 手动设置HTTP状态码](#2.5.5 手动设置HTTP状态码)
[2.5.6 设置响应Header](#2.5.6 设置响应Header)
方式1:@RequestMapping的produces属性设置Content‑Type
方式2:使用HttpServletResponse设置自定义响应头
博客说明:基于SpringBoot3.2.0,Spring Web MVC,完整梳理包含各类参数接收方式、JSON、Cookie、Session、Header、返回页面/JSON/状态码等,附带代码示例与踩坑总结,适合后端初学者收藏。
前言
SpringMVC最核心两大模块:接收客户端请求参数 、给客户端返回响应结果。 浏览器/Postman把数据传给后端,后端拿到数据执行业务,处理完毕返回结果。本文覆盖课件中2.4请求、2.5响应全部内容,包含:普通参数、对象、数组、集合、JSON、路径变量、文件上传、Cookie、Session、请求头,以及返回页面、返回JSON、设置状态码、设置响应Header等实战代码和常见报错坑点。
测试工具:Postman,后端开发不用手写HTML表单,直接使用Postman模拟各类请求。
2.4 请求:后端如何获取前端传递的参数
核心:客户端传递参数多种多样,SpringMVC提供不同注解适配不同传参场景。 类比厨师:厨师不用关心用户是小程序、网页、APP下单,只需要知道怎么接收订单数据。
2.4.1 传递单个参数
直接在Controller方法定义同名形参,SpringMVC自动按参数名绑定赋值。
java
@RestController
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/m1")
public String method1(String name){
return "接收到参数name:"+ name;
}
}
访问示例:http://127.0.0.1:8080/param/m1?name=spring
⚠️ 重要踩坑
- 参数名不一致接收为
null,如url传name1=xxx,后端接收String name,name=null。 - 基本类型(int、double)接收参数,必须传参,不传报500异常。
java
@RequestMapping("/m1/int")
public Object method1GetInt(int age){
return "接收到参数age:" + age;
}
- 不传age:
500 Internal Server Error,报错提示基本类型不能接收null,建议业务中使用包装类型Integer。 - 参数类型不匹配:例如传
age=abc,报400 Bad Request。
✅企业开发建议:参数可能为空,一律使用包装类型
Integer / Long,不要使用基本类型。
2.4.2 传递多个参数
方法直接定义多个形参,只和参数名称匹配,和参数顺序无关。
java
@RequestMapping("/m2")
public Object method2(String name, String password) {
return "接收到参数name:" + name + ", password:" + password;
}
访问: http://127.0.0.1:8080/param/m2?name=zhangsan&password=123456 调换参数顺序也可以正常获取: http://127.0.0.1:8080/param/m2?password=123456&name=zhangsan
2.4.3 传递对象
参数很多时,把请求参数封装为实体对象,SpringMVC自动根据属性名完成赋值。
实体Person类:
java
public class Person {
private int id;
private String name;
private String password;
// getter、setter、toString
}
Controller代码:
java
@RequestMapping("/m3")
public Object method3(Person p){
return p.toString();
}
访问地址: http://127.0.0.1:8080/param/m3?id=5&name=zhangsan&password=123456
注意:属性没有传值,引用类型为
null;基本类型赋默认值(int默认0)。
2.4.4 @RequestParam 参数重命名映射
场景:前端参数key和后端形参名字不一致 ,使用@RequestParam完成映射。
java
//前端传time,后端变量叫createtime
@RequestMapping("/m4")
public Object method_4(@RequestParam("time") String createtime) {
return "接收到参数createtime:" + createtime;
}
访问:http://127.0.0.1:8080/param/m4?time=2023-09-12
关键属性
required=true(默认):该参数必传,不传直接400报错。required=false:设置为非必传。defaultValue:设置参数默认值。
非必传示例:
java
@RequestMapping("/m4")
public Object method4(@RequestParam(value = "time", required = false) String createtime) {
return "接收到参数createtime:" + createtime;
}
2.4.5 传递数组
请求多个同名参数,直接定义数组接收。
java
@RequestMapping("/m5")
public String method5(String[] arrayParam) {
return Arrays.toString(arrayParam);
}
两种url写法都支持:
java
http://127.0.0.1:8080/param/m5?arrayParam=zhangsan&arrayParam=lisi&arrayParam=wangwu
http://127.0.0.1:8080/param/m5?arrayParam=zhangsan,lisi,wangwu
2.4.6 传递集合List
重点:普通情况下同名参数会封装数组,想要直接接收List集合,必须加上@RequestParam注解。
java
@RequestMapping("/m6")
public String method6(@RequestParam List<String> listParam){
return "size:"+listParam.size() + ",listParam:"+listParam;
}
访问示例: http://127.0.0.1:8080/param/m6?listParam=zhangsan&listParam=lisi&listParam=wangwu
2.4.7 接收JSON请求 @RequestBody
⚠️JSON是放在请求body中,不是url参数!必须使用
@RequestBody注解,去掉注解无法赋值。
java
@RequestMapping(value = "/m7")
public Object method7(@RequestBody Person person) {
return person.toString();
}
Postman操作:Body选择raw→JSON,填入JSON字符串。
java
{
"id":5,
"name":"zhangsan",
"password":"123456"
}
底层原理:SpringMVC内置jackson‑databind,自动完成JSON字符串和Java对象互转。
❌踩坑:去掉@RequestBody,同样的JSON请求,对象属性全部为null。
JSON简单回顾
- JSON是轻量级文本数据交换格式,独立于编程语言。
- 对象
{},数组[],键值对,逗号分隔。
2.4.8 路径变量 @PathVariable
把参数写在URL路径当中,REST风格接口常用。
java
//url: /param/m8/5/zhangsan
@RequestMapping("/m8/{id}/{name}")
public String method8(@PathVariable Integer id, @PathVariable("name") String userName){
return "解析参数id:"+id+",name:"+userName;
}
访问地址:http://127.0.0.1:8080/param/m8/5/zhangsan
规则:
- 路径占位符
{变量名}; - 如果方法参数名和占位符名字一致,注解可以不写value;
- 名字不一样必须指定
@PathVariable("占位符名字")。
2.4.9 文件上传 @RequestPart
接收上传文件,参数类型MultipartFile
java
@RequestMapping("/m9")
public String getfile(@RequestPart("file") MultipartFile file) throws IOException {
//获取原始文件名
String fileName = file.getOriginalFilename();
//保存到磁盘
file.transferTo(new File("D:/temp/" + file.getOriginalFilename()));
return "接收到文件名称为: "+fileName;
}
Postman设置:Body选择form‑data,key填file,value选择本地文件。
2.4.10 获取Cookie与Session
HTTP是无状态协议,Cookie客户端存储,Session服务器端存储,依靠JSESSIONID关联。
获取Cookie
方式1:原始方式,使用HttpServletRequest
java
@RequestMapping("/m10")
public String method10(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
StringBuilder builder = new StringBuilder();
if (cookies!=null){
for (Cookie ck:cookies) {
builder.append(ck.getName()+":"+ck.getValue()+" ");
}
}
return "Cookie信息:"+builder;
}
方式2:注解@CookieValue简洁获取指定cookie
java
@RequestMapping("/getCookie")
public String cookie(@CookieValue("bite") String bite) {
return "bite:" + bite;
}
Session操作
存储Session
java
@RequestMapping("/setSess")
public String setsess(HttpServletRequest request) {
HttpSession session = request.getSession();
if (session != null) {
session.setAttribute("username", "java");
}
return "session 存储成功";
}
getSession()等价getSession(true),没有会话自动创建;getSession(false)没有会话返回null,不会新建。
获取Session三种写法
写法1:HttpServletRequest获取(原生)
java
@RequestMapping("/getSess")
public String sess(HttpServletRequest request) {
HttpSession session = request.getSession(false);
String username = null;
if (session != null && session.getAttribute("username") != null) {
username = (String) session.getAttribute("username");
}
return "username:" + username;
}
写法2:注解@SessionAttribute
java
@RequestMapping("/getSess2")
public String sess2(@SessionAttribute(value = "username",required = false) String username) {
return "username:"+username;
}
写法3:直接注入HttpSession入参
java
@RequestMapping("/getSess3")
public String sess3(HttpSession session) {
String username = (String)session.getAttribute("username");
return "username:"+username;
}
注意:Session默认存储内存,重启服务器数据丢失。
2.4.11 获取请求头Header
方式1:原生HttpServletRequest
java
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
String userAgent = request.getHeader("User‑Agent");
return "userAgent:"+userAgent;
}
方式2:注解@RequestHeader
java
@RequestMapping("/header")
public String header(@RequestHeader("User‑Agent") String userAgent) {
return "userAgent:"+userAgent;
}
2.5 响应:后端返回数据给客户端
SpringMVC可以返回静态页面、字符串、HTML片段、JSON,手动设置状态码、响应头。
2.5.1 返回静态页面
重点区分
@Controller和@RestController
@Controller:返回视图页面;@RestController = @Controller + @ResponseBody;@ResponseBody将返回值当做响应数据,不再解析视图。
❌错误写法(使用@RestController,返回页面字符串只会直接输出文本,不会渲染页面)
java
@RestController
public class IndexController {
@RequestMapping("/index")
public Object index(){
//不会跳转页面,直接输出字符串"/index.html"
return "/index.html";
}
}
✅正确返回页面(使用@Controller,去掉ResponseBody)
java
@Controller
public class IndexController {
@RequestMapping("/index")
public Object index(){
//resources/static/index.html
return "/index.html";
}
}
2.5.2 @ResponseBody 返回数据
@ResponseBody:将方法返回值直接作为HTTP响应body,不解析视图。
- 加在类上:当前类所有方法全部返回数据;
- 加在方法上:仅当前这个方法返回数据。
同一个类既有返回页面,又要返回数据:只在对应方法上加@ResponseBody。
java
@Controller
public class IndexController {
//返回视图页面
@RequestMapping("/index")
public Object index(){
return "/index.html";
}
//返回普通字符串数据
@RequestMapping("/returnData")
@ResponseBody
public String returnData(){
return "该方法返回数据";
}
}
2.5.3 返回HTML代码片段
返回的字符串如果是HTML标签,浏览器会自动解析渲染。
java
@RequestMapping("/returnHtml")
@ResponseBody
public String returnHtml() {
return "<h1>Hello,HTML~</h1>";
}
响应头:Content‑Type: text/html;charset=UTF‑8
2.5.4 返回JSON
返回对象/集合,SpringMVC自动序列化为JSON字符串。
java
@RequestMapping("/returnJson")
@ResponseBody
public HashMap<String, String> returnJson() {
HashMap<String, String> map = new HashMap<>();
map.put("Java", "Java Value");
map.put("MySQL", "MySQL Value");
map.put("Redis", "Redis Value");
return map;
}
响应头自动设置:Content‑Type: application/json
2.5.5 手动设置HTTP状态码
使用HttpServletResponse对象调用setStatus(int code)
java
@RequestMapping(value = "/setStatus")
@ResponseBody
public String setStatus(HttpServletResponse response) {
response.setStatus(401);
return "设置状态码成功";
}
状态码不会影响响应body内容,只是修改HTTP响应行。
2.5.6 设置响应Header
方式1:@RequestMapping的produces属性设置Content‑Type
java
@RequestMapping(value = "/returnJson2",produces = "application/json;charset=utf‑8")
@ResponseBody
public String returnJson2() {
return "{\"success\":true}";
}
方式2:使用HttpServletResponse设置自定义响应头
java
@RequestMapping(value = "/setHeader")
@ResponseBody
public String setHeader(HttpServletResponse response) {
response.setHeader("MyHeader","MyHeaderValue");
return "设置Header成功";
}
拓展:
@RequestMapping注解属性:
method:限定请求方式params:限定请求参数条件headers:限定请求头条件consumes:限定请求Content‑Typeproduces:指定响应Content‑Type
知识点总结
✨请求接收注解对照表
| 注解 | 作用 |
|---|---|
| @RequestParam | 获取url查询参数,支持参数重命名,设置必传/默认值 |
| @RequestBody | 读取请求Body,用于接收JSON请求 |
| @PathVariable | 获取URL路径上的变量(REST接口) |
| @RequestPart | 接收上传文件MultipartFile |
| @CookieValue | 获取Cookie值 |
| @SessionAttribute | 获取Session域中的属性 |
| @RequestHeader | 获取HTTP请求头 |
✨响应相关注解
| 注解 | 说明 |
|---|---|
| @ResponseBody | 返回值作为http响应数据,不解析视图 |
| @RestController | 组合注解 = @Controller + @ResponseBody |
| @Controller | 控制器,返回视图页面 |
⚠️高频踩坑清单
- 使用基本类型接收参数,不传参报500,优先使用包装类;
- 接收JSON忘记写
@RequestBody,对象属性全部null; - 返回页面却使用
@RestController,只会输出字符串不会渲染页面; - List集合接收同名参数,必须加
@RequestParam; - Session默认内存存储,重启服务器数据丢失;
@RequestParam默认required=true,参数不传直接400。