转:https://blog.csdn.net/LostSh/article/details/68923874

SpringMVC接受JSON参数详解及常见错误总结

最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP。所以把一个练手项目的前台全部改成Ajax了,跳转再使用SpringMVC控制转发。对于传输JSON数据这边有了更深的一些理解,分享出来,请大家指正。

SpringMVC中我们可以选择数种接受JSON的方式,在说SpringMVC如何接受JSON之前,我们先聊聊什么是JSON。具体的定义我也不赘述了,在JavaScript中我们经常这样定义JSON 对象

var jsonObject = {
"username":"admin",
"password":123 }
  • 1
  • 2
  • 3
  • 4

这种形式的我们叫它JSON对象,同时还有一个概念叫做JSON字符串,字符串呢,顾名思义,是由’ ‘或者” “包裹起来的一个整体,我们称之为字符串。我们知道字符串是可以直接输出的,而对象不能直接输出。所以在JavaScript中,我们可以

//定义一个对象 jsonObject
var jsonObject = {
"username":"admin",
"password":123 }; alert(jsonObject);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此时,会显示[object Object]而不会输出JSON对象的内容,JavaScript向我们提供了两个工具

JSON.parse()
用于将一个 JSON 字符串转换为 JavaScript 对象。
JSON.stringify()
用于将 JavaScript 值转换为 JSON 字符串。

所以当我们输入

alert(JSON.stringify(jsonObject));
  • 1

就会显示 {“username”:”admin”,”password”:123};

* 好了 对于JSON的讲解就到这里了 下面我们说一说SpringMVC *

既然JSON有着上述两种存在方式,那我们通过ajax向SpringMVC传值的时候,我们该传哪一种呢?
我们首先尝试直接发送JSON对象

//定义json对象var username = $("#username").val();var password = $("#password").val(); var json = { "username" : username, "password" : password }; // Jquery Ajax请求 $.ajax({ url : "jsontest", type : "POST", async : true, data : json, dataType : 'json', success : function(data) { if (data.userstatus === "success") { $("#errorMsg").remove(); } else { if ($("#errorMsg").length <= 0) { $("form[name=loginForm]").append(errorMsg); } } } });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

