SpringMvc如何處理ModelAndView(十一)


github原文鏈接 https://github.com/DespairYoke/java-advance筐喳。創(chuàng)作不易剪个,請(qǐng)給個(gè)免費(fèi)的star信认,已表支持渣淤。

示例

@GetMapping(value = "hello")
public MyModelAndView index(String name, ModelAndView modelAndView) {
    modelAndView.addObject("message",name);
    modelAndView.setViewName("index");
    return modelAndView;
}

返回值的處理

由于返回值類(lèi)型是ModelAndView,不是簡(jiǎn)單的字符串。這時(shí)返回值的處理不再使用ViewNameMethodReturnValueHandler捻撑,而是使用了ModelAndViewMethodReturnValueHandler處理的方式來(lái)處理磨隘。具體處理方法是

public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {

    ModelAndView mav = (ModelAndView) returnValue;
        String viewName = mav.getViewName();
        mavContainer.setViewName(viewName);
    mavContainer.setStatus(mav.getStatus());
    mavContainer.addAllAttributes(mav.getModel());
}

這里只是簡(jiǎn)單的把視圖名(示例中的index)和mav中的model(示例中的message)放入mavContainer。那我們接著看下這個(gè)mavContainer后續(xù)是如何處理顾患。
由執(zhí)行順序可以在RequestMappingHandlerAdapterinvokeHandlerMethod方法看到番捂,下一個(gè)對(duì)mavcontainer做處理的是getModelAndView方法。

private ModelAndView getModelAndView(ModelAndViewContainer mavContainer,ModelFactory modelFactory, NativeWebRequest webRequest) throws Exception {

    ModelMap model = mavContainer.getModel();
    ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model, mavContainer.getStatus());
    return mav;
}

可見(jiàn)mavContainer好像一個(gè)容器江解,把ModelAndView從返回值放入進(jìn)去设预,現(xiàn)在又取出來(lái)生成新的ModelAndView。跟蹤代碼膘流,看下新的ModelAndView又被何時(shí)處理絮缅。發(fā)現(xiàn)是在DispatcherServletdoDispatch方法中的processDispatchResult方法中進(jìn)行處理鲁沥。

private void processDispatchResult(HttpServletRequest request, HttpServletResponse response,
@Nullable MyHandlerExecutionChain mappedHandler, @Nullable MyModelAndView mv,Exception exception) throws Exception {
    // 獲取視圖view
    render(mv, request, response);
}

此時(shí)就調(diào)用了一個(gè)render方法。

protected void render(MyModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception {
  //獲取適合的view
  view = resolveViewName(viewName, mv.getModelInternal(), locale, request);
  view.render(mv.getModelInternal(), request, response);
}
  • resolveViewName獲取適合的view
  • render視圖渲染頁(yè)面耕魄。
    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

        Map<String, Object> mergedModel = createMergedOutputModel(model, request, response);
        prepareResponse(request, response);
        renderMergedOutputModel(mergedModel, getRequestToExpose(request), response);
    }
  • createMergedOutputModel創(chuàng)建了一個(gè)Map對(duì)象mergedModel画恰,把model中的信息放入新對(duì)map對(duì)象mergedModel中。
  • renderMergedOutputModel是對(duì)新mapmergedModel處理吸奴。
protected void renderMergedOutputModel(
        Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
        exposeModelAsRequestAttributes(model, request);
 String dispatcherPath = prepareForRendering(request, response);
        RequestDispatcher rd = getRequestDispatcher(request, dispatcherPath);
    rd.forward(request, response);
}
  • exposeModelAsRequestAttributes 是把model中的信息放入request中
protected void exposeModelAsRequestAttributes(Map<String, Object> model, HttpServletRequest request) throws Exception {
        model.forEach((modelName, modelValue) -> {
          request.setAttribute(modelName, modelValue); 
        });
    }
  • prepareForRendering 根據(jù)示例中的index值允扇,找到對(duì)應(yīng)的jsp路徑。
  • rd.forward 只是對(duì)request的轉(zhuǎn)發(fā)则奥。

總結(jié):spring只是把ModelandView中的信息經(jīng)過(guò)一系列處理考润,最終放入了request中,交給Servlet去處理读处。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糊治,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子罚舱,更是在濱河造成了極大的恐慌井辜,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件管闷,死亡現(xiàn)場(chǎng)離奇詭異粥脚,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)包个,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)刷允,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人碧囊,你說(shuō)我怎么就攤上這事树灶。” “怎么了糯而?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵破托,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我歧蒋,道長(zhǎng),這世上最難降的妖魔是什么州既? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任谜洽,我火速辦了婚禮,結(jié)果婚禮上吴叶,老公的妹妹穿的比我還像新娘阐虚。我一直安慰自己,他們只是感情好蚌卤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布实束。 她就那樣靜靜地躺著奥秆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咸灿。 梳的紋絲不亂的頭發(fā)上构订,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音避矢,去河邊找鬼悼瘾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛审胸,可吹牛的內(nèi)容都是我干的亥宿。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砂沛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼烫扼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起碍庵,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤映企,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后怎抛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卑吭,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年马绝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豆赏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡富稻,死狀恐怖掷邦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椭赋,我是刑警寧澤抚岗,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站哪怔,受9級(jí)特大地震影響宣蔚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜认境,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一胚委、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叉信,春花似錦亩冬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)覆享。三九已至,卻和暖如春营袜,著一層夾襖步出監(jiān)牢的瞬間撒顿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工连茧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留核蘸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓啸驯,卻偏偏與公主長(zhǎng)得像客扎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罚斗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 閱讀本文章大概需要8分鐘左右徙鱼。相信會(huì)讓你對(duì)Spring MVC的理解更加深刻,更上一層樓针姿。 SpringMV...
    cmazxiaoma閱讀 20,745評(píng)論 9 104
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,092評(píng)論 1 32
  • SpringMVC介紹 Spring web mvc 和Struts2都屬于表現(xiàn)層的框架袱吆,它是Spring框架的一...
    day_Sunny閱讀 744評(píng)論 0 0
  • 不敢相信最接近真實(shí)的孔子形象是這樣的,至少一米九的壯漢~~~大成至圣先師(???)距淫,這怕不是鐘馗吧绞绒。參觀了孔學(xué)院,...
    威來(lái)不迎閱讀 288評(píng)論 1 1
  • 作者/Sarah夕若 如何讓《易經(jīng)》成為你生活的導(dǎo)師之兌榕暇,離蓬衡,震,巽彤枢,坎 1狰晚,兌卦 兌卦,易經(jīng)八正卦排行⑵缴啡,代表號(hào)...
    嬡塔羅閱讀 1,122評(píng)論 0 3