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

一文帶你揭秘SpringMvc參數(shù)值映射

 更新時間:2022年01月25日 15:57:31   作者:源碼超級聯(lián)盟  
這篇文章主要給大家介紹了關(guān)于SpringMvc參數(shù)值映射的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

我們平時開發(fā)的接口參數(shù)類型,有簡單類型例如Long,String,也有JSON格式的,還有自定義對象類型。想一想,如果讓我們自己開發(fā)一套參數(shù)值映射代碼,還是挺復(fù)雜,一是需要處理的參數(shù)類型比較多,還有就是會有一些復(fù)雜的場景,比如對象的多層嵌套。今天我將從處理過程的抽象,常見傳參類型兩個大的方面講解參數(shù)值映射。

一.處理過程的抽象

說到參數(shù)映射處理的抽象,就不得不提到

HandlerMethodArgumentResolver接口:

接口有兩個方法: 1.boolean supportsParameter(MethodParameter parameter); 用來判斷實現(xiàn)類是否可以處理該類型的參數(shù)

2.Object resolveArgument(...) 經(jīng)過讀取參數(shù)值,類型轉(zhuǎn)換,值映射等處理,返回參數(shù) 所有參數(shù)值處理類都需要實現(xiàn)此接口,遵從了設(shè)計模式中的模版模式。 處理過程通俗地說就是:從一堆螺絲刀里面,挨個判斷,這把螺絲刀是否可以擰這個螺絲,如果型號剛好匹配,那就拿著這個螺絲刀去擰螺絲。 SpringMvc還給這些個螺絲刀,找了個工具箱,來存放他們。這個工具箱名字叫做: HandlerMethodArgumentResolverComposite,composite是混合,合成的意思。 HandlerMethodArgumentResolverComposite將所有的參數(shù)值處理類整合在一起。

二.常見傳參類型

1.自定義對象類型

示例:

@RequestMapping("/test1")
public String methodForObjectParam (FamilyDTO familyDTO){
    System.out.println("familyDTO:"+JSON.toJSONString(familyDTO));
    return "";
}

對應(yīng)的參數(shù)值處理類為

ServletModelAttributeMethodProcessor

參數(shù)值映射的過程如下:

2.@RequestParam注解參數(shù)

示例:

@RequestMapping("/test3")
public String methodForRequestParam (@RequestParam Integer param){
    System.out.println("RequestParam:"+JSON.toJSONString(param));
    return "";
}

對應(yīng)的參數(shù)值處理類為RequestParamMethodArgumentResolver

參數(shù)映射的步驟如下:

1.1從request中獲取參數(shù)名對應(yīng)的值

1.2參數(shù)值類型轉(zhuǎn)換,從request中獲取的參數(shù)值為String,需要轉(zhuǎn)化為對應(yīng)Integer等類型。 spring-core提供了超級多的類型轉(zhuǎn)換工具,我截取了部分類:

Spring的強大不僅僅在它的設(shè)計思想,對各種復(fù)雜情況的支持,還有強大的代碼底層。

3.@RequestBody注解參數(shù)

示例:

@RequestMapping("/test6")
public String methodForRequestBody (@RequestBody FamilyDTO familyDTO){
    System.out.println("methodForNormalParam:"+JSON.toJSONString(familyDTO));
    return "";
}

對應(yīng)的參數(shù)值處理類為:RequestResponseBodyMethodProcessor

參數(shù)映射的步驟如下:

1.1將body反序列化為對象

1.2如果類型為Optional,創(chuàng)建Optional類型對象

4.簡單類型,無@RequestParam注解

示例:

@RequestMapping("/test5")
public String methodForNormalParam (Integer param){
    System.out.println("methodForNormalParam:"+JSON.toJSONString(param));
    return "";
}

對于參數(shù)param,和帶有@RequestParam注解的參數(shù)一樣,使用 RequestParamMethodArgumentResolver類進行參數(shù)值映射。

SpringMvc接口調(diào)用的核心方法invokeForRequest在InvocableHandlerMethod類中,大家有興趣,可以自己閱讀下源碼:

