详述SpringMVC自定义视图

一、运行原理

1、执行DispatcherServletonRefresh(ApplicationContext context)方法

protected void onRefresh(ApplicationContext context) {
	initStrategies(context);
}

2、执行DispatcherServletinitStrategies(ApplicationContext context)方法

protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);//标记
    initFlashMapManager(context);
}

3、执行DispatcherServletinitViewResolvers(ApplicationContext context)方法

private void initViewResolvers(ApplicationContext context) {
    this.viewResolvers = null;

    if (this.detectAllViewResolvers) {//detectAllViewResolvers是类中的属性,默认为true
        // 找到说有当前context及其父类context中的视图解释器
        Map matchingBeans =
                BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
        if (!matchingBeans.isEmpty()) {
            this.viewResolvers = new ArrayList(matchingBeans.values());
            // 选中所有的视图解释器.
            AnnotationAwareOrderComparator.sort(this.viewResolvers);
        }
    }
    else {//detectAllViewResolvers为false则不主动查找视图解释器
        try {
            ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class);//根据IEW_RESOLVER_BEAN_NAME属性直接获取视图解释器
            this.viewResolvers = Collections.singletonList(vr);
        }
        catch (NoSuchBeanDefinitionException ex) {
            // 忽视,在之后添加默认的视图解释器
        }
    }

    //确保我们有至少一个视图解释器
    // 一个默认视图解释器,如果没有找到其他视图解释器的话.
    if (this.viewResolvers == null) {//若经过之前的代码this.viewResolvers仍为空,则执行下方代码
        this.viewResolvers = getDefaultStrategies(context, ViewResolver.class);
        if (logger.isDebugEnabled()) {
            logger.debug("No ViewResolvers found in servlet '" + getServletName() + "': using default");
        }
    }
}

二、如何实现自定义视图

Spring配置问价中添加如下配置:



	
	
	
	

	//添加自定义视图解释器,一定要配置优先级,否则会按声明顺序默认赋予优先级
	
	

自定义视图类:

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;

@Component
public class ToView implements View{

	public String getContentType() {
		return "text/html; charset=UTF-8";
	}

	public void render(Map model, HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		response.getWriter().print("Hello World!");
		
	}
	
}

运行结果:

详述SpringMVC自定义视图_第1张图片

你可能感兴趣的:(Java课程,底层代码分析)