第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定

揭秘SpringMvc參數(shù)值映射

標(biāo)簽:
Java Spring



https://img1.sycdn.imooc.com/61ed0ccf0001a26709000383.jpg


我们平时开发的接口参数类型,有简单类型例如Long,String,也有JSON格式的,还有自定义对象类型。想一想,如果让我们自己开发一套参数值映射代码,还是挺复杂,一是需要处理的参数类型比较多,还有就是会有一些复杂的场景,比如对象的多层嵌套。今天我将从处理过程的抽象,常见传参类型两个大的方面讲解参数值映射。

一.处理过程的抽象

说到参数映射处理的抽象,就不得不提到
HandlerMethodArgumentResolver接口:

接口有两个方法:

1.boolean supportsParameter(MethodParameter parameter);

用来判断实现类是否可以处理该类型的参数

2.Object resolveArgument(...)

经过读取参数值,类型转换,值映射等处理,返回参数

所有参数值处理类都需要实现此接口,遵从了设计模式中的模版模式。

处理过程通俗地说就是:从一堆螺丝刀里面,挨个判断,这把螺丝刀是否可以拧这个螺丝,如果型号刚好匹配,那就拿着这个螺丝刀去拧螺丝。

SpringMvc还给这些个螺丝刀,找了个工具箱,来存放他们。这个工具箱名字叫做:

HandlerMethodArgumentResolverComposite,composite是混合,合成的意思。

HandlerMethodArgumentResolverComposite将所有的参数值处理类整合在一起。


二.常见传参类型

1.自定义对象类型

示例:

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

对应的参数值处理类为ServletModelAttributeMethodProcessor

参数值映射的过程如下:


https://img4.sycdn.imooc.com/61ed0ccf0001c9cb03440750.jpg


2.@RequestParam注解参数

示例:

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

对应的参数值处理类为RequestParamMethodArgumentResolver

参数映射的步骤如下:

1.1从request中获取参数名对应的值

1.2参数值类型转换,从request中获取的参数值为String,需要转化为对应Integer等类型。

spring-core提供了超级多的类型转换工具,我截取了部分类:


https://img3.sycdn.imooc.com/61ed0ccf0001871510941254.jpg

类型转化工具

Spring的强大不仅仅在它的设计思想,对各种复杂情况的支持,还有强大的代码底层。

3.@RequestBody注解参数

示例:

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

对应的参数值处理类为:RequestResponseBodyMethodProcessor

参数映射的步骤如下:

1.1将body反序列化为对象

1.2如果类型为Optional,创建Optional类型对象

4.简单类型,无@RequestParam注解

示例:

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

对于参数param,和带有@RequestParam注解的参数一样,使用

RequestParamMethodArgumentResolver类进行参数值映射。


SpringMvc接口调用的核心方法invokeForRequest在InvocableHandlerMethod类中,大家有兴趣,可以自己阅读下源码:

public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,      Object... providedArgs) throws Exception {   //从request中读取,转化参数值
   Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);   if (logger.isTraceEnabled()) {
      logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +            "' with arguments " + Arrays.toString(args));
   }   //方法的调用
   Object returnValue = doInvoke(args);   if (logger.isTraceEnabled()) {
      logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +            "] returned [" + returnValue + "]");
   }   return returnValue;
}


https://img1.sycdn.imooc.com/61ed0cd00001e12711980675.jpg




點(diǎn)擊查看更多內(nèi)容
1人點(diǎn)贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消