SpringMVC快速入门之请求与响应

SpringMVC快速入门之请求与响应

    • 一、请求处理:获取请求参数
      • 1.1 普通参数获取(@RequestParam)
        • 1.1.1 基础用法
        • 1.1.2 可选参数与默认值
      • 1.2 路径变量(@PathVariable)
      • 1.3 表单数据绑定到对象
        • 1.3.1 定义实体类
        • 1.3.2 绑定对象参数
      • 1.4 获取请求头与Cookie(@RequestHeader、@CookieValue)
        • 1.4.1 获取请求头
        • 1.4.2 获取Cookie
      • 1.5 获取JSON请求体(@RequestBody)
        • 1.5.1 依赖准备
        • 1.5.2 接收JSON数据
    • 二、响应处理:返回结果给客户端
      • 2.1 页面跳转(ModelAndView)
        • 2.1.1 返回逻辑视图名(推荐)
        • 2.1.2 使用ModelAndView
      • 2.2 重定向与转发
        • 2.2.1 重定向(redirect:)
        • 2.2.2 转发(forward:)
      • 2.3 返回JSON数据(@ResponseBody)
        • 2.3.1 基础用法
        • 2.3.2 @RestController简化配置
    • 三、实战案例:用户注册与查询
      • 3.1 注册页面(register.jsp)
      • 3.2 结果页面(result.jsp)
      • 3.3 Controller完整实现
      • 3.4 测试流程
    • 四、常见问题与避坑指南
      • 4.1 参数绑定失败(400 Bad Request)
      • 4.2 JSON解析失败(400 Bad Request)
      • 4.3 @ResponseBody返回406 Not Acceptable
    • 总结:请求与响应的核心要点

SpringMVC中请求(Request)与响应(Response)是核心交互流程:客户端通过请求传递数据,服务器处理后通过响应返回结果,掌握请求参数的接收和响应结果的处理,是开发Web接口的基础。

一、请求处理:获取请求参数

SpringMVC提供了多种注解简化请求参数的获取,无需像原生Servlet那样手动调用request.getParameter()

1.1 普通参数获取(@RequestParam)

适用于获取URL查询参数(?name=张三&age=25)或表单提交的参数。

1.1.1 基础用法
@Controller
@RequestMapping("/user")
public class UserController {/*** 获取普通参数* URL示例:/user/query?name=张三&age=25*/@GetMapping("/query")public String queryUser(// @RequestParam:绑定参数(默认必填)@RequestParam String name,// 可指定参数名(若参数名与变量名一致,可省略@RequestParam)@RequestParam("age") Integer userAge,Model model) {model.addAttribute("message", "姓名:" + name + ",年龄:" + userAge);return "result"; // 跳转结果页面}
}
1.1.2 可选参数与默认值

若参数非必填,可通过required=false设置,或指定默认值:

/*** 可选参数与默认值* URL示例:/user/search?keyword=Spring(或无参数)*/
@GetMapping("/search")
public String search(// 可选参数(required=false)@RequestParam(required = false) String keyword,// 默认值(若参数为空,使用默认值)@RequestParam(defaultValue = "10") Integer size,Model model) {model.addAttribute("message", "关键词:" + (keyword == null ? "无" : keyword) + ",每页条数:" + size);return "result";
}

核心说明

  • 若参数名与方法参数名一致,@RequestParam可省略(如String name等价于@RequestParam String name);
  • 基本类型(int)需确保参数存在,否则会报错,建议使用包装类(Integer)并设置required=false

1.2 路径变量(@PathVariable)

适用于REST风格的URL(如/user/1),从URL路径中获取参数。

/*** 路径变量* URL示例:/user/1/detail*/
@GetMapping("/{id}/detail")
public String getUserDetail(// 从路径中获取id(与URL中的{id}对应)@PathVariable Integer id,Model model) {model.addAttribute("message", "查询ID为" + id + "的用户详情");return "result";
}

进阶用法:多路径变量

/*** 多路径变量* URL示例:/user/1/order/100*/
@GetMapping("/{userId}/order/{orderId}")
public String getOrder(@PathVariable("userId") Integer uId,@PathVariable Integer orderId, // 变量名与{orderId}一致,可省略valueModel model) {model.addAttribute("message", "用户ID:" + uId + ",订单ID:" + orderId);return "result";
}

1.3 表单数据绑定到对象

当参数较多时(如用户注册),可将参数自动绑定到Java对象。

1.3.1 定义实体类
package com.example.pojo;import lombok.Data;@Data // Lombok注解,自动生成getter/setter
public class User {private String username;private Integer age;private String email;
}
1.3.2 绑定对象参数
/*** 表单数据绑定到对象* 表单提交示例:username=张三&age=25&email=test@example.com*/
@PostMapping("/register")
public String registerUser(// 自动将参数绑定到User对象(参数名与对象属性名一致)User user,Model model) {model.addAttribute("message", "注册用户:" + user.getUsername() + ",年龄:" + user.getAge() + ",邮箱:" + user.getEmail());return "result";
}

核心说明

