SpringMVC-源码解析(二)

processDispatchResult()细节

SpringMVC源码解析(一),mv = ha.handle后将要执行的是processDispatchResult(),这里是已经获得ModelAndView之后的视图解析部分。

1.进入processDispatchResult()

SpringMVC-源码解析(二)_第1张图片

2.进入render()方法

SpringMVC-源码解析(二)_第2张图片

3.进入ResolveViewName()方法

SpringMVC-源码解析(二)_第3张图片
从图中可以看出,我们在SpringMVC配置文件中配置了一个

    
        
        
    

因此SpringMVC读取到了InternalResourceViewResolver视图解析器,它提供了一个resolveViewName方法,接下来我们进入这个方法中。

4.InternalResourceViewResolver.resolveViewName方法

SpringMVC-源码解析(二)_第4张图片

5.creatView方法

SpringMVC-源码解析(二)_第5张图片
我们并没有携带任何的前缀开头因此进入最后的super.creatView()方法中

6.super.creatView()方法

进入了loadView()方法,继续往下走
R}$XB@0OZY_ENUJ56LRX0(V.png
由于buildview方法内太过复杂,所以没有继续往下,总之他最后通过buildview()SpringMVC给我们返回了一个view对象。

7.渲染页面

SpringMVC-源码解析(二)_第6张图片

应用:自己配置视图解析器

1.在SpringMVC中配置文件注入自己的视图解析器

    
        
        
    

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 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("你好" + name + ",欢迎来到本页面,你的密码是" + password + ".
"); } @Override public String getContentType() { return "text/html"; } }

4.查看源码中的变化

SpringMVC-源码解析(二)_第7张图片

总结

ha.handle()方法执行后会生成一个ModelAndView对象,视图解析器的功能就是负责解析这些对象生成对应的view对象。
视图解析器(ViewResolver)种类繁多,可以根据需要选择合适的视图解析器,不同的视图解析器会负责生成不同的视图对象(View),不同的视图对象(View)又会渲染出来不同的页面效果。
视图对象种类
SpringMVC-源码解析(二)_第8张图片

你可能感兴趣的:(spring,java,源码分析)