最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

alert(JSON.stringify(jsonObject));

就會(huì)顯示 {“username”:”admin”,”password”:123};

* 好了 對(duì)于JSON的講解就到這里了 下面我們說(shuō)一說(shuō)SpringMVC *

既然JSON有著上述兩種存在方式,那我們通過(guò)ajax向SpringMVC傳值的時(shí)候,我們?cè)搨髂囊环N呢?

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

//定義json對(duì)象
   var username = $("#username").val();
   var password = $("#password").val();
   var json = {
    "username" : username,
    "password" : password
   };
// Jquery Ajax請(qǐng)求
$.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的注解,對(duì)于這個(gè)注解,它的作用和我們Servlet中的request.getParameter是基本相同的。我們首先使用這個(gè)注解來(lái)獲取

 @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);
 }

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

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

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

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

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

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

為什么呢???GET請(qǐng)求想必大家都不陌生,它將參數(shù)以u(píng)rl?username=”admin”&password=123這種方式發(fā)送到服務(wù)器,并且request.getParameter可以接收到這種參數(shù),我們?cè)跒g覽器地址欄上也可以看到這一點(diǎn)。而我們Ajax使用的POST,并且發(fā)送的是JSON對(duì)象,那么后臺(tái)是如何獲取到的呢?答案就在于這個(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ù)器。所以并不會(huì)顯示在URL上。(這段可能有點(diǎn)繞口,希望大家用心理解一下。)

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

$.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);
      }
     }
    }
   });

后臺(tái)也更改一下,json其實(shí)可以理解為鍵值對(duì)嘛,所以我們用Map接收,然后對(duì)字符串或者其他數(shù)據(jù)類型進(jìn)行進(jìn)一步處理。

 @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綁定的方法,我們來(lái)嘗試一下。前臺(tái)一樣,就不貼出來(lái)了。

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

我們首先說(shuō)了JSON對(duì)象和JSON字符串

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

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

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

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

相關(guān)文章

  • 快速使用IDEA圖形化界面連接Phoenix的方法

    快速使用IDEA圖形化界面連接Phoenix的方法

    最近很多朋友跟小編留言如何使用IDEA圖形化界面連接Phoenix,在這小編就不一一回復(fù)大家了,今天抽空給大家整理一篇教程關(guān)于idea 圖形化界面連接Phoenix的相關(guān)知識(shí),需要的朋友快來(lái)學(xué)習(xí)下吧
    2021-05-05
  • springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案

    springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案

    這篇文章主要介紹了springmvc json類型轉(zhuǎn)換錯(cuò)誤解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案

    如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案

    這篇文章主要介紹了如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 使用Java對(duì)URL進(jìn)行編碼和解碼

    使用Java對(duì)URL進(jìn)行編碼和解碼

    在互聯(lián)網(wǎng)應(yīng)用中,URL(Uniform?Resource?Locator,統(tǒng)一資源定位符)是定位和訪問(wèn)網(wǎng)絡(luò)資源的重要標(biāo)識(shí),然而,URL?中可能包含一些特殊字符,為了保證?URL?的有效性和兼容性,必須對(duì)?URL?進(jìn)行編碼處理,所以本文給大家介紹了如何使用Java對(duì)URL進(jìn)行編碼和解碼
    2025-03-03
  • idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決

    idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決

    這篇文章主要介紹了idea無(wú)法打斷點(diǎn),單擊或雙擊代碼行左側(cè)區(qū)域無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 聊聊Spring Cloud Cli 初體驗(yàn)

    聊聊Spring Cloud Cli 初體驗(yàn)

    這篇文章主要介紹了聊聊Spring Cloud Cli 初體驗(yàn),SpringBoot CLI 是spring Boot項(xiàng)目的腳手架工具。非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-04-04
  • java String類功能、原理與應(yīng)用案例【統(tǒng)計(jì)、判斷、轉(zhuǎn)換等】

    java String類功能、原理與應(yīng)用案例【統(tǒng)計(jì)、判斷、轉(zhuǎn)換等】

    這篇文章主要介紹了java String類功能、原理與應(yīng)用案例,結(jié)合實(shí)例形式詳細(xì)分析了java String類的基本功能、構(gòu)造方法,以及使用String類實(shí)現(xiàn)統(tǒng)計(jì)、判斷、轉(zhuǎn)換等功能相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)與算法之插值查找解析

    Java數(shù)據(jù)結(jié)構(gòu)與算法之插值查找解析

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之插值查找解析,插值查找算法類似于二分查找,不同的就是插值查找每次從自適應(yīng)mid處開(kāi)始查找,需要的朋友可以參考下
    2023-12-12
  • SSM?Mapper文件查詢出返回?cái)?shù)據(jù)查不到個(gè)別字段的問(wèn)題

    SSM?Mapper文件查詢出返回?cái)?shù)據(jù)查不到個(gè)別字段的問(wèn)題

    這篇文章主要介紹了SSM?Mapper文件查詢出返回?cái)?shù)據(jù)查不到個(gè)別字段的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java中注解的實(shí)現(xiàn)原理詳解

    java中注解的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了java中注解的實(shí)現(xiàn)原理詳解,注解也叫元數(shù)據(jù),例如我們常見(jiàn)的@Override和@Deprecated,注解是JDK1.5版本開(kāi)始引入的一個(gè)特性,用于對(duì)代碼進(jìn)行說(shuō)明,可以對(duì)包、類、接口、字段、方法參數(shù)、局部變量等進(jìn)行注解,需要的朋友可以參考下
    2023-10-10

最新評(píng)論

玉屏| 东宁县| 虎林市| 永新县| 大安市| 兰坪| 青州市| 岢岚县| 长乐市| 延庆县| 闽清县| 韶山市| 武乡县| 静安区| 资兴市| 泸西县| 唐海县| 玉环县| 化州市| 南召县| 六安市| 庆云县| 福建省| 同心县| 水富县| 大理市| 西昌市| 临沧市| 潍坊市| 石林| 仁寿县| 瑞金市| 华安县| 冀州市| 洛隆县| 南部县| 高邮市| 秀山| 罗山县| 冀州市| 遂平县|