  • 要求表单参数名或查询参数名与对象的属性名一致(如username对应user.getUsername());
  • 支持嵌套对象(如User包含Address对象,参数名需为address.city)。

1.4 获取请求头与Cookie(@RequestHeader、@CookieValue)

1.4.1 获取请求头
/*** 获取请求头*/
@GetMapping("/header")
public String getHeader(// 获取User-Agent请求头@RequestHeader("User-Agent") String userAgent,// 获取Accept请求头@RequestHeader("Accept") String accept,Model model) {model.addAttribute("message", "浏览器信息:" + userAgent + ",Accept:" + accept);return "result";
}
1.4.2 获取Cookie
/*** 获取Cookie*/
@GetMapping("/cookie")
public String getCookie(// 获取名为JSESSIONID的Cookie值@CookieValue(value = "JSESSIONID", required = false) String sessionId,Model model) {model.addAttribute("message", "JSESSIONID:" + (sessionId == null ? "无" : sessionId));return "result";
}

1.5 获取JSON请求体(@RequestBody)

适用于接收前端发送的JSON数据(如Ajax请求),需结合@ResponseBody使用。

1.5.1 依赖准备

确保添加Jackson依赖(用于JSON解析):

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>
1.5.2 接收JSON数据
/*** 接收JSON请求体* 请求体示例:{"username":"张三","age":25}*/
@PostMapping("/json")
@ResponseBody // 返回JSON(而非跳转页面)
public User receiveJson(@RequestBody User user) {// 处理逻辑(如保存用户)user.setUsername(user.getUsername() + "_processed"); // 修改用户名return user; // 返回处理后的对象(自动转为JSON)
}

测试方式
使用Postman发送POST请求:

