当前位置: 首页 > news >正文

SSM学习之使用@ResquestBody注解处理json格式的请求参数

在学习ajax异步请求的时候,如果通过post请求发送json格式的请求参数,服务端是无法通过request.getParameter()方法获取请求参数的。那么在ssm学习过程中,我学到了一个处理json格式的请求参数的注解@RequestBody。它的作用是将请求体中的内容和我们后端控制器方法的形参进行绑定,获取到字符串类型的请求数据。

让我们先来看前端代码:

这里我使用了axios和vue。所以在实现相关的代码之前,我们需要引入axios.min.js和vue.js。

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <div id="app"> <input type="button" value="使用@RequestBody注解处理json格式的请求参数" @click="testRequestBody"></input> </div> <script type="text/javascript" th:src="@{/static/axios.min.js}"></script> <script type="text/javascript" th:src="@{/static/vue.js}"></script> <script type="text/javascript"> let vue = new Vue({ el:"#app", methods:{ testRequestBody(){ axios.post( "test/RequestBody/json", {username:"admin", password:"123456",age:18,gender:"男"} ).then(response => { console.log(response.data) }).catch(error =>{ console.log(error.message) }) } } }) </script> </body> </html>

在vue对象中,我们重点关注methods属性的第二个方法testRequestBody()。

这里我们向服务器发送了一个json格式的请求数据。

{username:"admin", password:"123456",age:18,gender:"男"}

在后端服务器中,我们设置了对应url的控制器方法。

@RequestMapping("/test/RequestBody/json") public void testRequestBody(HttpServletResponse response, @RequestBody String requestBody) throws IOException { System.out.println("requestBody:"+requestBody); response.getWriter().write("Hello,Ajax&Axios"); } public void testRequestBody(@RequestBody Map<String,Object> map, HttpServletResponse response) throws IOException { System.out.println(map); response.getWriter().write("Hello,RequestBody"); }
public void testRequestBody(@RequestBody User user, HttpServletResponse response) throws IOException { System.out.println(user); response.getWriter().write("Hello,RequestBody"); }

在讲解方法代码之前,我得先说明几点注意事项:

1.ajax异步请求旨在仅在修改局部页面,来实现对于用户操作的响应。因此,我们这里虽然设置了Thymeleaf的ThymeleafViewResolver来简化页面跳转操作,但是我们不需要这样做。因为我们只是想在当前页面获取响应信息。所以这里的返回值不是String而是void。

2.在使用axios时,我可以使用两种方式来发送异步请求。

第一种方式:

axios({

url:"test/RequestBody/json",

method:"post",

// params:{},

data:{username:"admin", password:"123456",age:18,gender:"男"}

}) .then(response =>{

console.log(response.data)

}) .catch(error =>{

console.log(error.message)

})

第二种方式:

axios.post(

"test/RequestBody/json"

{username:"admin", password:"123456",age:18,gender:"男"}

) .then(response =>{

console.log(response.data)

}) .catch(error =>{

console.log(error.message)

})

这里我想说明两点:

1.对于第一种方法,params和data属性对应的值都是请求参数。两者的不同之处在于,params属性中的参数,无论是请求方式是get还是post,请求的参数以key=value形式自动拼接到url后面,这种方式可以在后端通过request.getParameter()获取。而data属性的参数,是以json格式保存到请求报文中的请求体了,这里的请求方式不能为get。因此是不能通过getParameter()方法获取的。

2.url如果在配置tomcat服务器时设置了访问的上下文路径的话,就必须加上。这里我设置上下文路径为“/”,因此省略。

接下来我们来解析后端代码,对于第一个方法。我们只能获取到字符串类型的响应数据。但是很显然这不是我们想获取到的数据。我们想获取到的是给个key然后就获取到对应value的类似map集合的数据。

public void testRequestBody(HttpServletResponse response, @RequestBody String requestBody) throws IOException { System.out.println("requestBody:"+requestBody); response.getWriter().write("Hello,Ajax&Axios"); }

所以我们就引入了后面两个方法。但要将json格式的数据进行解析,有三个要求:

1.导入jackson的依赖包

<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.1</version> </dependency>

2.在springmvc的配置文件中开启注解驱动

<mvc:annotation-driven/>

3.处理请求的控制器方法的形参位置,直接设置json格式的请求参数要转换的java类型的形参 使用@RequestBody注解表示即可。如下面两个方法中的map和user。

public void testRequestBody(@RequestBody Map<String,Object> map, HttpServletResponse response) throws IOException { System.out.println(map); response.getWriter().write("Hello,RequestBody"); }
public void testRequestBody(@RequestBody User user, HttpServletResponse response) throws IOException { System.out.println(user); response.getWriter().write("Hello,RequestBody"); }

如果在后端中没有对应的java类型,我们就可以使用map集合以key-value形式获取响应数据。

如果后端有对应的java类型,我们就可以直接使用对应的类型,自动生成对应类的实例。

http://www.jsqmd.com/news/605662/

相关文章:

  • RedisDesktopManager-Windows故障排除:解决常见安装与运行问题的完整清单
  • 网络小课堂
  • GitLab 13升14实战:从报错到成功,我的踩坑全记录(附详细解决方案)
  • MacBook安装OpenClaw:M系列芯片运行Kimi-VL-A3B-Thinking优化指南
  • 微信小程序/小游戏:方糖试玩SEO优化全攻略(2026实操版)
  • 终极指南:如何用Le Git Graph为GitHub添加可视化提交历史
  • 2026年CZ型钢技术全解析:工艺、选型与成本管控 - 优质品牌商家
  • OpenClaw语音交互扩展:Qwen3-32B镜像对接本地ASR服务
  • OpenClaw学术研究加速:Qwen3.5-9B文献图表数据提取全攻略
  • 西门子PLC中String与WString的数据存储机制解析
  • Laravel WebSockets 2025年技术路线图:终极发展指南
  • WindowsInternals安全策略分析:SlPolicy工具的高级用法指南
  • 如何利用 SEO 优化平台提高网站排名
  • MeArm机械臂(Arduino)
  • OpenClaw硬件要求解析:千问3.5-27B在不同配置电脑的运行表现
  • so-vits-svc的使用声音克隆
  • OpenClaw配置优化指南:提升Qwen2.5-VL-7B图文任务执行效率30%
  • 如何为LSTM时间序列预测项目编写单元测试:终极完整指南
  • 如何快速启用Go-RESTful的Gzip和Deflate压缩:终极配置指南
  • Harmony-Music设置优化:动态主题、均衡器和睡眠定时器配置
  • 别再傻傻分不清了!IM和RTC到底差在哪?从微信聊天到视频会议的技术选择
  • BC7215红外编解码芯片:协议无关的物理层信号处理方案
  • 2023终极指南:OctoSQL vs DataFusion vs q三大SQL查询引擎性能深度对比与选择攻略
  • Windows自动化安装终极指南:UnattendedWinstall与其他工具全面对比
  • OpenClaw成本优化:Kimi-VL-A3B-Thinking自部署与API调用对比
  • Markdown转PDF常见坑点排查:VSCode+Prince字体乱码/缩进异常解决指南
  • pix2pix-tensorflow超参数调优终极指南:学习率与损失权重优化技巧
  • OpenClaw多模型切换:Qwen3-32B与本地小模型的任务分配策略
  • 抗辐照MCU芯片在激光雷达领域的适配性分析
  • 10分钟快速部署ThreatMapper:云原生安全监控的终极指南