SpringMVC请求参数获取与响应处理|全套注解详解

目录

前言

[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)

JSON简单回顾

[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)

获取Cookie

Session操作

存储Session

获取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

⚠️ 重要踩坑

  1. 参数名不一致接收为null,如url传name1=xxx,后端接收String name,name=null。
  2. 基本类型(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

关键属性
  1. required=true(默认):该参数必传,不传直接400报错。
  2. required=false:设置为非必传。
  3. 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选择rawJSON,填入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

规则:

  1. 路径占位符{变量名}
  2. 如果方法参数名和占位符名字一致,注解可以不写value;
  3. 名字不一样必须指定@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‑Type
  • produces:指定响应Content‑Type

知识点总结

✨请求接收注解对照表

注解 作用
@RequestParam 获取url查询参数,支持参数重命名,设置必传/默认值
@RequestBody 读取请求Body,用于接收JSON请求
@PathVariable 获取URL路径上的变量(REST接口)
@RequestPart 接收上传文件MultipartFile
@CookieValue 获取Cookie值
@SessionAttribute 获取Session域中的属性
@RequestHeader 获取HTTP请求头

✨响应相关注解

注解 说明
@ResponseBody 返回值作为http响应数据,不解析视图
@RestController 组合注解 = @Controller + @ResponseBody
@Controller 控制器,返回视图页面

⚠️高频踩坑清单

  1. 使用基本类型接收参数,不传参报500,优先使用包装类;
  2. 接收JSON忘记写@RequestBody,对象属性全部null;
  3. 返回页面却使用@RestController,只会输出字符串不会渲染页面;
  4. List集合接收同名参数,必须加@RequestParam
  5. Session默认内存存储,重启服务器数据丢失;
  6. @RequestParam默认required=true,参数不传直接400。
相关推荐
青 春 记 忆2 小时前
零基础入门python25:新增账目——Decimal、日期和输入校验
python·后端开发
孔明click334 小时前
不想写代码,但想要集成一个登录页面?Sa-Token-Quick-Login 帮你实现!
java·sa-token·开源·springboot·登录·权限·权限认证
Java牛马16 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
青 春 记 忆17 小时前
零基础入门python19:Flask账本第一步——应用工厂、蓝图和健康检查
python·flask·后端开发
青 春 记 忆1 天前
零基础入门python23:Flask-Login登录、退出与会话
python·flask·后端开发
净重21克1 天前
万字长文!TLS协议升级避坑手册:JDK老项目适配TLS1.2/1.3全流程拆解
java·springboot·java安全
净重21克1 天前
万字长文!JDK 1.6~11 TLS协议升级全攻略
jdk·springboot
十五喵源码网1 天前
基于SpringBoot2+vue2的公寓报修管理系统
java·毕业设计·springboot·论文笔记