中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

wordpress 去除頁面標題seo點擊軟件手機

wordpress 去除頁面標題,seo點擊軟件手機,wordpress網站amp,wordpress頁面模板下載地址一、知識回顧 我們知道,接口的參數,一般都要配上注解來一起使用。 不同的參數注解,決定了傳參的方式不同。 為什么會這樣? 如果讓你設計接口參數解析,你會怎么做? 首先,我們知道方法參數是形…

一、知識回顧

我們知道,接口的參數,一般都要配上注解來一起使用。
不同的參數注解,決定了傳參的方式不同。

為什么會這樣?
如果讓你設計接口參數解析,你會怎么做?

首先,我們知道方法參數是形參。具體的實參是request中帶來的。
那么springboot底層是如何將path中的實參與接口的形參對應上的?

二、源碼解讀

首先,我們知道接口肯定是歸DispatcherServlet類來管理的,所以,我們直接進入這個類
前面的章節(jié),我們已經知道,接口入口方法是:org.springframework.web.servlet.DispatcherServlet#doDispatch
所以,我們進入這個方法進行斷點跟蹤并分析原理。

DispatcherServlet#doDispatch方法

1、找到對應request的Handler

這里的原理解釋在:
SpringBoot2:請求處理原理分析-請求Path與接口的映射關系(HandlerMapping)
在這里插入圖片描述

2、找Handler的適配器

在這里插入圖片描述
mappedHandler.getHandler()
這個已經拿到具體的controller了,返回類型是HandlerMehod類型
那么,為什么不直接就反射調用了?還弄個適配器干啥?
在這里插入圖片描述
我們進入getHandlerAdapter方法
在這里插入圖片描述
這里的適配器,有4種
在這里插入圖片描述
我們在看看適配器結構
它是一個接口,有三個方法。
在這里插入圖片描述
它有以下幾個實現類
在這里插入圖片描述
這里我們會發(fā)現,實現類有6個,為什么,handlerAdapters變量只有4個了?
我們繼續(xù)看源碼,會發(fā)現是通過DispatcherServlet.properties配置好的。
在這里插入圖片描述在這里插入圖片描述
D:/app/maven/repository/org/springframework/spring-webmvc/5.2.9.RELEASE/spring-webmvc-5.2.9.RELEASE.jar!/org/springframework/web/servlet/DispatcherServlet.properties
在這里插入圖片描述
繼續(xù)往下看
通過getHandlerAdapter方法,我們可以看出,Adapters是通過supports方法來確定具體哪個適配器來處理。
supports的具體邏輯就不看了,因為,每個實現的adapter判斷邏輯不通。

也就是說,getHandlerAdapter方法循環(huán)遍歷四個adapters,通過adaptersupports方法,找到了handler對應的HandlerAdapter類。

3、通過適配器處理controller接口參數

我們常用的是@RequestMapping類型的接口注解。
所以這里,我主要解讀一下org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
在這里插入圖片描述
這里,我們可以看出ha.handle是具體的哪個adapter來實現的,從而進入對應的實現類里進行處理。
我這里肯定是進入RequestMappingHandlerAdapter類中看具體邏輯。

3.1、查看RequestMappingHandlerAdapter適配器處理邏輯

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#handleInternal
在這里插入圖片描述
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod
這里設置參數解析器和返回值處理器。
在這里插入圖片描述
有26個參數解析器和15個返回值處理器
在這里插入圖片描述
26個參數解析器代碼位置:
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#getDefaultArgumentResolvers
注意ServletModelAttributeMethodProcessor解析器,添加了2次

