欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年03月27日 10:15:43   作者:Heinzyang  
下面小編就為大家分享一篇基于SpringMVC接受JSON參數(shù)詳解及常見錯誤總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

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

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

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

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

//定義一個對象 jsonObject
var jsonObject = {
"username":"admin",
"password":123
};
alert(jsonObject);

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

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

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

alert(JSON.stringify(jsonObject));

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

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

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

我們首先嘗試直接發(fā)送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);
 }

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

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

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

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

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

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

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

終于說完了,長吐一口氣。所以說我們使用@RequestBody注解的時候,前臺的Content-Type必須要改為application/json,如果沒有更改,前臺會報錯415(Unsupported Media Type)。后臺日志就會報錯Content type ‘a(chǎn)pplication/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接收,然后對字符串或者其他數(shù)據(jù)類型進行進一步處理。

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

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

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

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

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

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

相關(guān)文章

  • java實現(xiàn)app簽到功能

    java實現(xiàn)app簽到功能

    這篇文章主要為大家詳細介紹了java實現(xiàn)app簽到功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • 基于Spring?Boot的線程池監(jiān)控問題及解決方案

    基于Spring?Boot的線程池監(jiān)控問題及解決方案

    這篇文章主要介紹了基于Spring?Boot的線程池監(jiān)控方案,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • zuul轉(zhuǎn)發(fā)后服務(wù)取不到請求路徑的解決

    zuul轉(zhuǎn)發(fā)后服務(wù)取不到請求路徑的解決

    這篇文章主要介紹了zuul轉(zhuǎn)發(fā)后服務(wù)取不到請求路徑的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring中實現(xiàn)策略模式的幾種方式小結(jié)

    Spring中實現(xiàn)策略模式的幾種方式小結(jié)

    在寫業(yè)務(wù)代碼的時候,難免會遇到很多if-else,這個時候如果if-else不是很多可以用if-else,如果此時場景過多,太多的if-else會導(dǎo)致代碼比較臃腫,這個時候策略模式就出現(xiàn)了,本文主要闡述工作中常用的實現(xiàn)策略模式的幾種方式,需要的朋友可以參考下
    2024-05-05
  • Java中的gateway自定義過濾器詳解

    Java中的gateway自定義過濾器詳解

    這篇文章主要介紹了Java中的gateway自定義過濾器詳解,過濾器是指gateway在路由過程中(A地址路由到B地址)生效進行過濾操作的,所有首先你得先配一個地址路由,本文提供了部分實現(xiàn)代碼,需要的朋友可以參考下
    2023-11-11
  • Java Char的簡單工具類CharUtil分享

    Java Char的簡單工具類CharUtil分享

    下面小編就為大家分享一篇Java Char的簡單工具類CharUtil,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • Filter在springboot中的使用方法詳解

    Filter在springboot中的使用方法詳解

    這篇文章主要介紹了Filter在springboot中的使用方法詳解,filter(過濾器)作用于在intreceptor(攔截器)之前,不像intreceptor一樣依賴于springmvc框架,只需要依賴于serverlet,需要的朋友可以參考下
    2023-08-08
  • Springmvc自定義異常處理器實現(xiàn)流程解析

    Springmvc自定義異常處理器實現(xiàn)流程解析

    這篇文章主要介紹了Springmvc自定義異常處理器實現(xiàn)流程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • Java源碼解析之HashMap的put、resize方法詳解

    Java源碼解析之HashMap的put、resize方法詳解

    這篇文章主要介紹了Java源碼解析之HashMap的put、resize方法詳解,文中有非常詳細的代碼示例,對正在學(xué)習(xí)java的小伙伴們有很大的幫助,需要的朋友可以參考下
    2021-04-04
  • java高級排序之希爾排序

    java高級排序之希爾排序

    這篇文章主要介紹了java高級排序之希爾排序 ,需要的朋友可以參考下
    2015-04-04

最新評論