  • URL:http://localhost:8080/user/json
  • 请求头:Content-Type: application/json
  • 请求体:{"username":"张三","age":25}

响应结果(JSON):

{"username":"张三_processed","age":25,"email":null}

二、响应处理:返回结果给客户端

SpringMVC的响应方式分为两类:页面跳转(返回视图)和数据响应(返回JSON、字符串等)。

2.1 页面跳转(ModelAndView)

通过返回逻辑视图名或ModelAndView实现页面跳转,适用于传统JSP开发。

2.1.1 返回逻辑视图名(推荐)
/*** 返回逻辑视图名(默认跳转页面)*/
@GetMapping("/toIndex")
public String toIndex(Model model) {model.addAttribute("title", "首页"); // 向视图传递数据return "index"; // 逻辑视图名,由视图解析器转为/WEB-INF/views/index.jsp
}
2.1.2 使用ModelAndView
/*** 使用ModelAndView跳转页面*/
@GetMapping("/toDetail")
public ModelAndView toDetail() {ModelAndView mav = new ModelAndView();mav.setViewName("detail"); // 设置逻辑视图名mav.addObject("id", 1); // 添加数据(等价于Model.addAttribute)mav.addObject("name", "商品详情");return mav;
}

2.2 重定向与转发

2.2.1 重定向(redirect:)

重定向会发起新的请求,地址栏URL会变化,之前的Model数据会丢失:

/*** 重定向*/
@GetMapping("/redirect")
public String redirect() {// 重定向到首页(可跳转至其他Controller接口)return "redirect:/toIndex";
}
2.2.2 转发(forward:)

转发是服务器内部跳转,地址栏URL不变,Model数据可共享:

/*** 转发*/
@GetMapping("/forward")
public String forward() {// 转发到详情页(仅能跳转至当前应用内的路径)return "forward:/toDetail";
}

2.3 返回JSON数据(@ResponseBody)

适用于Ajax请求或前后端分离项目,通过@ResponseBody将对象转为JSON返回。

2.3.1 基础用法
@Controller
@RequestMapping("/api/user")
public class UserApiController {/*** 返回单个对象* URL:/api/user/1*/@GetMapping("/{id}")@ResponseBody // 将返回值转为JSONpublic User getUser(@PathVariable Integer id) {// 模拟查询数据库User user = new User();user.setUsername("张三");user.setAge(25);user.setEmail("zhangsan@example.com");return user; // 自动转为JSON}/*** 返回集合* URL:/api/user/list*/@GetMapping("/list")@ResponseBodypublic List<User> getUserList() {List<User> list = new ArrayList<>();list.add(new User("张三", 25, "zhangsan@example.com"));list.add(new User("李四", 28, "lisi@example.com"));return list; // 自动转为JSON数组}/*** 返回自定义结果(统一响应格式)* URL:/api/user/login*/@PostMapping("/login")@ResponseBodypublic Result login(@RequestParam String username,@RequestParam String password) {if ("admin".equals(username) && "123456".equals(password)) {// 登录成功return Result.success("登录成功", new User(username, 0, null));} else {// 登录失败return Result.error("用户名或密码错误");}}
}// 统一响应结果类
@Data
class Result {private int code; // 状态码(200成功,400失败)private String message; // 提示信息private Object data; // 数据// 成功响应public static Result success(String message, Object data) {Result result = new Result();result.code = 200;result.message = message;result.data = data;return result;}// 错误响应public static Result error(String message) {Result result = new Result();result.code = 400;result.message = message;return result;}
}

测试结果
访问/api/user/1,响应JSON:

{"username":"张三","age":25,"email":"zhangsan@example.com"}

访问/api/user/login?username=admin&password=123456,响应JSON:

{"code":200,"message":"登录成功","data":{"username":"admin","age":0,"email":null}}
2.3.2 @RestController简化配置

若控制器所有方法都返回JSON,可使用@RestController替代@Controller(自动为所有方法添加@ResponseBody):

// @RestController = @Controller + @ResponseBody
@RestController
@RequestMapping("/api/book")
public class BookApiController {// 无需添加@ResponseBody,自动返回JSON@GetMapping("/{id}")public Book getBook(@PathVariable Integer id) {return new Book(id, "SpringMVC教程", "技术书籍");}
}

三、实战案例:用户注册与查询

结合请求与响应的核心知识点,实现用户注册(表单提交)和查询(JSON响应)功能。

3.1 注册页面(register.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用户注册</title>
</head>
<body>
<form action="/user/register" method="post">用户名:<input type="text" name="username"><br>年龄:<input type="number" name="age"><br>邮箱:<input type="email" name="email"><br><button type="submit">注册</button>
</form>
</body>
</html>

3.2 结果页面(result.jsp)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>结果页</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>

3.3 Controller完整实现

@Controller
@RequestMapping("/user")
public class UserController {// 跳转注册页面@GetMapping("/toRegister")public String toRegister() {return "register";}// 处理注册(表单提交)@PostMapping("/register")public String register(User user, Model model) {// 模拟保存用户(实际项目中调用Service)model.addAttribute("message", "注册成功!用户信息:" + user);return "result";}// 按条件查询(返回JSON)@GetMapping("/api/query")@ResponseBodypublic Result query(@RequestParam(required = false) String username,@RequestParam(required = false) Integer minAge) {// 模拟查询List<User> users = new ArrayList<>();users.add(new User("张三", 25, "zhangsan@example.com"));users.add(new User("李四", 30, "lisi@example.com"));return Result.success("查询成功", users);}
}

3.4 测试流程

  1. 访问/user/toRegister,填写表单提交;
  2. 注册成功后跳转至结果页,显示用户信息;
  3. 访问/user/api/query?username=张三,获取JSON格式的查询结果。

四、常见问题与避坑指南

4.1 参数绑定失败(400 Bad Request)

错误信息Failed to convert value of type 'java.lang.String' to required type 'java.lang.Integer'

原因

  • 参数类型不匹配(如前端传递字符串,后端接收为Integer);
  • 缺少必填参数(@RequestParam默认必填)。

解决方案

  • 确保参数类型匹配(如年龄参数传递数字,而非字符串);
  • 非必填参数添加required=false
  • 若参数可能为空,使用包装类(Integer)而非基本类型(int)。

4.2 JSON解析失败(400 Bad Request)

错误信息HttpMessageNotReadableException: JSON parse error

原因

  • 请求头未设置Content-Type: application/json
  • JSON格式错误(如缺少引号、逗号);
  • JSON字段与对象属性不匹配(如拼写错误)。

解决方案

  • 发送JSON请求时,务必设置Content-Type: application/json
  • 检查JSON格式(可通过JSON校验工具验证);
  • 确保JSON字段名与对象属性名一致(区分大小写)。

4.3 @ResponseBody返回406 Not Acceptable

错误信息406 Not Acceptable

原因

  • 缺少Jackson依赖,无法将对象转为JSON;
  • 请求头Accept设置不当(如仅接受text/html,但返回JSON)。

解决方案

  • 添加Jackson依赖(jackson-databind);
  • 检查请求头Accept是否包含application/json(或不限制Accept)。

总结:请求与响应的核心要点

SpringMVC的请求与响应是前后端交互的核心:

  1. 请求处理

    • 普通参数用@RequestParam,路径参数用@PathVariable
    • 多参数用对象绑定,JSON参数用@RequestBody
    • 灵活使用可选参数和默认值,避免参数缺失错误。
  2. 响应处理

    • 页面跳转返回逻辑视图名,配合Model传递数据;
    • JSON响应用@ResponseBody@RestController
    • 重定向与转发需区分使用场景(重定向适合外部链接,转发适合内部跳转)。
  3. 避坑关键

    • 参数绑定注意类型匹配和必填性;
    • JSON处理确保依赖正确和格式规范;
    • 前后端约定参数名和数据格式,减少沟通成本。

若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90109.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mysql】 Mysql zip解压版 Win11 安装备忘

1. 官网 MySQL :: MySQL Community Downloads 选择 MySQL Community Server 选择Archives 选择 8.0版本 MySQL :: Download MySQL Community Server (Archived Versions) 1. 普通版本&#xff08;推荐&#xff09; 名称&#xff1a;Windows (x86, 64-bit), ZIP Archive 文件…

Web3面试题

1.在使用 Ethers.js 对接 MetaMask 钱包时&#xff0c;如何检测用户账户切换的情况&#xff1f;请简述实现思路。 答案&#xff1a;可通过监听accountsChanged事件来检测。当用户切换账户时&#xff0c;MetaMask 会触发该事件&#xff0c;在事件回调函数中可获取新的账户地址&…

uni-app动态获取屏幕边界到安全区域距离的完整教程

目录 一、什么是安全区域&#xff1f; 二、获取安全区域距离的核心方法 三、JavaScript动态获取安全区域距离 1. 核心API 2. 完整代码示例 3. 关键点说明 四、CSS环境变量适配安全区域 1. 使用 env() 和 constant() 3. 注意事项 五、不同平台的适配策略 1. H5 端 2…

ZKmall开源商城微服务架构实战:Java 商城系统的模块化拆分与通信之道

在电商业务高速增长的今天&#xff0c;传统单体商城系统越来越力不从心 —— 代码堆成一团、改一点牵一片、想加功能得大动干戈&#xff0c;根本扛不住高并发、多场景的业务需求。微服务架构却能破这个局&#xff1a;把系统拆成一个个能独立部署的小服务&#xff0c;每个服务专…

ROS 与 Ubuntu 版本的对应关系

ROS 作为一套用于构建机器人应用的开源框架&#xff0c;其开发和运行高度依赖 Ubuntu 等 Linux 发行版&#xff0c;尤其是 Ubuntu 因其广泛的兼容性和社区支持&#xff0c;成为了 ROS 最主流的运行平台。 一、ROS 与 Ubuntu 版本的对应关系&#xff08;截至 2025 年&#xff0c…

GPT-4o mini TTS:领先的文本转语音技术

什么是 GPT-4o mini TTS&#xff1f; GPT-4o mini TTS 是 OpenAI 推出的全新一代文本转语音&#xff08;TTS&#xff09;技术&#xff0c;能够以自然、流畅的方式将普通文本转换为语音。依托先进的神经网络架构&#xff0c;GPT-4o mini TTS 在语音合成中避免了传统 TTS 的生硬…

Git下载全攻略

目标读者初学者或有经验的开发者不同操作系统用户&#xff08;Windows、macOS、Linux&#xff09;下载前的准备确认系统版本和位数&#xff08;32-bit/64-bit&#xff09;检查网络环境是否稳定确保有足够的磁盘空间Windows系统下载Git访问Git官方网站&#xff08;https://git-s…

ADAS域控软件架构-网络管理状态与唤醒机制

1. 状态介绍: Sleep Mode:总线睡眠模式,控制器不发送应用报文和网络管理报文。 Pre-Sleep Mode:准备总线睡眠模式,控制器不发送应用报文和网络管理报文。 Ready Sleep Mode:就绪睡眠模式,系统发送应用报文但是不发送网络管理报文。 Normal Operation mode:正常工作模式…

pytest简单使用和生成测试报告

目录 1. 基本使用 1--安装 2--pytest书写规则 3--为pycharm设置 以 pytest的方式运行 4--setup和teardown 5--setup_class和teardown 2. pytest生成测试报告 基本使用 安装 pytest文档地址 pytest documentation pip install pytest点击pycharm左边的控制台按钮 输入pip inst…

Spring Boot 第一天知识汇总

一、Spring Boot 是什么&#xff1f;简单说&#xff0c;Spring Boot 是简化 Spring 应用开发的框架 —— 它整合了整个 Spring 技术栈&#xff0c;提供了 “一站式” J2EE 开发解决方案。核心优点&#xff1a;快速创建独立运行的 Spring 项目&#xff0c;无需繁琐配置&#xff…

MySql主从部署

MySql主从部署 1、操作环境 硬件环境&#xff1a;香橙派5 aarch64架构 软件环境&#xff1a;Ubuntu 22.04.3 LTS 软件版本&#xff1a;mysql-8.0.42 操作方式&#xff1a;mysql_1,mysql_2容器 主节点&#xff1a;mysql_1 启动命令&#xff1a;docker run --name mysql_master \…

Redis——Redis进阶命令集详解(下)

本文详细介绍了Redis一些复杂命令的使用&#xff0c;包括Redis事务相关命令&#xff0c;如MULTI、EXEC、DISCARD 和 WATCH ,发布订阅操作命令&#xff0c;如PUBLISH 、SUBSCRIBE 、PSUBSCRIBE ,BitMap操作命令&#xff0c;如SETBIT、GETBIT、BITCOUNT、BITOP&#xff0c;HyperL…

C#使用socket报错 System.Net.Sockets.SocketException:“在其上下文中,该请求的地址无效。

bind: 在其上下文中&#xff0c;该请求的地址无效。问题定位 程序中运行socket服务端程序时&#xff0c;绑定的IP地址无效&#xff0c;即请求的IP地址在你的机子上找不到。原因有以下几种可能&#xff1a; 1&#xff09;server端绑定的IP地址不是本机的IP地址。 2&#xff09;之…

计算机底层入门 05 汇编学习环境通用寄存器内存

2.3 汇编学习环境我们通过上一章笔记&#xff0c;得知 计算机好像 只会通过位运算 进行 数字的加法。 而机器语言的魅力就是 位运算&#xff0c;解析规则。它们也都是通过 电路 来进行实现的。这就是 计算机最底层的本质了&#xff01;&#xff01;&#xff01; 汇编语言 所谓的…

Java学习---Spring及其衍生(上)

在 Java 开发领域&#xff0c;Spring 生态占据着举足轻重的地位。从最初的 Spring 框架到后来的 SpringBoot、SpringMVC 以及 SpringCloud&#xff0c;每一个组件都在不同的场景下发挥着重要作用。本文将深入探讨这几个核心组件&#xff0c;包括它们的定义、原理、作用、优缺点…

LVGL应用和部署(个人开发嵌入式linux产品)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】随着经济越来越走向常态化发展&#xff0c;将来的公司基本是两个趋势&#xff0c;一个是公司越做越大&#xff0c;越来越趋向于垄断&#xff1b;另外…

CPU,减少晶体管翻转次数的编码

背景 以4比特为单位&#xff0c;共16个数。仔细思考状态转换过程中的晶体管翻转次数。 0000 0001&#xff0c;1 0010&#xff0c;2 0011&#xff0c;1 0100&#xff0c;3 0101&#xff0c;1 0110&#xff0c;2 0111&#xff0c;1 1000&#xff0c;4 1001&#xff0c;1 1010&…

LLM 中的 温度怎么控制随机性的?

LLM 中的 温度怎么控制随机性的? 在LLM的解码过程中,温度(Temperature)通过调整token概率分布的“陡峭程度”来控制随机性:温度越低,概率分布越陡峭(高概率token的优势越明显),随机性越低;温度越高,分布越平缓(高低概率token的差异被缩小),随机性越高。 温度,…

freemodbus使用

文章目录✅ **CubeMX配置**1. UART配置&#xff08;RS485通信&#xff09;2. Timer配置&#xff08;RTU字符间隔检测&#xff09;3. GPIO配置&#xff08;RS485方向控制&#xff09;✅ **STM32F103 RS485 FreeModbus RTU 配置概览****1️⃣ CubeMX硬件配置****2️⃣ FreeModb…

【Ansible】Ansible 管理 Elasticsearch 集群启停

一、集群节点信息 通过 Ansible inventory 定义的集群节点分组如下&#xff1a;[es]&#xff08;Elasticsearch 节点&#xff09; 192.168.100.150192.168.100.151192.168.100.152[logstash]&#xff08;Logstash 节点&#xff09; 192.168.100.151[kibana]&#xff08;Kibana …