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

spring MVC中接口參數(shù)解析的過程詳解

 更新時間:2018年07月06日 09:24:16   作者:007tangtao  
這篇文章主要給大家介紹了關(guān)于spring MVC中接口參數(shù)解析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用spring mvc具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

前天工作中遇到了這樣一個問題,我在接口的參數(shù)封裝了一個pojo,這是很常見的,當(dāng)參數(shù)一多,慣性的思維就是封裝一個pojo.那么在參數(shù)前有很多注解可以添加,比如:@requestParam,@requestBody,@pathvariable等。我的理解是這樣的,首先我先申明,我并是沒有看過源碼,只是憑經(jīng)驗理解。@requestParam試用于get請求,參數(shù)在http的header中的URL上,具體放在?后面以key=value的形式存在。@requestBody適用于post請求中參數(shù)在http的body中。@pathvariable比較特別是restful的寫法,把參數(shù)放在URL上,不用問號區(qū)分是參數(shù)還是URL。也許我這樣說不是很準(zhǔn)確。但我通常也是這么用的。與此同時,還有一種常見的寫法,就是參數(shù)前不加注解,比如參數(shù)是基本類型的不加@requestParam,參數(shù)是bean的不加requestBody,也能被springmvc解析得到。我的接口被小組長看到之后他叫我去掉這個@requestBody,因為后端加上這個之后,前端的ajax請求需要顯示的聲明content-type:"application/json",才能被springmvc解析得到,這樣似乎多做了一件不必要的事情。雖然我按照他的要求去掉了,但是我覺得我得弄清楚這到底是怎么回事,加與不加到底有什么區(qū)別,對性能有什么影響,或者各自的最佳適用場景,除了百度,還得問問大神。

spring MVC接口參數(shù)解析的過程

首先我自己慢慢的通過debug研究了一下源碼。在不添加任何注解的情況下:

在開發(fā)的過程中consumes和produces一般都沒有加,按道理應(yīng)該要加上,因為可以減少對接口的查找范圍。這是一個簡單的demo,我只是需要他來檢查springmvc接收請求的流程。

首先在tomcat啟動之后,所有controller類中的請求路徑也就是@requestMapping隨著Controller這個bean加載到了spring的容器中。頁面請求過來之后找到DispatcherServlet這個servlet,請求走到servlet之后大家都知道servlet有兩種初始化方式,一種是隨著立即加載,一種是延遲加載,但是無論怎樣,都是只調(diào)用一次init方法,然后再以后每次都會直接調(diào)用service方法,當(dāng)tomcat關(guān)閉之后servlet的destroy方法被調(diào)用生命周期就結(jié)束了。所以springmvc是對servlet的封裝就必定要繼承service方法,DispatcherServlet也就是doDispatch這個方法。這個方法中通過HttpServletRequest對象獲得請求路徑也就是/notJson,然后與容器中的所有url對比,最終取得Controller中的接口所在。找到了接口自然就知道了接口的參數(shù),我這里就是Display,為了方便簡單,Display中只有兩個參數(shù),就是下面ajax請求中的兩個。

springmvc會通過反射的方式獲取到pojo中的屬性。在這個過程中首先springmvc會先聲明一個數(shù)組,這個數(shù)組的大小是參數(shù)的個數(shù),我這里只有一個,其實我相信很多人會和我遇到相同的問題就是,當(dāng)參數(shù)中同時存在bean和基本類型的參數(shù),springmvc將怎么解析,這個我遇到過幾次,在沒有看源碼的情況下,把基本類型也封裝到bean中去了,讓前端把屬性也寫在一個對象中。當(dāng)然我相信這個不是每個人都能接受的做法,我們都希望搞清楚他究竟是怎樣解析的,到時候我們就可以任意擺弄了。下面是反射過程,將我的pojo反射之后獲得里面的屬性和方法。解析了參數(shù)之后,為參數(shù)賦值。這里也許是最重要的地方了。究竟是怎么賦值的。

從這個方法debug了解到,name為display,也就是pojo類名的小寫,這里不知道為什么springmvc做了這個處理(以后再看)。attribute為帶有age和name的對象。不過此時都是null。WebDataBinding用于從Web請求參數(shù)到JavaBean對象的數(shù)據(jù)綁定的特殊DataBinder。接上圖bindRequestParameters這個方法,跟進(jìn)去會發(fā)現(xiàn)一個很熟悉的地方就是下圖,通過String[] values = request.getParameterValues(paramName);獲得參數(shù)名,這個是servlet的獲取參數(shù)方法,那么就可以知道請求的參數(shù)的屬性名和屬性值。

