如何在springmvc中處理響應(yīng)數(shù)據(jù)?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。
“專業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個(gè)人一直以來堅(jiān)持追求的企業(yè)文化。 成都創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于網(wǎng)站設(shè)計(jì)制作、做網(wǎng)站、軟件開發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶需求為導(dǎo)向,結(jié)合用戶體驗(yàn)與視覺傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!
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
public ModelMap getModelMap() 獲取模型數(shù)據(jù)
public Map
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行, 開始處理結(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ì)象開始處理模型數(shù)據(jù)
view.render(mv.getModelInternal(), request, response);
說明: 視圖對(duì)象的render()方法是在View接口中定義的。 該方法在View接口下面的一個(gè)抽象類 AbstractView中進(jìn)行了具體的實(shí)現(xiàn).
[7].在AbstractView中的266行, 開始整合輸出模型數(shù)據(jù)
renderMergedOutputModel(mergedModel, request, response);
說明: renderMergetOutputModel方法是AbstractView中的抽象方法, 該方法在不同的視圖類中進(jìn)行了不同的實(shí)現(xiàn).
當(dāng)前的視圖對(duì)象時(shí)InternalResourceView, 接下來調(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行,開始轉(zhuǎn)發(fā).
rd.forward(requestToExpose, response);
3、視圖解析
3.1. Springmvc如何解析視圖?
首先,不論請(qǐng)求處理方法的返回值是String、ModelAndView等, Springmvc在調(diào)用完請(qǐng)求處理方法后,都會(huì)重新封裝成一個(gè)ModelAndView對(duì)象.
接下來, 視圖解析器對(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(Mapmodel, HttpServletRequest request, HttpServletResponse response)
視圖對(duì)象處理模型數(shù)據(jù).
3.2.2 一個(gè)抽象類 AbstractView
View接口中的render()
方法是在AbstractView中進(jìn)行了統(tǒng)一的實(shí)現(xiàn).
protected abstract void renderMergedOutputModel(
Mapmodel, HttpServletRequest request, HttpServletResponse response)
throws Exception; 在不同的視圖實(shí)現(xiàn)類中做了具體的實(shí)現(xiàn),主要就是完成轉(zhuǎn)發(fā)和重定向工作.
3.2.3 視圖的作用
視圖主要就是處理模型數(shù)據(jù), 并完成最終的轉(zhuǎn)發(fā)和重定向工作.
3.2.4 常用的視圖類
InternalResourceView 轉(zhuǎn)發(fā)視圖
JstlView 轉(zhuǎn)發(fā)視圖,是InternalResourceView的子類.
RedirectView 重定向視圖
3. 視圖解析器
3.3 視圖解析器 ViewResolver
View resolveViewName(String viewName, Locale locale) throws Exception;
解析視圖名字得到視圖對(duì)象
3.1 視圖解析器的作用
視圖解析器專門就是用于解析得到視圖對(duì)象的.
3.2 常用的視圖解析器類
InternalResourceViewResolver
3.3 視圖解析器的優(yōu)先級(jí)
默認(rèn)值是int的最大值, 值越小優(yōu)先級(jí)越高.
3.4. 重定向
在請(qǐng)求處理方法的返回值前面添加 redirect: 前綴即可.
重定向的工作是由 RedirectView 來完成的.
關(guān)于如何在springmvc中處理響應(yīng)數(shù)據(jù)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。