日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

瀏覽:41日期:2023-02-22 09:00:27
目錄一:普通參數(shù)與基本注解二:復(fù)雜參數(shù)一:普通參數(shù)與基本注解

HandlerMapping中找到能處理請(qǐng)求的Handler(Controller,method())為當(dāng)前Handler找一個(gè)適配器HandlerAdapter:RequestMappingHandlerAdapter

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

1.HandlerAdapter

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

0-支持方法上標(biāo)注@RequestMapping1-支持函數(shù)式編程的xxxx

2.執(zhí)行目標(biāo)方法

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

3.參數(shù)解析器:確定要執(zhí)行的目標(biāo)方法每一個(gè)參數(shù)的值是什么

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

boolean supportsParameter(MethodParameter parameter);Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,先判斷是否支持該參數(shù)類型, 如果支持, 就調(diào)用resolveArgument解析方法

4.返回值處理器

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

5.挨個(gè)判斷所有參數(shù)解析器哪個(gè)支持這個(gè)參數(shù):HandlerMethodArgumentResolver: 把控著支持的方法參數(shù)類型

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

請(qǐng)求進(jìn)來(lái)后, 首先從handlerMapping中查找是否有對(duì)應(yīng)的映射處理, 得到映射適配器Adapter,再通過(guò)適配器,查找有哪些方法匹配請(qǐng)求,首先判斷方法名,以及參數(shù)類型是否匹配,首先獲得方法中聲明的參數(shù)名字, 放到數(shù)組里,循環(huán)遍歷27種解析器判斷是否有支持處理對(duì)應(yīng)參數(shù)名字類型的解析器,如果有的話,根據(jù)名字進(jìn)行解析參數(shù),根據(jù)名字獲得域數(shù)據(jù)中的參數(shù), 循環(huán)每個(gè)參數(shù)名字進(jìn)行判斷, 從而為每個(gè)參數(shù)進(jìn)行賦值.

對(duì)于自定義的POJO類參數(shù):ServletRequestMethodArgumentResolver 這個(gè)解析器用來(lái)解析: 是通過(guò)主要是通過(guò)判斷是否是簡(jiǎn)單類型得到的

