日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2023/12/9 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC接受JSON参数详解及常见错误总结我改 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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數據的方法:

既然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中,然后發送到服務器。所以并不會顯示在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對象

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數據到后臺的方法,關鍵總結就兩點

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類型的參數,不能再有其他類型的參數。

  • 我們首先說了JSON對象和JSON字符串
  • 然后說了SpringMVC接受兩種兩種JSON格式的時候,前端ContentType的設定,和后端是否使用注解接受,還提到了一點Servlet。?

?

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

這是我實驗了一天的一些總結,希望可以幫助到大家,如果有錯誤,請各位海涵并指正。

轉載于:https://www.cnblogs.com/libin6505/p/6812791.html

總結

以上是生活随笔為你收集整理的SpringMVC接受JSON参数详解及常见错误总结我改的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。