springmvc處理響應(yīng)數(shù)據(jù)的解析
1. ModelAndView 相關(guān)的成員變量和方法
- private Object view; 描述視圖信息
- private ModelMap model 描述模型數(shù)據(jù)(響應(yīng)數(shù)據(jù))
- public void setViewName(String viewName) 設(shè)置視圖信息
- public ModelAndView addObject(String attributeName, Object attributeValue) 設(shè)置模型數(shù)據(jù)
- protected Map<String, Object> getModelInternal() 獲取模型數(shù)據(jù)
- public ModelMap getModelMap() 獲取模型數(shù)據(jù)
- public Map<String, Object> getModel() 獲取模型數(shù)據(jù)
- public String getViewName() 獲取視圖名字
2. ModelAndView 源碼調(diào)試流程
[1]. 在DispatcherServlet的 945 行, 準(zhǔn)備執(zhí)行請(qǐng)求處理方法
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
[2]. 執(zhí)行請(qǐng)求處理方法, 請(qǐng)求處理方法返回一個(gè)ModelAndView對(duì)象, 最終返回到DispatcherServlet的945行。
[3]. 在DispatcherServlet 959行, 開(kāi)始處理結(jié)果:解析視圖名字得到視圖對(duì)象==>視圖對(duì)象處理模型數(shù)據(jù)==>視圖對(duì)象完成轉(zhuǎn)發(fā)/重定向工作.
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
[4]. 在DispatcherServlet的1012行
render(mv, request, response);
[5]. 在DispatcherServlet的1204行,解析視圖名字得到視圖對(duì)象.當(dāng)前的視圖對(duì)象為: InternalResourceView
view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);

[6].在DispatcherServlet1225行, 視圖對(duì)象開(kāi)始處理模型數(shù)據(jù)
view.render(mv.getModelInternal(), request, response);
說(shuō)明: 視圖對(duì)象的render()方法是在View接口中定義的。 該方法在View接口下面的一個(gè)抽象類(lèi) AbstractView中進(jìn)行了具體的實(shí)現(xiàn).
[7].在AbstractView中的266行, 開(kāi)始整合輸出模型數(shù)據(jù)
renderMergedOutputModel(mergedModel, request, response);
說(shuō)明: renderMergetOutputModel方法是AbstractView中的抽象方法, 該方法在不同的視圖類(lèi)中進(jìn)行了不同的實(shí)現(xiàn).
當(dāng)前的視圖對(duì)象時(shí)InternalResourceView, 接下來(lái)調(diào)用到InternalResouceView中的renderMergetOutputModel方法。
[8]. 在InternalResourceView中的180行,將模型數(shù)據(jù)設(shè)置到Request域?qū)ο笾?
exposeModelAsRequestAttributes(model, requestToExpose);

[9]. 在InternalResourceView中的189行,獲取轉(zhuǎn)發(fā)器
RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);
[10].在InternalResourceView中的209行,開(kāi)始轉(zhuǎn)發(fā).
rd.forward(requestToExpose, response);
3、視圖解析
3.1. Springmvc如何解析視圖?
首先,不論請(qǐng)求處理方法的返回值是String、ModelAndView等, Springmvc在調(diào)用完請(qǐng)求處理方法后,都會(huì)重新封裝成一個(gè)ModelAndView對(duì)象.
接下來(lái), 視圖解析器對(duì)象 會(huì)解析ModelAndView中的view信息,得到具體的視圖對(duì)象.
在然后, 視圖對(duì)象會(huì)去處理模型數(shù)據(jù), 并完成最終的轉(zhuǎn)發(fā)以及重定向的工作。
3.2. 視圖
3.2.1 視圖接口 View
String getContentType(); 主要用于設(shè)置響應(yīng)頭信息 response.setContentType(“text/html;charset=utf-8”);
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
視圖對(duì)象處理模型數(shù)據(jù).
3.2.2 一個(gè)抽象類(lèi) AbstractView
View接口中的render()方法是在AbstractView中進(jìn)行了統(tǒng)一的實(shí)現(xiàn).
protected abstract void renderMergedOutputModel(
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws Exception; 在不同的視圖實(shí)現(xiàn)類(lèi)中做了具體的實(shí)現(xiàn),主要就是完成轉(zhuǎn)發(fā)和重定向工作.
3.2.3 視圖的作用
視圖主要就是處理模型數(shù)據(jù), 并完成最終的轉(zhuǎn)發(fā)和重定向工作.
3.2.4 常用的視圖類(lèi)
- InternalResourceView 轉(zhuǎn)發(fā)視圖
- JstlView 轉(zhuǎn)發(fā)視圖,是InternalResourceView的子類(lèi).
- RedirectView 重定向視圖
3. 視圖解析器
3.3 視圖解析器 ViewResolver
View resolveViewName(String viewName, Locale locale) throws Exception; 解析視圖名字得到視圖對(duì)象
3.1 視圖解析器的作用
視圖解析器專門(mén)就是用于解析得到視圖對(duì)象的.
3.2 常用的視圖解析器類(lèi)
InternalResourceViewResolver
3.3 視圖解析器的優(yōu)先級(jí)
默認(rèn)值是int的最大值, 值越小優(yōu)先級(jí)越高.
3.4. 重定向
在請(qǐng)求處理方法的返回值前面添加 redirect: 前綴即可.
重定向的工作是由 RedirectView 來(lái)完成的.
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Maven基礎(chǔ)之如何修改本地倉(cāng)庫(kù)的默認(rèn)路徑
這篇文章主要介紹了Maven基礎(chǔ)之如何修改本地倉(cāng)庫(kù)的默認(rèn)路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-12-12
SpringBoot項(xiàng)目嵌入RocketMQ的實(shí)現(xiàn)示例
本文主要介紹了SpringBoot項(xiàng)目嵌入RocketMQ的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
Java方法的參數(shù)傳遞機(jī)制實(shí)例詳解
這篇文章主要介紹了Java方法的參數(shù)傳遞機(jī)制,結(jié)合實(shí)例形式詳細(xì)分析了java方法參數(shù)傳遞機(jī)制原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-09-09