接下來可想而知就是把這個參數(shù)名name換成bean的屬性name,參數(shù)名age換成屬性名age。再跟到這個地方,這個oragina就是上面serclet拿到的屬性名值對,把這個map在這轉(zhuǎn)化成PropertyValue。(PropertyValue是用于保存單個bean屬性的信息和值的對象。 在此處使用對象,而不是僅將所有屬性存儲在由屬性名稱鍵入的映射中,允許更靈活,并且能夠以優(yōu)化的方式處理索引屬性等。請注意,該值不需要是最終所需的類型:BeanWrapper實現(xiàn)應(yīng)該處理任何必要的轉(zhuǎn)換,因為此對象不知道它將應(yīng)用于哪些對象。),如此一來就有兩個PropertyValue對象了。

轉(zhuǎn)化的時候會忽略不知道的屬性

上圖是具體轉(zhuǎn)化的方法,方法比較長。下面一句直接給bean賦值。從這個過程來看。只要前端的json對象的屬性和后端的bean屬性一樣,ajax不寫content-type,用默認(rèn)的application/x-www-form-urlencoded; charset=UTF-8,就能直接賦值。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • Java設(shè)計模式之單例模式

    Java設(shè)計模式之單例模式

    這篇文章主要給大家介紹了關(guān)于Java單例模式,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • java測試框架的方法

    java測試框架的方法

    這篇文章主要介紹了java測試框架的方法,文中代碼非常詳細(xì),供大家學(xué)習(xí)和參考,感興趣的朋友可以了解下
    2020-06-06
  • Java統(tǒng)計代碼的執(zhí)行時間的N種方法

    Java統(tǒng)計代碼的執(zhí)行時間的N種方法

    在日常開發(fā)中經(jīng)常需要測試一些代碼的執(zhí)行時間,但又不想使用向 JMH(Java?Microbenchmark Harness,Java 微基準(zhǔn)測試套件)這么重的測試框架,所以本文就匯總了一些 Java 中比較常用的執(zhí)行時間統(tǒng)計方法,總共包含以下 6 種,需要的朋友可以參考下
    2022-08-08
  • Spring中的@ComponentScan注解使用詳解

    Spring中的@ComponentScan注解使用詳解

    這篇文章主要介紹了Spring中的@ComponentScan注解使用詳解,@ComponentScan 注解的作用就是根據(jù)指定的掃描路徑,把路徑中符合掃描規(guī)則的類裝配到 Spring 容器中,需要的朋友可以參考下
    2024-01-01
  • Java多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)

    Java多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)

    下面小編就為大家?guī)硪黄狫ava多態(tài)和實現(xiàn)接口的類的對象賦值給接口引用的方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 詳解Java的引用類型及使用場景

    詳解Java的引用類型及使用場景

    這篇文章主要介紹了詳解Java的引用類型及使用場景,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Springboot啟動原理詳細(xì)講解

    Springboot啟動原理詳細(xì)講解

    這篇文章主要介紹了SpringBoot啟動原理的分析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • mybatis中的多重if?條件判斷

    mybatis中的多重if?條件判斷

    這篇文章主要介紹了mybatis中的多重if?條件判斷,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 基于springboot的RestTemplate、okhttp和HttpClient對比分析

    基于springboot的RestTemplate、okhttp和HttpClient對比分析

    這篇文章主要介紹了基于springboot的RestTemplate、okhttp和HttpClient對比分析,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Spring實現(xiàn)資源的動態(tài)加載和卸載的方法小結(jié)

    Spring實現(xiàn)資源的動態(tài)加載和卸載的方法小結(jié)

    這篇文章主要介紹了Spring實現(xiàn)資源的動態(tài)加載和卸載的方法小結(jié),文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06

最新評論

科尔| 中牟县| 长丰县| 疏附县| 巴林右旗| 平武县| 南华县| 芒康县| 乾安县| 枞阳县| 周宁县| 伊通| 黔东| 台南市| 西吉县| 临沧市| 和平县| 商水县| 报价| 富平县| 云和县| 台东县| 黄石市| 台北市| 旌德县| 民乐县| 夹江县| 枣强县| 新乡县| 武宣县| 全南县| 灵山县| 五家渠市| 咸丰县| 尼木县| 汽车| 阜宁县| 政和县| 武隆县| 渭源县| 丹凤县|