我们首先想想SpringMVC提供了什么给我们,有一个@RequestParam的注解,对于这个注解,它的作用和我们Servlet中的request.getParameter是基本相同的。我们首先使用这个注解来获取

    @RequestMapping("/jsontest")public void test(@RequestParam(value="username",required=true) String username, @RequestParam(value="password",required=true) String password){ System.out.println("username: " + username); System.out.println("password: " + password); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

后台成功输出的我们的参数,成功接受!

SpringMVC如此智能,如果我们去除@RequestParam注解,直接将两个值放入会有什么后果?

@RequestMapping("/jsontest")public void test(String username,String password){ System.out.println("username: " + username); System.out.println("password: " + password); }
  • 1
  • 2
  • 3
  • 4
  • 5

竟然同样成功了,原理我这里就不多赘述了,有兴趣的朋友们可以打断点看看。

SpringMVC提供了一个@RequestBody,它是用来处理前台定义发来的数据Content-Type: 不是application/x-www-form-urlencoded编码的内容,例如application/json, application/xml等;
细心的朋友们或许发现了,在之前的Ajax中,我们没有定义Content-type的类型,Jquery默认使用application/x-www-form-urlencoded类型。那么意思就是SpringMVC的@RequestParam注解,Servlet的request.getParameter是可以接受到以这种格式传输的JSON对象的。

为什么呢!?GET请求想必大家都不陌生,它将参数以url?username=”admin”&password=123这种方式发送到服务器,并且request.getParameter可以接收到这种参数,我们在浏览器地址栏上也可以看到这一点。而我们Ajax使用的POST,并且发送的是JSON对象,那么后台是如何获取到的呢?答案就在于这个Content-Type x-www-form-urlencoded的编码方式把JSON数据转换成一个字串,(username=”admin”&password=123)然后把这个字串添加到url后面,用?分割,(是不是和GET方法很像),提交方式为POST时候,浏览器把数据封装到HTTP BODY中,然后发送到服务器。所以并不会显示在URL上。(这段可能有点绕口,希望大家用心理解一下。)
终于说完了,长吐一口气。所以说我们使用@RequestBody注解的时候,前台的Content-Type必须要改为application/json,如果没有更改,前台会报错415(Unsupported Media Type)。后台日志就会报错Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported,这些错误Eclipse下Tomcat是不会显示错误信息的,只有使用了日志才会显示,如何配置日志大家可以看我上一篇文章。接下来我们正确配置一下,上面说到了 Content-Type需要更改,同时我们的data也要更改了,这种注解方式只接受JSON字符串而不是JSON对象

$.ajax({url : "jsontest",type : "POST",async : true,contentType : "application/json",data : JSON.stringify(json), dataType : 'json', success : function(data) { if (data.userstatus === "success") { $("#errorMsg").remove(); } else { if ($("#errorMsg").length <= 0) { $("form[name=loginForm]").append(errorMsg); } } } });
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

后台也更改一下,json其实可以理解为键值对嘛,所以我们用Map接收,然后对字符串或者其他数据类型进行进一步处理。

    @RequestMapping("/jsontest")public void test(@RequestBody(required=true) Map<String,Object> map ){ String username = map.get("username").toString(); String password = map.get("password").toString(); System.out.println("username: " + username); System.out.println("password: " + password); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

同时,我又想起了神奇的SpringMVC,所以我决定去掉注解试试,好的,果断被爆了一个空指针错误…尝试就此打住。
SpringMVC还提供了参数直接和POJO绑定的方法,我们来尝试一下。前台一样,就不贴出来了。

@RequestMapping("/jsontest")public void test(@RequestBody User user ){ String username = user.getUsername(); String password = user.getPassword(); System.out.println("username: " + username); System.out.println("password: " + password); }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

OK,这次是可以取到值的,我个人对于登录这类小数据量的上传来说不太喜欢这种方法,User里面的变量很多,我只用了其中两个,没有必要去创建一个User对象,一般数据量小的时候我还是比较喜欢使用单独取值出来的。我们再想一想,如果是在上传JSON对象的情况下,我们可不可以绑定POJO呢,答案是可以的,不要使用@RequestParam注解,否则会报Required User parameter 'user' is not present错误。到此讲解基本结束了,下面来总结一下。

  • 我们首先说了JSON对象和JSON字符串
  • 然后说了SpringMVC接受两种两种JSON格式的时候,前端ContentType的设定,和后端是否使用注解接受,还提到了一点Servlet。
  • 当Ajax以application/x-www-form-urlencoded格式上传即使用JSON对象,后台需要使用 @RequestParam 或者Servlet获取。 当Ajax以application/json格式上传即使用JSON字符串,后台需要使用@RquestBody获取。

这是我实验了一天的一些总结,希望可以帮助到大家,如果有错误,请各位海涵并指正。

转载于:https://www.cnblogs.com/zhanglijun/p/9104820.html

SpringMVC接受JSON参数详解相关推荐

  1. SpringMVC接受JSON参数详解及常见错误总结我改

    SpringMVC接受JSON参数详解及常见错误总结 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前 ...

  2. SpringMVC教程--json使用详解

    json数据交互 1.1 @RequestBody 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将 ...

  3. 谷歌浏览器扩展程序manifest.json参数详解

    {// Required"manifest_version": 2, // manifest编写规范版本,目前主流2"name": "My Exten ...

  4. pm2 start 带参数_pm2 start命令中的json格式详解

    就像苏南大叔所说的那样,pm2 start npm -- start这条命令是pm2的万能命令,pm2 start ,就是这一系列命令中的最豪华命令.这个json我们可以理解为一个任务参数描述文件.通 ...

  5. daemon.json配置参数详解

    ** daemon.json配置参数详解 ** 背景 docker安装的时候没有daemon.json这个文件 一般情况下,daemon.json中配置的项目参数,在启动参数中同样适用.(有些可能会冲 ...

  6. Celery参数详解、配置参数

    参数详解 Celery--Worker 准备: 安装 pip install celery easy_install celery 使用Redis作为Broker时 ,需安装 celery-with- ...

  7. java action result_Struts2 Result 返回JSON对象详解

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好 ...

  8. 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略

    目录 引言 线程池使用场景 加快请求响应(响应时间优先) 加快处理大任务(吞吐量优先) 特殊说明 线程池的池化技术 线程池的创建 手动创建 创建newFixedThreadPool线程池 创建newS ...

  9. CI流水线配置文件参数详解(一)

    文章目录 4. 参数详解(一) 4.1 ``script`` 4.2 ``image`` 指定使用Docker镜像.如 ``iamge:name`` ,暂时忽略. 4.3 ``before_scrip ...

  10. spring boot 实战 / 可执行war启动参数详解

    概述   上一篇文章<spring boot 实战 / mvn spring-boot:run 参数详解>主要讲解了spring boot 项目基于maven插件启动过程中借助profil ...

最新文章

  1. SAP MM供应商主数据表
  2. IOS 本地推送 IOS10.0以上 static的作用 const的作用
  3. 【MySQL】MySQL出现Waiting for table metadata lock的原因、解决方法
  4. java fx listview,JavaFX 8自定义ListView单元它是邪恶的
  5. 【渝粤教育】电大中专微生物与寄生虫基础作业 题库
  6. Spring Boot 学习(一) 快速搭建SpringBoot 项目
  7. DOM(二)——修改内容、属性、样式
  8. 【Java数据结构】Map与Set、搜索树、哈希表
  9. 双模sa_七句话讲清NSA单模与SA+NSA双模手机的真实区别
  10. java圆角矩形_[转]c# 画圆角矩形
  11. 用 Unity 编写象棋游戏
  12. 速达3000pro saas数据库修复
  13. QT Libvlc播放视频时捕获鼠标和键盘事件
  14. 计算机专业英语朱龙主编,计算机专业英语(高职高专计算机系列)
  15. 7-34 任务调度的合理性(25 分)
  16. 辽宁省省直个人住房公积金贷款指南
  17. EXCEL多列vlookup匹配
  18. 基于GPU编程的三维重建系统
  19. excel表格行宽列高怎么设置_解决方案:Excel自动调整列宽和行宽什么是快捷键? [Excel设置行高度自适应]...
  20. BufferedWriter的用法

热门文章

  1. android提交sql语句,Android实现创建或升级数据库时执行语句
  2. Linux学习笔记(8)
  3. 操作BOM对象的方法
  4. 服务器下 读取springboot application配置文件_一文读懂 Spring Boot 配置文件 application.properties !...
  5. python des加密文件_python基于pyDes库实现des加密的方法
  6. git commit后,如何撤销commit
  7. word ctrl v 不能用
  8. kubernetes Ingress是什么
  9. 陕西师范大学计算机专业录取,陕西师范大学计算机类专业2016年在湖北理科高考录取最低分数线...
  10. linux xfs 字体服务,Linux下Python和Tkin的字体管理