springmvc處理響應數據的解析

今天小編就爲大家分享一篇關於springmvc處理響應數據的解析,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

1. ModelAndView 相關的成員變量和方法

  • private Object view; 描述視圖信息
  • private ModelMap model 描述模型數據(響應數據)
  • public void setViewName(String viewName) 設置視圖信息
  • public ModelAndView addObject(String attributeName, Object attributeValue) 設置模型數據
  • protected Map<String, Object> getModelInternal() 獲取模型數據
  • public ModelMap getModelMap() 獲取模型數據
  • public Map<String, Object> getModel() 獲取模型數據
  • public String getViewName() 獲取視圖名字

2. ModelAndView 源碼調試流程

[1]. 在DispatcherServlet的 945 行, 準備執行請求處理方法

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

[2]. 執行請求處理方法, 請求處理方法返回一個ModelAndView對象, 最終返回到DispatcherServlet的945行。

[3]. 在DispatcherServlet 959行, 開始處理結果:解析視圖名字得到視圖對象==>視圖對象處理模型數據==>視圖對象完成轉發/重定向工作.

processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

[4]. 在DispatcherServlet的1012行

render(mv, request, response);

[5]. 在DispatcherServlet的1204行,解析視圖名字得到視圖對象.當前的視圖對象爲: InternalResourceView

view = resolveViewName(mv.getViewName(), mv.getModelInternal(), locale, request);

[6].在DispatcherServlet1225行, 視圖對象開始處理模型數據

view.render(mv.getModelInternal(), request, response);

說明: 視圖對象的render()方法是在View接口中定義的。 該方法在View接口下面的一個抽象類 AbstractView中進行了具體的實現.

[7].在AbstractView中的266行, 開始整合輸出模型數據

renderMergedOutputModel(mergedModel, request, response);

說明: renderMergetOutputModel方法是AbstractView中的抽象方法, 該方法在不同的視圖類中進行了不同的實現.

當前的視圖對象時InternalResourceView, 接下來調用到InternalResouceView中的renderMergetOutputModel方法。

[8]. 在InternalResourceView中的180行,將模型數據設置到Request域對象中.

exposeModelAsRequestAttributes(model, requestToExpose); 

[9]. 在InternalResourceView中的189行,獲取轉發器

RequestDispatcher rd = getRequestDispatcher(requestToExpose, dispatcherPath);

[10].在InternalResourceView中的209行,開始轉發.

rd.forward(requestToExpose, response);

3、視圖解析

3.1. Springmvc如何解析視圖?

首先,不論請求處理方法的返回值是String、ModelAndView等, Springmvc在調用完請求處理方法後,都會重新封裝成一個ModelAndView對象.

接下來, 視圖解析器對象 會解析ModelAndView中的view信息,得到具體的視圖對象.

在然後, 視圖對象會去處理模型數據, 並完成最終的轉發以及重定向的工作。

3.2. 視圖

3.2.1 視圖接口 View

String getContentType(); 主要用於設置響應頭信息 response.setContentType(“text/html;charset=utf-8”);
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
視圖對象處理模型數據.

3.2.2 一個抽象類 AbstractView

View接口中的render()方法是在AbstractView中進行了統一的實現.

protected abstract void renderMergedOutputModel(
Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws Exception; 在不同的視圖實現類中做了具體的實現,主要就是完成轉發和重定向工作.

3.2.3 視圖的作用

視圖主要就是處理模型數據, 並完成最終的轉發和重定向工作.

3.2.4 常用的視圖類

  • InternalResourceView 轉發視圖
  • JstlView 轉發視圖,是InternalResourceView的子類.
  • RedirectView 重定向視圖

3. 視圖解析器

3.3 視圖解析器 ViewResolver

View resolveViewName(String viewName, Locale locale) throws Exception; 解析視圖名字得到視圖對象

3.1 視圖解析器的作用

視圖解析器專門就是用於解析得到視圖對象的.

3.2 常用的視圖解析器類

InternalResourceViewResolver

3.3 視圖解析器的優先級

默認值是int的最大值, 值越小優先級越高.

3.4. 重定向

在請求處理方法的返回值前面添加 redirect: 前綴即可.

重定向的工作是由 RedirectView 來完成的.

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對神馬文庫的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章