public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
      Object... providedArgs) throws Exception {
   //從request中讀取,轉(zhuǎn)化參數(shù)值
   Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
   if (logger.isTraceEnabled()) {
      logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
            "' with arguments " + Arrays.toString(args));
   }
   //方法的調(diào)用
   Object returnValue = doInvoke(args);
   if (logger.isTraceEnabled()) {
      logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
            "] returned [" + returnValue + "]");
   }
   return returnValue;
}

總結(jié)

到此這篇關(guān)于SpringMvc參數(shù)值映射的文章就介紹到這了,更多相關(guān)SpringMvc參數(shù)值映射內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • sql查詢返回值使用map封裝多個key和value實例

    sql查詢返回值使用map封裝多個key和value實例

    這篇文章主要介紹了sql查詢返回值使用map封裝多個key和value實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • java socket大數(shù)據(jù)傳輸丟失問題及解決

    java socket大數(shù)據(jù)傳輸丟失問題及解決

    這篇文章主要介紹了java socket大數(shù)據(jù)傳輸丟失問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查

    使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查

    這篇文章主要為大家詳細介紹了使用c3p0連接數(shù)據(jù)庫實現(xiàn)增刪改查,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 解決JDK8的ParallelStream遍歷無序的問題

    解決JDK8的ParallelStream遍歷無序的問題

    這篇文章主要介紹了解決JDK8的ParallelStream遍歷無序的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java-性能分析和監(jiān)控工具深入詳解

    Java-性能分析和監(jiān)控工具深入詳解

    這篇文章主要介紹了Java-性能分析和監(jiān)控工具深入詳解,文章內(nèi)容詳細,簡單易懂,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2023-01-01
  • Redis中的事務(wù)和Redis樂觀鎖詳解

    Redis中的事務(wù)和Redis樂觀鎖詳解

    這篇文章主要介紹了Redis中的事務(wù)和Redis樂觀鎖詳解,Redis事務(wù)是一個單獨的隔離操作:事務(wù)中的所有命令都會序列化、按順序地執(zhí)行,事務(wù)在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷,需要的朋友可以參考下
    2023-12-12
  • Java判斷對象是否為空的四種方法小結(jié)

    Java判斷對象是否為空的四種方法小結(jié)

    這篇文章主要介紹了Java判斷對象是否為空的四種方法,判斷對象是否為空有多種方法,包括使用==或!=運算符直接比較對象與null,使用Objects.isNull()方法,以及用instanceof運算符或Optional類進行更安全的空值處理,需要的朋友可以參考下
    2024-10-10
  • Spring Cloud Consul的服務(wù)注冊與發(fā)現(xiàn)

    Spring Cloud Consul的服務(wù)注冊與發(fā)現(xiàn)

    這篇文章主要介紹了Spring Cloud Consul服務(wù)注冊與發(fā)現(xiàn)的實現(xiàn)方法,幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下
    2021-02-02
  • Spring純Java配置集成kafka代碼實例

    Spring純Java配置集成kafka代碼實例

    這篇文章主要介紹了Spring純Java配置集成kafka代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • Java并發(fā)編程示例(三):線程中斷

    Java并發(fā)編程示例(三):線程中斷

    這篇文章主要介紹了Java并發(fā)編程示例(三):線程中斷,在本節(jié),我們所開發(fā)的示例程序?qū)?chuàng)建一個線程,五秒鐘后,利用中斷機制強制中止這個線程,需要的朋友可以參考下
    2014-12-12

最新評論

阜新市| 两当县| 万荣县| 苍山县| 固原市| 鸡东县| 许昌市| 南昌市| 亚东县| 周宁县| 上高县| 南宁市| 旬邑县| 广宗县| 澎湖县| 庆阳市| 天水市| 青海省| 同仁县| 新兴县| 黑河市| 巴林右旗| 阿拉善左旗| 韩城市| 辉县市| 石家庄市| 乃东县| 开化县| 延庆县| 长垣县| 景谷| 那坡县| 栾川县| 赤峰市| 荆门市| 曲阳县| 樟树市| 临猗县| 漯河市| 甘孜县| 祁门县|