一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié)

基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié)

2021-04-16 11:43Heinzyang Java教程

下面小編就為大家分享一篇基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

最近一段時(shí)間不想使用Session了,想感受一下Token這樣比較安全,穩(wěn)健的方式,順便寫一個(gè)統(tǒng)一的接口給瀏覽器還有APP。所以把一個(gè)練手項(xiàng)目的前臺全部改成Ajax了,跳轉(zhuǎn)再使用SpringMVC控制轉(zhuǎn)發(fā)。對于傳輸JSON數(shù)據(jù)這邊有了更深的一些理解,分享出來,請大家指正。

在SpringMVC中我們可以選擇數(shù)種接受JSON的方式,在說SpringMVC如何接受JSON之前,我們先聊聊什么是JSON。具體的定義我也不贅述了,在JavaScript中我們經(jīng)常這樣定義JSON 對象

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

這種形式的我們叫它JSON對象,同時(shí)還有一個(gè)概念叫做JSON字符串,字符串呢,顧名思義,是由' ‘或者” “包裹起來的一個(gè)整體,我們稱之為字符串。我們知道字符串是可以直接輸出的,而對象不能直接輸出。所以在JavaScript中,我們可以

?
1
2
3
4
5
6
//定義一個(gè)對象 jsonObject
var jsonObject = {
"username":"admin",
"password":123
};
alert(jsonObject);

此時(shí),會顯示[object Object]而不會輸出JSON對象的內(nèi)容,JavaScript向我們提供了兩個(gè)工具

JSON.parse() 用于將一個(gè) JSON 字符串轉(zhuǎn)換為 JavaScript 對象。 JSON.stringify() 用于將 JavaScript 值轉(zhuǎn)換為 JSON 字符串。

所以當(dāng)我們輸入

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

就會顯示 {“username”:”admin”,”password”:123};

* 好了 對于JSON的講解就到這里了 下面我們說一說SpringMVC *

既然JSON有著上述兩種存在方式,那我們通過ajax向SpringMVC傳值的時(shí)候,我們該傳哪一種呢?

我們首先嘗試直接發(fā)送JSON對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//定義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提供了什么給我們,有一個(gè)@RequestParam的注解,對于這個(gè)注解,它的作用和我們Servlet中的request.getParameter是基本相同的。我們首先使用這個(gè)注解來獲取

?
1
2
3
4
5
6
@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);
}

后臺成功輸出的我們的參數(shù),成功接受!

SpringMVC如此智能,如果我們?nèi)コ鼲RequestParam注解,直接將兩個(gè)值放入會有什么后果?

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

竟然同樣成功了,原理我這里就不多贅述了,有興趣的朋友們可以打斷點(diǎn)看看。

SpringMVC提供了一個(gè)@RequestBody,它是用來處理前臺定義發(fā)來的數(shù)據(jù)Content-Type: 不是application/x-www-form-urlencoded編碼的內(nèi)容,例如application/json, application/xml等;

細(xì)心的朋友們或許發(fā)現(xiàn)了,在之前的Ajax中,我們沒有定義Content-type的類型,Jquery默認(rèn)使用application/x-www-form-urlencoded類型。那么意思就是SpringMVC的@RequestParam注解,Servlet的request.getParameter是可以接受到以這種格式傳輸?shù)腏SON對象的。

為什么呢!?GET請求想必大家都不陌生,它將參數(shù)以url?username=”admin”&password=123這種方式發(fā)送到服務(wù)器,并且request.getParameter可以接收到這種參數(shù),我們在瀏覽器地址欄上也可以看到這一點(diǎn)。而我們Ajax使用的POST,并且發(fā)送的是JSON對象,那么后臺是如何獲取到的呢?答案就在于這個(gè)Content-Type x-www-form-urlencoded的編碼方式把JSON數(shù)據(jù)轉(zhuǎn)換成一個(gè)字串,(username=”admin”&password=123)然后把這個(gè)字串添加到url后面,用?分割,(是不是和GET方法很像),提交方式為POST時(shí)候,瀏覽器把數(shù)據(jù)封裝到HTTP BODY中,然后發(fā)送到服務(wù)器。所以并不會顯示在URL上。(這段可能有點(diǎn)繞口,希望大家用心理解一下。)

