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

 更新时间:2018年03月27日 10:15:43   作者:Heinzyang  
下面小编就为大家分享一篇基于SpringMVC接受JSON参数详解及常见错误总结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

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

var jsonObject = {
"username":"admin",
"password":123
}

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

//定义一个对象 jsonObject
var jsonObject = {
"username":"admin",
"password":123
};
alert(jsonObject);

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

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

所以当我们输入

alert(JSON.stringify(jsonObject));

就会显示 {“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);
      }
     }
    }
   });

我们首先想想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);
 }

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

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

@RequestMapping("/jsontest")
 public void test(String username,String password){
  System.out.println("username: " + username);
  System.out.println("password: " + password);
 }

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

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);
      }
     }
    }
   });

后台也更改一下,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);
 }

同时,我又想起了神奇的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);
 }

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

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

以上这篇基于SpringMVC接受JSON参数详解及常见错误总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 快速使用IDEA图形化界面连接Phoenix的方法

    快速使用IDEA图形化界面连接Phoenix的方法

    最近很多朋友跟小编留言如何使用IDEA图形化界面连接Phoenix,在这小编就不一一回复大家了,今天抽空给大家整理一篇教程关于idea 图形化界面连接Phoenix的相关知识,需要的朋友快来学习下吧
    2021-05-05
  • springmvc json类型转换错误解决方案

    springmvc json类型转换错误解决方案

    这篇文章主要介绍了springmvc json类型转换错误解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    这篇文章主要介绍了如何解决SpringBoot2.x版本对Velocity模板不支持的方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 使用Java对URL进行编码和解码

    使用Java对URL进行编码和解码

    在互联网应用中,URL(Uniform Resource Locator,统一资源定位符)是定位和访问网络资源的重要标识,然而,URL 中可能包含一些特殊字符,为了保证 URL 的有效性和兼容性,必须对 URL 进行编码处理,所以本文给大家介绍了如何使用Java对URL进行编码和解码
    2025-03-03
  • idea无法打断点,单击或双击代码行左侧区域无效的解决

    idea无法打断点,单击或双击代码行左侧区域无效的解决

    这篇文章主要介绍了idea无法打断点,单击或双击代码行左侧区域无效的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 聊聊Spring Cloud Cli 初体验

    聊聊Spring Cloud Cli 初体验

    这篇文章主要介绍了聊聊Spring Cloud Cli 初体验,SpringBoot CLI 是spring Boot项目的脚手架工具。非常具有实用价值,需要的朋友可以参考下
    2018-04-04
  • java String类功能、原理与应用案例【统计、判断、转换等】

    java String类功能、原理与应用案例【统计、判断、转换等】

    这篇文章主要介绍了java String类功能、原理与应用案例,结合实例形式详细分析了java String类的基本功能、构造方法,以及使用String类实现统计、判断、转换等功能相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Java数据结构与算法之插值查找解析

    Java数据结构与算法之插值查找解析

    这篇文章主要介绍了Java数据结构与算法之插值查找解析,插值查找算法类似于二分查找,不同的就是插值查找每次从自适应mid处开始查找,需要的朋友可以参考下
    2023-12-12
  • SSM Mapper文件查询出返回数据查不到个别字段的问题

    SSM Mapper文件查询出返回数据查不到个别字段的问题

    这篇文章主要介绍了SSM Mapper文件查询出返回数据查不到个别字段的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • java中注解的实现原理详解

    java中注解的实现原理详解

    这篇文章主要介绍了java中注解的实现原理详解,注解也叫元数据,例如我们常见的@Override和@Deprecated,注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解,需要的朋友可以参考下
    2023-10-10

最新评论