金沙国际网址SpringMVC选取JSON参数详细明白及何奇之有错误总计本身改

再用ajax传值到后台的时候,发掘多少个像样都得以,因为@RequestBody采纳的是json,所以前端要卷入成json,而@RequestParam却毫无,少了打包的这一步。何况@RequestParam使用限定好像更广一些,不过几人说现在前端未来端传值基本都以json,所以应该使用@RequestBody??那到底那七个是哪四个相比较好用???还是按地方区分??按场地又是如哪一天候用@RequestBody,哪天用@RequestParam??上面是自己用@RequestParam传数组到Controller的代码:假如用@RequestBody,前端就象是多贰个封装json的步调,不是更麻烦一点???

金沙国际网址 1

SpringMVC选用JSON参数安详严整及广大错误计算

新近一段时间不想接收Session了,想体会一下Token这么相比安全,稳健的章程,顺便写叁个合并的接口给浏览器还大概有应用程式。所以把三个练手项目标前台整体制修正成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数据的艺术:

既然JSON有着上述三种存在情势,那我们经过ajax向SpringMVC传值的时候,大家该传哪一类呢? 
大家率先尝试直接发送JSON对象

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

 

咱俩首先用脑筋想SpringMVC提供了哪些给大家,有贰个@RequestParam的解说,对于那一个表明,它的功能和大家Servlet中的request.getParameter是基本相通的。我们率先应用这么些注明来赢得

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

 

后台成功输出的大家的参数,成功采取!

 

SpringMVC如此智能,假若大家去除@RequestParam申明,间接将四个值归入会有何样结果?

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

 

依然相近成功了,原理笔者那边就非常的少废话了,有意思味的情大家方可打断点看看。

 

上边是第一种传json格式数据到后台的艺术,关键就是两点

1、前台传的是json对象。(笔者觉着传json字符串也得以,还从未测验过)

再者,ajax中绝对不能写 **contentType : "application/json"**,

【不写就是用的默认的jQuery默认使用application/x-www-form-urlencoded类型】

2、在java的controller中得以用这么些***@RequestParam***

 也得以怎么都不写,直接用字符串参数接纳只是绝对无法写@RequestBody

 

 

————————————————————————————————————————————————

 

其次种传json数据到后台的章程:

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中,然后发送到服务器。所以并不会显得在ULANDL上。(这段大概有一点点绕口,希望大家细心境解一下。) 

究竟说罢了,长吐一口气。所以说我们运用@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对象

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

 

后台也更正一下,json其实能够领会为键值对嘛,所以我们用Map选用,然后对字符串只怕此外数据类型举办更为管理。

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

 【数据少能够用map接纳也能够在本来的实体类中参预不常的(只为选择传递参数而不用来操作数据库的)成员变量来收纳】

 

再者,笔者又想起了玄妙的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数据到后台的法子,关键计算就两点www.js333com,:

1、大家后台使用@RequestBody评释的时候,

前台的ajax发送诉求时,必得抬高**contentType : "application/json",**

而且发送的必须是json字符串 JSON.stringify(json) 绝对不能是json对象{}

2、这个时候后台controller中必需用@RequestBody注解

 

3、补充第3点要留神的地点:

一旦后台用@RequestBody证明,那样将要求前台ajax必须用 

contentType : "application/json"

办法,当同二回倡议除了传递json类型还传递超多别样的品类参数比方字符串参数时,就或报400谬误。这一个是个硬伤,要用这种情势,Controller层方法中只好选择叁个Json类型的参数,不可能再有此外品类的参数。

 

  • 当Ajax以application/x-www-form-urlencoded格式上传纵然用JSON对象,后台须求利用@RequestParam 只怕Servlet获取。 当Ajax以application/json格式上传即使用JSON字符串,后台须要运用@GL450questBody获取。

    那是本人尝试了一天的一部分计算,希望能够援救到大家,假如有荒谬,请各位海涵并指正。

saveId:["1","2","3"]//这是数组,要传到后端var_this=this;if(this.saveId.length0){$.post("all_delete",{"deid":_this.saveId},function(data){if(data=="success"){alert("删除成功!");_this.ttPage();//重新获取数据的ajax}})}

@RequestMapping("/all_delete")@ResponseBodypublicStringall_delete(@RequestParam(value="deid[]")String[]a){userserviceimpl.deleteId(a);return"success";}

相应的后端处理情势,设置@RequestBody

3、Content-Type:multipart/form-data;

后端export.json的管理方式

如果是Post请求:

1、前端传递的方法为:Body+application/x-www-form-urlencoded:

金沙国际网址 2

image.png

金沙国际网址 3

后端post+@RequestBody的主意来做赢得,@RequestBody注脚的字段获取的为key=value格式的数码,user对象也绑定了属性值,所以urlencoded的诀窍没有要求后端特殊管理,springMVC会进展绑定

2、假设前端改成以json字符串的样式传递参数:

金沙国际网址 4

后端选拔到json字符串,用阿里fastjson分析:

金沙国际网址 5

后端选用的值

3、接着上一步的后端代码,若是前端改成form-data 的艺术传递,则报错:

金沙国际网址 6

image.png

将后端的代码改一下:

金沙国际网址 7

加了@RequestParam、不加证明的字段、不加注明的User对象都绑定了参数值

2、2就算前端是body+x-www-form-urlencoded方式传参,后端在言之有序字符串时报错:

金沙国际网址 8

吸收接纳到的字符串为 json: id=tery007

到那边,我们比相当的小计算一下:
如果是POST+form-data的方式:
无需做别的管理,间接用对象抽取就能够(不管某个许个指标):

金沙国际网址 9

image.png

如果是POST+x-www.form-urlencoded的格局,能够加@RequestParam声明来博取(若是不传,则报错:

金沙国际网址 10

image.png

),也得以不加@RequestParam来取得,获取不到值的时候不报错。

假要是POSt+json格式传递(浏览器为Request Payload,postman为raw格式)的艺术:

金沙国际网址 11

image.png

后端须求用@RequestBody注明标志字段,@RequestBody的功力是吸取Http要求中参数,调用HttpMessageConverter接口转化为json或xml数据并绑定到指标上。同理,@ResponseBody也是调用HttpMessageConverter接口将数据转变来json或xml格式的数量,再次来到给前端。

金沙国际网址 12

默许赋值给加了@RequestBody的字段,接受到的是三个json数据

末尾的下结论:
json格式的数额用@RequestBody注脚让HttpMessageConverter调换到json数据绑定到对象上;
urlencoded也许form-data常常都用@RequestParam注脚来申明(算是个正式吧,不加也得以),当是本身包裹的实体对象时,什么都毫不加。

相应的后端的管理形式,若是是单个参数去获取,那就用@RequestParam,如果是对应Java Bean,这就没有须求其余评释

后端管理