private List<HandlerMethodArgumentResolver> getDefaultArgumentResolvers() {List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>(30);// Annotation-based argument resolutionresolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), false));resolvers.add(new RequestParamMapMethodArgumentResolver());resolvers.add(new PathVariableMethodArgumentResolver());resolvers.add(new PathVariableMapMethodArgumentResolver());resolvers.add(new MatrixVariableMethodArgumentResolver());resolvers.add(new MatrixVariableMapMethodArgumentResolver());resolvers.add(new ServletModelAttributeMethodProcessor(false));resolvers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));resolvers.add(new RequestPartMethodArgumentResolver(getMessageConverters(), this.requestResponseBodyAdvice));resolvers.add(new RequestHeaderMethodArgumentResolver(getBeanFactory()));resolvers.add(new RequestHeaderMapMethodArgumentResolver());resolvers.add(new ServletCookieValueMethodArgumentResolver(getBeanFactory()));resolvers.add(new ExpressionValueMethodArgumentResolver(getBeanFactory()));resolvers.add(new SessionAttributeMethodArgumentResolver());resolvers.add(new RequestAttributeMethodArgumentResolver());// Type-based argument resolutionresolvers.add(new ServletRequestMethodArgumentResolver());resolvers.add(new ServletResponseMethodArgumentResolver());resolvers.add(new HttpEntityMethodProcessor(getMessageConverters(), this.requestResponseBodyAdvice));resolvers.add(new RedirectAttributesMethodArgumentResolver());resolvers.add(new ModelMethodProcessor());resolvers.add(new MapMethodProcessor());resolvers.add(new ErrorsMethodArgumentResolver());resolvers.add(new SessionStatusMethodArgumentResolver());resolvers.add(new UriComponentsBuilderMethodArgumentResolver());// Custom argumentsif (getCustomArgumentResolvers() != null) {resolvers.addAll(getCustomArgumentResolvers());}// Catch-allresolvers.add(new RequestParamMethodArgumentResolver(getBeanFactory(), true));resolvers.add(new ServletModelAttributeMethodProcessor(true));return resolvers;}

在這里插入圖片描述
15個返回值處理器代碼位置
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#getDefaultReturnValueHandlers

private List<HandlerMethodReturnValueHandler> getDefaultReturnValueHandlers() {List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>(20);// Single-purpose return value typeshandlers.add(new ModelAndViewMethodReturnValueHandler());handlers.add(new ModelMethodProcessor());handlers.add(new ViewMethodReturnValueHandler());handlers.add(new ResponseBodyEmitterReturnValueHandler(getMessageConverters(),this.reactiveAdapterRegistry, this.taskExecutor, this.contentNegotiationManager));handlers.add(new StreamingResponseBodyReturnValueHandler());handlers.add(new HttpEntityMethodProcessor(getMessageConverters(),this.contentNegotiationManager, this.requestResponseBodyAdvice));handlers.add(new HttpHeadersReturnValueHandler());handlers.add(new CallableMethodReturnValueHandler());handlers.add(new DeferredResultMethodReturnValueHandler());handlers.add(new AsyncTaskMethodReturnValueHandler(this.beanFactory));// Annotation-based return value typeshandlers.add(new ModelAttributeMethodProcessor(false));handlers.add(new RequestResponseBodyMethodProcessor(getMessageConverters(),this.contentNegotiationManager, this.requestResponseBodyAdvice));// Multi-purpose return value typeshandlers.add(new ViewNameMethodReturnValueHandler());handlers.add(new MapMethodProcessor());// Custom return value typesif (getCustomReturnValueHandlers() != null) {handlers.addAll(getCustomReturnValueHandlers());}// Catch-allif (!CollectionUtils.isEmpty(getModelAndViewResolvers())) {handlers.add(new ModelAndViewResolverMethodReturnValueHandler(getModelAndViewResolvers()));}else {handlers.add(new ModelAttributeMethodProcessor(true));}return handlers;}

執(zhí)行并處理
在這里插入圖片描述
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod#invokeAndHandle
通過這個名字,我們也可以看出,這里invokeForRequest就是已經處理完請求了。
在這里插入圖片描述
進入invokeForRequest
關鍵代碼找到了,getMethodArgumentValues獲取方法參數值。
在這里插入圖片描述
org.springframework.web.method.support.InvocableHandlerMethod#getMethodArgumentValues

	protected Object[] getMethodArgumentValues(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,Object... providedArgs) throws Exception {MethodParameter[] parameters = getMethodParameters();if (ObjectUtils.isEmpty(parameters)) {return EMPTY_ARGS;}Object[] args = new Object[parameters.length];for (int i = 0; i < parameters.length; i++) {MethodParameter parameter = parameters[i];parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);args[i] = findProvidedArgument(parameter, providedArgs);if (args[i] != null) {continue;}if (!this.resolvers.supportsParameter(parameter)) {throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));}try {args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);}catch (Exception ex) {// Leave stack trace for later, exception may actually be resolved and handled...if (logger.isDebugEnabled()) {String exMsg = ex.getMessage();if (exMsg != null && !exMsg.contains(parameter.getExecutable().toGenericString())) {logger.debug(formatArgumentError(parameter, exMsg));}}throw ex;}}return args;}

首先,我們看下參數解析器 規(guī)范
有兩個方法
supportsParameter用來判斷是否支持解析
resolveArgument用來進行具體的解析操作
在這里插入圖片描述
這里用了設計模式中的組合模式
HandlerMethodArgumentResolverComposite實現了HandlerMethodArgumentResolver接口
然后,在該類中循環(huán)遍歷,是否有解析器可以處理當前參數,如果有,具體怎么解析。

關鍵代碼行
args[i] = this.resolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
通過斷點,我們可以看出,此時args[i]被賦值了。

繼續(xù)進入this.resolvers.resolveArgument查看邏輯
在這里插入圖片描述
在這里插入圖片描述
99行,獲取形參名,108行才是給形參賦值。
所以,在108行之前,都是解析接口方法形參。
我們在看下resolveName方法,可以看到,這個方法有很多具體的實現類。
我這里以PathVariable為例子。
在這里插入圖片描述
org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver#resolveName
在這里插入圖片描述
可以看出,給形參名的值,是從request中獲取到的。這樣,形參和實參就對應上了。
那么,這里的request.getAttribute是如何處理好的,這里沒有說明。
網上說是通過org.springframework.web.util.UrlPathHelper類實現的。
具體有興趣的同學自己去研究一下。

那么,到這里,源碼邏輯就差不多結束了。

三、邏輯梳理

首先,請求接口進入DispatcherServlet#doDispatch方法

先從handlerMapping中獲取具體的handler,即找到具體是哪個controller來處理請求。
handlerMapping類型默認配置了5種。

找到對應的handler后,在找到對應的handlerAdapter
handlerAdapters適配器類型默認配置了4種。

再然后,通過具體的handlerAdapter來解析方法參數
而解析方法參數,用到了參數解析器argumentResolvers
這里,參數解析器,配置了26種。
并且用了組合模式+緩存來優(yōu)化性能。

遍歷循環(huán)參數解析器,找到對應參數的解析器后
在通過接口方法的形參信息,如參數類型,參數名稱,參數注解等。
進行具體的參數解析,并從request中獲取實參值,賦值給形參,完成參數解析。

http://m.risenshineclean.com/news/32218.html

相關文章:

  • 做健身網站東莞網站制作
  • 色無極網站正在建設中seo值是什么意思
  • 網站開發(fā)中的抓包工具網站代運營多少錢一個月
  • 氣象服務網站建設計算機培訓
  • 網站開發(fā)和桌面開發(fā)哪個難百度搜索熱詞查詢
  • 視頻網站開發(fā)前景創(chuàng)建網站的流程
  • 東莞建站網站模板站長查詢工具
  • 做視頻網站需要多少帶寬優(yōu)化網站標題名詞解釋
  • 寧波網站建設論壇日喀則網站seo
  • 德州手機網站建設費用網絡推廣的方式有哪些
  • 邯鄲市網絡建站百度百度一下就知道
  • 我是做性視頻網站懷化seo推廣
  • 深圳網站建設公司哪家可以建app企業(yè)網絡營銷策劃方案范文
  • 有沒有找人做標書的網站寧波網絡營銷公司有哪些
  • 垂直+網站開發(fā)西安seo公司哪家好
  • 雜志網站建設方案優(yōu)化大師免安裝版
  • 東莞網站優(yōu)化推廣方案四川整站優(yōu)化關鍵詞排名
  • 企業(yè)網站系統(tǒng)seo行業(yè)
  • 免費自己制作網站方法日本站外推廣網站
  • 朝陽網站建設 慈云寺網絡營銷推廣方案模板
  • 龍巖網站設計較好的公司上海今天最新新聞10條
  • 動漫網站開發(fā)需求分析本周新聞熱點
  • 小語種網站寧德seo培訓
  • 青海省住房和城鄉(xiāng)建設廳門戶網站深圳做網站
  • 旬陽做網站湖南seo快速排名
  • 網站前端設計網絡營銷案例分析報告
  • 福州網站制作案例石家莊百度快照優(yōu)化排名
  • 聊天app開發(fā)源碼搜索引擎優(yōu)化seo專員
  • 國外域名查詢網站2021年10月新聞摘抄
  • 屬于網頁制作平臺蘭州seo優(yōu)化