SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法_第1頁
SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法_第2頁
SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法_第3頁
SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法_第4頁
SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第SpringBoot響應(yīng)處理之以Json數(shù)據(jù)返回的實現(xiàn)方法目錄一、示例代碼二、返回值解析原理三、源代碼分析(debug)四、內(nèi)容協(xié)商機制1.內(nèi)容協(xié)商2.內(nèi)容協(xié)商原理重點源代碼3.HttpMessageConverters消息轉(zhuǎn)換器原理

一、示例代碼

訪問localhost:8080/jsonTest返回json格式的數(shù)據(jù)

@Controller

publicclassResponseTestController{

@ResponseBody//標(biāo)注——自動返回json數(shù)據(jù)

@GetMapping("/jsonTest")

publicPersontestPerson(){

Personperson=newPerson();

person.setAge(20);

person.setUserName("Liuwanqing");

Petpet=newPet();

pet.setName("huahua");

pet.setAge("五個月");

person.setPet(pet);

returnperson;

二、返回值解析原理

SpringBoot支持的返回值類型是由返回值解析器決定的,SpringBoot返回值類型如下:

ModelAndView

Model

View

SpringBoot共含15種返回值解析器決定了其支持15種返回值:

三、源代碼分析(debug)

設(shè)置以下幾處斷點:

stepinto返回值處理器邏輯

this.returnValueHandlers.handleReturnValue(returnValue,this.getReturnValueType(returnValue),mavContainer,webRequest);

1.先找返回值處理器

HandlerMethodReturnValueHandlerhandler=this.selectHandler(returnValue,returnType);

2.執(zhí)行下列代碼,找到符合要求的返回值處理器

在眾多返回值處理器中找到符合要求的RequestResponseBodyMethodRrocessor

即RequestResponseBodyMethodRrocessor可處理標(biāo)注了@ResponseBody注解的返回值

privateHandlerMethodReturnValueHandlerselectHandler(@NullableObjectvalue,MethodParameterreturnType){

booleanisAsyncValue=this.isAsyncReturnValue(value,returnType);

Iteratorvar4=this.returnValueHandlers.iterator();

HandlerMethodReturnValueHandlerhandler;

do{

do{

if(!var4.hasNext()){

returnnull;

handler=(HandlerMethodReturnValueHandler)var4.next();

}while(isAsyncValue!(handlerinstanceofAsyncHandlerMethodReturnValueHandler));

}while(!handler.supportsReturnType(returnType));

returnhandler;

}

3.調(diào)用返回值處理器(interfaceHandlerMethodReturnValueHandler)處理:

判斷是否支持這種類型的返回值,支持調(diào)用返回值處理器,調(diào)用handleReturnValue進(jìn)行處理

publicinterfaceHandlerMethodReturnValueHandler{

booleansupportsReturnType(MethodParametervar1);

voidhandleReturnValue(@NullableObjectvar1,MethodParametervar2,ModelAndViewContainervar3,NativeWebRequestvar4)throwsException;

4.RequestResponseBodyMethodRrocessor工作原理

關(guān)鍵代碼:

publicvoidhandleReturnValue(@NullableObjectreturnValue,MethodParameterreturnType,ModelAndViewContainermavContainer,NativeWebRequestwebRequest)throwsIOException,HttpMediaTypeNotAcceptableException,HttpMessageNotWritableException{

mavContainer.setRequestHandled(true);

ServletServerHttpRequestinputMessage=this.createInputMessage(webRequest);

ServletServerHttpResponseoutputMessage=this.createOutputMessage(webRequest);

this.writeWithMessageConverters(returnValue,returnType,inputMessage,outputMessage);

處理返回值的方法

使用消息轉(zhuǎn)換器(涉及內(nèi)容協(xié)商機制,請移步下文內(nèi)容協(xié)商機制)進(jìn)行寫出操作,消息轉(zhuǎn)換器工作過程如下:

瀏覽器告知服務(wù)器其處理能力服務(wù)器根據(jù)其自身能力,判斷服務(wù)器能生產(chǎn)什么樣的內(nèi)容SpringMVC遍歷所有容器的底層HttpMessageConverter,看誰能處理

四、內(nèi)容協(xié)商機制

1.內(nèi)容協(xié)商

瀏覽器告知服務(wù)器其需要什么類型的服務(wù)類型

瀏覽器可接受的類型:

服務(wù)器得到瀏覽器的處理能力:

服務(wù)器將返回內(nèi)容轉(zhuǎn)為瀏覽器能處理的形式

2.內(nèi)容協(xié)商原理重點源代碼

protectedListMediaTypegetProducibleMediaTypes(HttpServletRequestrequest,ClassvalueClass,@NullableTypetargetType){

SetMediaTypemediaTypes=(Set)request.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE);

if(!CollectionUtils.isEmpty(mediaTypes)){

returnnewArrayList(mediaTypes);

}elseif(this.allSupportedMediaTypes.isEmpty()){

returnCollections.singletonList(MediaType.ALL);

}else{

ListMediaTyperesult=newArrayList();

Iteratorvar6=this.messageConverters.iterator();

while(true){

while(var6.hasNext()){

HttpMessageConverterconverter=(HttpMessageConverter)var6.next();

if(converterinstanceofGenericHttpMessageConvertertargetType!=null){

if(((GenericHttpMessageConverter)converter).canWrite(targetType,valueClass,(MediaType)null)){

result.addAll(converter.getSupportedMediaTypes());

}elseif(converter.canWrite(valueClass,(MediaType)null)){

result.addAll(converter.getSupportedMediaTypes());

returnresult;

}

3.HttpMessageConverters消息轉(zhuǎn)換器原理

MessageConverter規(guī)范

默認(rèn)的MessageConverter

最終MappingJackson2HttpMessageConverter把對象轉(zhuǎn)為JS

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論