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

相关文章
相关标签/搜索