@Overridepublic boolean supportsParameter(MethodParameter parameter) {return (parameter.hasParameterAnnotation(ModelAttribute.class) ||(this.annotationNotRequired && !BeanUtils.isSimpleProperty(parameter.getParameterType())));}public static boolean isSimpleValueType(Class<?> type) {return (Void.class != type && void.class != type &&(ClassUtils.isPrimitiveOrWrapper(type) ||Enum.class.isAssignableFrom(type) ||CharSequence.class.isAssignableFrom(type) ||Number.class.isAssignableFrom(type) ||Date.class.isAssignableFrom(type) ||Temporal.class.isAssignableFrom(type) ||URI.class == type ||URL.class == type ||Locale.class == type ||Class.class == type));}public final Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception {Assert.state(mavContainer != null, 'ModelAttributeMethodProcessor requires ModelAndViewContainer');Assert.state(binderFactory != null, 'ModelAttributeMethodProcessor requires WebDataBinderFactory');String name = ModelFactory.getNameForParameter(parameter);ModelAttribute ann = parameter.getParameterAnnotation(ModelAttribute.class);if (ann != null) {mavContainer.setBinding(name, ann.binding());}Object attribute = null;BindingResult bindingResult = null;if (mavContainer.containsAttribute(name)) {attribute = mavContainer.getModel().get(name);}else {// Create attribute instancetry {attribute = createAttribute(name, parameter, binderFactory, webRequest);}catch (BindException ex) {if (isBindExceptionRequired(parameter)) {// No BindingResult parameter -> fail with BindExceptionthrow ex;}// Otherwise, expose null/empty value and associated BindingResultif (parameter.getParameterType() == Optional.class) {attribute = Optional.empty();}else {attribute = ex.getTarget();}bindingResult = ex.getBindingResult();}}if (bindingResult == null) {// Bean property binding and validation;// skipped in case of binding failure on construction.WebDataBinder binder = binderFactory.createBinder(webRequest, attribute, name);if (binder.getTarget() != null) {if (!mavContainer.isBindingDisabled(name)) {bindRequestParameters(binder, webRequest);}validateIfApplicable(binder, parameter);if (binder.getBindingResult().hasErrors() && isBindExceptionRequired(binder, parameter)) {throw new BindException(binder.getBindingResult());}}// Value type adaptation, also covering java.util.Optionalif (!parameter.getParameterType().isInstance(attribute)) {attribute = binder.convertIfNecessary(binder.getTarget(), parameter.getParameterType(), parameter);}bindingResult = binder.getBindingResult();}// Add resolved attribute and BindingResult at the end of the modelMap<String, Object> bindingResultModel = bindingResult.getModel();mavContainer.removeAttributes(bindingResultModel);mavContainer.addAllAttributes(bindingResultModel);return attribute;}

WebDataBinder binder =binderFactory.createBinder(webRequest,attribute,name)WebDataBinder:web數(shù)據(jù)綁定器,將請(qǐng)求參數(shù)的值綁定到指定的javaBean里面WebDataBinder 利用它里面的Converters將請(qǐng)求數(shù)據(jù)轉(zhuǎn)成指定的數(shù)據(jù)類型,通過(guò)反射一系列操作,再次封裝到j(luò)avabean中

GenericConversionService:在設(shè)置每一個(gè)值的時(shí)候,找它里面所有的converter哪個(gè)可以將這個(gè)數(shù)據(jù)類型(request帶來(lái)參數(shù)的字符串)轉(zhuǎn)換到指定的類型(javabean—某一個(gè)類型)

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

未來(lái)我們可以給WebDataBinder里面放自己的Converter

private static final class StringToNumber implements Converter<String, T> {converter總接口:@FunctionalInterfacepublic interface Converter<S, T> {

//自定義轉(zhuǎn)換器:實(shí)現(xiàn)按照自己的規(guī)則給相應(yīng)對(duì)象賦值

@Override public void addFormatters(FormatterRegistry registry) { registry.addConverter(new Converter<String, Pet>() {@Overridepublic Pet convert(String source) { if (!StringUtils.isEmpty(source)){Pet pet = new Pet();String[] split = source.split(',');pet.setName(split[0]);pet.setAge(split[1]);return pet; } return null;} }); }二:復(fù)雜參數(shù)

Map/Model(map/model里面的數(shù)據(jù)會(huì)被放在request的請(qǐng)求域 相當(dāng)于request.setAttribute)/Errors/BindingResult/RedirectAttributes(重定向攜帶數(shù)據(jù))/ServletRespons().SessionStaus.UriComponentsBuilder

6.在上面第五步目標(biāo)方法執(zhí)行完成后:將所有的數(shù)據(jù)都放在ModelAdnViewContainer;包含要去的頁(yè)面地址View,還包含Model數(shù)據(jù)

SpringBoot與SpringMVC中參數(shù)傳遞的原理解析

7.處理派發(fā)結(jié)果

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

在頁(yè)面進(jìn)行響應(yīng)前, 進(jìn)行視圖渲染的時(shí)候:exposeModelAsRequestAttributes(model, request); 該方法將model中所有參數(shù)都放在請(qǐng)求域數(shù)據(jù)中

protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {// Expose the model object as request attributes.exposeModelAsRequestAttributes(model, request);// Expose helpers as request attributes, if any.exposeHelpers(request);// Determine the path for the request dispatcher.String dispatcherPath = prepareForRendering(request, response);// Obtain a RequestDispatcher for the target resource (typically a JSP).RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);if (rd == null) {throw new ServletException('Could not get RequestDispatcher for [' + getUrl() +']: Check that the corresponding file exists within your web application archive!');}// If already included or response already committed, perform include, else forward.if (useInclude(request, response)) {response.setContentType(getContentType());if (logger.isDebugEnabled()) {logger.debug('Including [' + getUrl() + ']');}rd.include(request, response);}else {// Note: The forwarded resource is supposed to determine the content type itself.if (logger.isDebugEnabled()) {logger.debug('Forwarding to [' + getUrl() + ']');}rd.forward(request, response);}}

通過(guò)循環(huán)遍歷model中的所有數(shù)據(jù)放在請(qǐng)求域中

protected void exposeModelAsRequestAttributes(Map<String, Object> model,HttpServletRequest request) throws Exception {model.forEach((name, value) -> {if (value != null) {request.setAttribute(name, value);}else {request.removeAttribute(name);}});}

不管我們?cè)诜椒ㄐ螀⑽恢梅?Map集合或者M(jìn)olde 最終在底層源碼都是同一個(gè)對(duì)象在mvcContainer容器中進(jìn)行保存

到此這篇關(guān)于SpringBoot與SpringMVC中參數(shù)傳遞的原理的文章就介紹到這了,更多相關(guān)SpringBoot SpringMVC參數(shù)傳遞內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲无线一线二线三线区别av| 日韩精品一区二区三区免费视频 | 日韩一区二区三区免费视频| 国产一区二区三区自拍| 你懂的亚洲视频| 国产精品久久亚洲不卡| 国产日韩欧美中文在线| 欧美日韩1区| 精品国产欧美| 久久激情一区| 天堂va蜜桃一区二区三区| 日韩三级久久| 成人污污视频| 欧美日韩激情在线一区二区三区| 欧美精品黄色| 日韩av不卡在线观看| 精品视频国内| 午夜视频精品| 国产精品chinese| 亚洲精品国产嫩草在线观看 | 91精品1区| 日韩精品亚洲专区在线观看| 国产精品66| 国产精品99一区二区| 日本在线成人| 日韩亚洲一区在线| 亚洲精品自拍| 久久久亚洲欧洲日产| 亚洲va在线| 免费视频久久| 欧美伊人久久| 久久国产亚洲| 国产欧美亚洲一区| 红桃视频国产精品| 麻豆国产精品| 日本伊人久久| 国产亚洲网站| 日韩国产一区二区| 日韩av午夜在线观看| 精品欧美激情在线观看| 精品国产乱码| 91精品国产自产在线丝袜啪| 午夜久久99| 亚洲一级少妇| 九九久久国产| 亚洲欧美日韩专区| 精品国产欧美日韩| 国产日韩亚洲| 美国三级日本三级久久99| 中文字幕色婷婷在线视频| 国产日韩欧美三级| 天堂av一区| 视频在线观看一区| 欧美日韩黑人| 欧美69视频| 国产精品99一区二区| 久久久精品日韩| 一区二区三区四区日本视频| 精品国产午夜肉伦伦影院| 国产精品多人| 日韩欧美中文字幕在线视频| 日韩一级欧洲| 免费精品视频| 欧美日韩精品一本二本三本| 久久久777| 久久久久国产精品一区三寸 | 久久激情五月激情| 久久国产三级精品| 麻豆91精品视频| 日韩精品诱惑一区?区三区| 亚洲免费福利| 尤物在线精品| 亚洲精品大片| 亚洲久草在线| 国产欧美一区二区三区米奇| 麻豆91在线播放| 最近高清中文在线字幕在线观看1| 黄毛片在线观看| 欧美日韩在线网站| 亚洲综合欧美| 偷拍亚洲精品| 国产精品麻豆久久| 亚洲精品97| 国产精品一区二区精品视频观看| 久久精品国产99| 五月天激情综合网| 日本电影久久久| 国产成人精品一区二区免费看京 | 欧美日韩国产在线一区| 日韩av中文在线观看| 精品一区av| 国产亚洲激情| 久久av网址| 99国产精品私拍| 欧美国产另类| 日韩制服丝袜av| 亚洲性色av| 国产欧美日韩一级| 亚洲免费黄色| 日本不良网站在线观看| 91综合久久爱com| 亚洲福利精品| 久久av影院| 亚洲精品日本| 99视频在线精品国自产拍免费观看| 精品三级av| 欧美日一区二区三区在线观看国产免| 亚洲91精品| 久久av网站| 日韩av一区二| 日韩中文字幕1| 日韩在线二区| 欧美中文一区| 蜜桃av一区二区三区电影| 国产91在线播放精品| 欧美一区91| 免费日韩精品中文字幕视频在线| 久久中文字幕一区二区三区| 亚洲综合激情在线| 午夜久久福利| 日韩中文在线播放| 美女久久精品| 欧美精品国产一区| 国产日韩欧美一区二区三区在线观看| 欧美另类综合| 欧美日韩国产高清电影| 成人一区而且| 欧美aa在线观看| 国产一二在线播放| 国产欧美日韩视频在线| 亚洲综合婷婷| 亚洲免费中文| 午夜影院欧美| 亚洲二区在线| 久久婷婷丁香| 欧洲一级精品| 亚洲精品99| 香蕉久久久久久久av网站| 亚洲大全视频| 在线亚洲国产精品网站| 欧美日韩国产亚洲一区| 一本一道久久a久久精品蜜桃| 亚洲精品网址| 美女久久网站| 日韩一区二区三区在线看| 欧美久久一区二区三区| 麻豆精品av| 国产精品黄网站| 国产69精品久久| 久久电影tv| 午夜精品免费| 日日夜夜免费精品视频| 国产欧美日韩视频在线| 国产日韩中文在线中文字幕| 97久久中文字幕| 久久精品天堂| 欧美成人精品三级网站| 青青伊人久久| 夜夜嗨一区二区| 久久久久久色 | 亚洲自拍另类| 日本中文字幕不卡| 欧美日韩视频网站| 亚洲一区二区三区中文字幕在线观看| 狠狠爱www人成狠狠爱综合网| 国产日韩欧美三区| 视频一区二区国产| 日本精品黄色| 亚洲色图网站| 久久九九国产| 牛牛精品成人免费视频| 亚洲制服一区| 先锋影音久久久| 欧美综合二区| 日韩精品导航| 水蜜桃精品av一区二区| 久久国产影院| 亚洲欧美伊人| 日韩一级欧洲| 日韩中文字幕一区二区三区| 亚洲精品一区二区在线看| 精品一区在线| 日韩亚洲精品在线| 天堂成人免费av电影一区| 久久久噜噜噜| 国产福利91精品一区二区| 欧美亚洲专区| 国产麻豆一区二区三区精品视频| 亚洲91在线| 久久国产欧美日韩精品| 欧美在线黄色| 国产精品久久久久久模特| 欧美亚洲三级| 久久精品九色| 国产精品99免费看| 四虎精品一区二区免费| 日韩国产欧美三级| 国产精品红桃| 麻豆国产欧美日韩综合精品二区| 国产欧美日韩精品一区二区免费 |