




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 商品房回購合同注意事項
- 貴州省黔東南州2025屆八下數(shù)學(xué)期末復(fù)習(xí)檢測模擬試題含解析
- 軟件開發(fā)培訓(xùn)合作協(xié)議
- 智能森林防火系統(tǒng)開發(fā)合同
- 智能建筑設(shè)備供應(yīng)與維護(hù)合同
- 智能版權(quán)標(biāo)準(zhǔn)化服務(wù)合同
- 智能手術(shù)輔助系統(tǒng)開發(fā)合同
- 汽車配件供應(yīng)及維修協(xié)議
- 智能家居安全解決方案設(shè)計服務(wù)協(xié)議
- 電商平臺跨境物流解決方案提供商合同
- 護(hù)士定期考核試題及答案
- 污水處理中的成本控制與效益評估
- 2025年北師大版五年級數(shù)學(xué)下冊階段測試試卷
- 01金融機構(gòu)概述幻燈片資料
- 2024年智慧風(fēng)電運維技術(shù)技能競賽理論試題庫(含答案)
- 房地產(chǎn)質(zhì)保期內(nèi)《維修管理辦法》
- 施工安全風(fēng)險分級管控和隱患排查治理監(jiān)理工作制度
- 【MOOC】房地產(chǎn)管理-華中科技大學(xué) 中國大學(xué)慕課MOOC答案
- 退休對女性職工抑郁的影響研究
- 設(shè)備潤滑保養(yǎng)制度(4篇)
- 渤海銀行借款合同模板
評論
0/150
提交評論