基于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参数详解及常见错误总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

您可能感兴趣的文章:

  • 详解springmvc 接收json对象的两种方式
  • 详解springMVC之与json数据交互方法
  • SpringMVC教程之json交互使用详解
  • SpringMVC中Json数据格式转换
(0)

相关推荐

  • SpringMVC中Json数据格式转换

    1  @RequestBody 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json.xml等格式的数据并绑定到controller方法的参数上. List.action?id=1&name=zhangsan&age=12 本例子应用: @RequestBody注解实现接收http请求的json数据,将json数据转换为java对象  2  @ResponseBody 作

  • SpringMVC教程之json交互使用详解

    json数据交互 1.1 @RequestBody 作用:@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json.xml等格式的数据并绑定到controller方法的参数上. 本例子应用:@RequestBody注解实现接收http请求的json数据,将json数据转换为Java对象 1.2 @ResponseBody 作用:该注解用于将Controller的方法返回的对象,通过Http

  • 详解springMVC之与json数据交互方法

    前台代码: function channel(){ //先获取选中的值 var channelId = $("#channelId option:selected").val(); //来判断发送的链接 if(channelId ==2){ **需要注意地方 start** var schoolBannerInfo = { "img": channelId, "title": channelId, "info": channe

  • 详解springmvc 接收json对象的两种方式

    最近学习了springmvc 接收json对象的两种方式,现在整理出来,具体如下: 1.以实体类方式接收 前端 ajax 提交数据: function fAddObj() { var obj = {}; obj['objname'] = "obj"; obj['pid'] = 1 ; $.ajax({ url: 'admin/Obj/addObj.do', method: 'post', contentType: 'application/json', // 这句不加出现415错误:U

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

    最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP.所以把一个练手项目的前台全部改成Ajax了,跳转再使用SpringMVC控制转发.对于传输JSON数据这边有了更深的一些理解,分享出来,请大家指正. 在SpringMVC中我们可以选择数种接受JSON的方式,在说SpringMVC如何接受JSON之前,我们先聊聊什么是JSON.具体的定义我也不赘述了,在JavaScript中我们经常这样定义JSON 对象 var jsonO

  • 基于webpack.config.js 参数详解

    webpack.config.js文件通常放在项目的根目录中,它本身也是一个标准的Commonjs规范的模块. var webpack = require('webpack'); module.exports = { entry: [ 'webpack/hot/only-dev-server', './js/app.js' ], output: { path: './build', filename: 'bundle.js' }, module: { loaders: [ { test: /\.

  • MySQL的主从复制步骤详解及常见错误解决方法

    mysql主从复制(replication同步)现在企业用的比较多,也很成熟.它有以下优点: 1.降低主服务器压力,可在从库上执行查询工作. 2.在从库上进行备份,避免影响主服务器服务. 3.当主库出现问题时,可以切换到从库上. 不过,用它做备份时就会也有弊端,如果主库有误操作的话,从库也会收到命令. 下面直接进入操作.这里使用的是debian5操作系统,mysql5.0,默认引擎innodb 10.1.1.45 主库 10.1.1.43 从库 1.设置主库 1)修改主库my.cnf,这里主要是

  • 基于JSON数据格式详解

    JSON是行业内使用最为广泛的数据交换格式,在很多场景都有广泛的应用.JSON适用于进行数据交互的场景,典型的是Ajax中实现异步加载:为了支持跨平台.数据安全等的Web Service也可以使用(API接口返回值). JSON(JavaScript Object Notation)是一种完全独立于语言的.轻量级的数据交换格式.它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子

  • Struts2 Result 返回JSON对象详解

    如果是作为客户端的HTTP+JSON接口工程,没有JSP等view视图的情况下,使用Jersery框架开发绝对是第一选择.而在基于Spring3 MVC的架构下,对HTTP+JSON的返回类型也有很好的支持.但是,在开发工作中,对功能的升级是基于既定架构是很常见的情况.本人碰到需要用开发基于Struts2的HTTP+JSON返回类型接口就是基于既定框架结构下进行的. Struts2返回JSON有两种方式:1.使用Servlet的输出流写入JSON字符串:2.使用Struts2对JSON的扩展.

  • 基于JavaScript表单脚本(详解)

    什么是表单? 一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数据提交到服务器的方法. 表单域:包含了文本框.密码框.隐藏域.多行文本框.复选框.单选框.下拉选择框和文件上传框等. 表单按钮:包括提交按钮.复位按钮和一般按钮:用于将数据传送到服务器上的CGI脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作. JavaScript与表单间的关系:JS最初的应用就是用于分担服务器处理表单的责任,打破依赖服务器的局面,尽管目前web和jav

  • JSON 数据详解及实例代码分析

     JSON 数据详解 一.json值的类型 1.简单值: 可以表示字符串,数值,布尔值,null不支持undefined(json的数值表示: 2 ) 2.对象: 一组有序的键值对,每个键值对的值可以是简单值,也可以是复杂数据类型.(json的字符串:"hello world").json字符串与JavaScript字符串的区别,json必须用双引号. 3.数组:一组有序值的列表,数组的值可以是简单值,也可以是复杂数据类型. 不支持变量,函数,以及对象实例 二.json对象与javas

  • 基于Jexus-5.6.3使用详解

    一.Jexus Web Server配置 在 jexus 的工作文件夹中(一般是"/usr/jexus")有一个基本的配置文件,文件名是"jws.conf". jws.conf 中至少有 SiteConfigDir 和 SiteLogDir 两行信息: SiteConfigDir=siteconf #指的是存放网站配置文件放在siteconf这个文件夹中,可以使用基于jws.exe文件的相对路径 SiteLogDir=log #指的是jexus日志文件放在log这个

  • 基于wordpress的ajax写法详解

    想针对一个wordpress的模板程序进行更改,想到ajax的方便,就研究了一下. 以下是使用方法和代码: js页面如下 <script> var ajaxurl = '<?php echo admin_url('admin-ajax.php')?>'; function getVideo(id){ //必须使用以下里面才能正常使用jquery jQuery(document).ready(function($){ var data={ tape:id, //这里尤为重要,acti

  • springmvc分层领域模型概念详解

    目录 1.为什么出现分层领域模型这个东西? 2.分层领域模型有哪些? 3.分层领域模型的简单理解 3.1 VO和DTO的区别 3.2BO和DTO的区别 4.总结 本文核心为分层领域模型(VO , PO , BO, DAO ,POJO等)概念的个人理解. 1.为什么出现分层领域模型这个东西? (1)解决MVC架构中各层(比如视图层+控制层+服务层+数据访问层+数据库)中各层数据交互时,传递什么数据模型更加科学和合理. (2)更好的降低MVC架构中各层间的耦合性,提高层内的内聚性,这样更方便对软件进

随机推荐