終于說完了,長吐一口氣。所以說我們使用@RequestBody注解的時(shí)候,前臺的Content-Type必須要改為application/json,如果沒有更改,前臺會報(bào)錯(cuò)415(Unsupported Media Type)。后臺日志就會報(bào)錯(cuò)Content type ‘application/x-www-form-urlencoded;charset=UTF-8' not supported,這些錯(cuò)誤Eclipse下Tomcat是不會顯示錯(cuò)誤信息的,只有使用了日志才會顯示,如何配置日志大家可以看我上一篇文章。接下來我們正確配置一下,上面說到了 Content-Type需要更改,同時(shí)我們的data也要更改了,這種注解方式只接受JSON字符串而不是JSON對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$.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其實(shí)可以理解為鍵值對嘛,所以我們用Map接收,然后對字符串或者其他數(shù)據(jù)類型進(jìn)行進(jìn)一步處理。

?
1
2
3
4
5
6
7
@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);
}

同時(shí),我又想起了神奇的SpringMVC,所以我決定去掉注解試試,好的,果斷被爆了一個(gè)空指針錯(cuò)誤…嘗試就此打住。

SpringMVC還提供了參數(shù)直接和POJO綁定的方法,我們來嘗試一下。前臺一樣,就不貼出來了。

?
1
2
3
4
5
6
7
@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,這次是可以取到值的,我個(gè)人對于登錄這類小數(shù)據(jù)量的上傳來說不太喜歡這種方法,User里面的變量很多,我只用了其中兩個(gè),沒有必要去創(chuàng)建一個(gè)User對象,一般數(shù)據(jù)量小的時(shí)候我還是比較喜歡使用單獨(dú)取值出來的。我們再想一想,如果是在上傳JSON對象的情況下,我們可不可以綁定POJO呢,答案是可以的,不要使用@RequestParam注解,否則會報(bào)Required User parameter 'user' is not present錯(cuò)誤。到此講解基本結(jié)束了,下面來總結(jié)一下。

我們首先說了JSON對象和JSON字符串

然后說了SpringMVC接受兩種兩種JSON格式的時(shí)候,前端ContentType的設(shè)定,和后端是否使用注解接受,還提到了一點(diǎn)Servlet。

當(dāng)Ajax以application/x-www-form-urlencoded格式上傳即使用JSON對象,后臺需要使用@RequestParam 或者Servlet獲取。 當(dāng)Ajax以application/json格式上傳即使用JSON字符串,后臺需要使用@RquestBody獲取。

這是我實(shí)驗(yàn)了一天的一些總結(jié),希望可以幫助到大家,如果有錯(cuò)誤,請各位海涵并指正。

以上這篇基于SpringMVC接受JSON參數(shù)詳解及常見錯(cuò)誤總結(jié)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/LostSh/article/details/68923874

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色悠久久久久综合网小说 | 四虎永久在线精品国产馆v视影院 | 国色天香社区视频在线观看免费完整版 | 色婷婷在线 | 国产欧美一区二区三区免费 | 午夜精品国产 | segou视频在线观看 | 亚洲精品国产A久久久久久 亚洲精品福利一区二区在线观看 | 精品一区二区三区高清免费观看 | 男同精品视频免费观看网站 | 国产欧美一区二区精品久久久 | 潘甜甜在线观看 | 韩国久久精品 | 日韩一级片免费观看 | 成人18视频在线观看 | 好爽好深好猛好舒服视频上 | 被巨大黑人的翻白眼 | 乳环贵妇堕落开发调教番号 | chinese特色video | 秘书小说阿蛮 | 出差被灌醉绝伦的上司日本 | 国产一卡二卡3卡4卡更新 | 91成人啪国产啪永久地址 | 国产人成精品午夜在线观看 | 美女奶口隐私免费视频网站 | 韩日理论片 | 女人被男人躁得好爽免费视频 | 色综合久久天天综合观看 | a亚洲天堂| 男人疯狂擦进女人下面 | 亚洲黄色小视频 | 国产一区二区三区四区波多野结衣 | 国产欧美日韩视频在线观看一区二区 | 日本高清中文 | 国产成人免费片在线视频观看 | 被老头肉至怀孕小说 | 国产精品一区二区三区久久 | 欧美特级午夜一区二区三区 | 亚州精品视频 | 好爽视频 | 欧美一级片在线视频 |