SpringMVC-源碼解析(二)

processDispatchResult()細節

SpringMVC源碼解析(一),mv = ha.handle後將要執行的是processDispatchResult(),這裏是已經得到ModelAndView以後的視圖解析部分。html

1.進入processDispatchResult()

view0.png

2.進入render()方法

view2.png

3.進入ResolveViewName()方法

view1.png
從圖中能夠看出,咱們在SpringMVC配置文件中配置了一個java

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

所以SpringMVC讀取到了InternalResourceViewResolver視圖解析器,它提供了一個resolveViewName方法,接下來咱們進入這個方法中。web

4.InternalResourceViewResolver.resolveViewName方法

`UYNYA_A}[@)[%I2Q6A@KI9.png

5.creatView方法

creatview.png
咱們並無攜帶任何的前綴開頭所以進入最後的super.creatView()方法中spring

6.super.creatView()方法

進入了loadView()方法,繼續往下走
KYWT[KO@)%`N7$[)5HRMMUB.png
loadview()方法下最重要的就是buildView方法。
R}$XB@0OZY_ENUJ56LRX0(V.png
因爲buildview方法內太過複雜,因此沒有繼續往下,總之他最後經過buildview()SpringMVC給咱們返回了一個view對象。segmentfault

7.渲染頁面

V3`$86124UJCT8SV_L2FPLV.png

應用:本身配置視圖解析器

1.在SpringMVC中配置文件注入本身的視圖解析器

<bean class="com.lyh.view.ViewResolverTest">
        <property name="order" value="1"></property>
        <!--order能夠設置優先級-->
    </bean>

2.編寫ViewResolverTest文件

package com.lyh.view;
import java.util.Locale;
import org.springframework.core.Ordered;
import org.springframework.web.servlet.View;
import org.springframework.web.servlet.ViewResolver;
public class ViewResolverTest implements ViewResolver,Ordered{
    private Integer order = 0;    
    @Override
    public View resolveViewName(String viewName, Locale locale)
            throws Exception {
        if(viewName.startsWith("nihao:")){
            return new MyView();
        }else{
            return null;
        }
    }
    @Override
    public int getOrder() {
        // TODO Auto-generated method stub
        return order;
    }
    //設置視圖解析器的優先級
    public void setOrder(Integer order){
        this.order = order;    }

}

3.編寫視圖文件MyView()

package com.lyh.view;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.View;
public class MyView implements View {
    @Override
    public void render(Map<String, ?> model, HttpServletRequest request,
                       HttpServletResponse response) throws Exception {
        response.setContentType("text/html");
        String name = (String) model.get("name");
        String password = (String) model.get("password");
        response.getWriter().write("<a>你好" + name + ",歡迎來到本頁面,你的密碼是" + password + ".</a><br/>");
    }
   @Override
    public String getContentType() {
        return "text/html";
    }
}

4.查看源碼中的變化

myview3.png
能夠看到我本身配置的視圖解析器已經生效了,接下來他就會進入到我配置的視圖解析器中去執行。
myview4.pngjsp

總結

ha.handle()方法執行後會生成一個ModelAndView對象,視圖解析器的功能就是負責解析這些對象生成對應的view對象。
視圖解析器(ViewResolver)種類繁多,能夠根據須要選擇合適的視圖解析器,不一樣的視圖解析器會負責生成不一樣的視圖對象(View),不一樣的視圖對象(View)又會渲染出來不一樣的頁面效果。
視圖對象種類
QQ截圖20200404012145.png
QQ截圖20200404012205.png
視圖解析器種類
QQ截圖20200404012245.pngide

相關文章
相關標籤/搜索