Spring MVC源码解析 - ViewResolver组件

本文详细解析了Spring MVC中的ViewResolver组件,包括AbstractCachingViewResolver、UrlBasedViewResolver以及InternalResourceViewResolver的使用和工作原理。重点介绍了InternalResourceViewResolver作为默认视图解析器如何将视图名转换为URL路径。
摘要由CSDN通过智能技术生成

目录

一. ViewResolver

二. AbstractCachingViewResolver

三. UrlBasedViewResolver

四. InternalResourceViewResolver


DispatcherServlet.properties中,默认的视图解析器是InternalResourceViewResolver。将视图名解析为URL文件。

一. ViewResolver

/**
 * 通过名字解析视图
 */
public interface ViewResolver {

	/**
	 * 解析视图
	 */
	@Nullable
	View resolveViewName(String viewName, Locale locale) throws Exception;

}

 


二.  AbstractCachingViewResolver

/**
 * 一旦解析成功,就缓存View对象
 * 
 * 子类要去实现loadView模板方法。
 *
 */
public abstract class AbstractCachingViewResolver extends WebApplicationObjectSupport implements ViewResolver {

	/** Default maximum number of entries for the view cache: 1024. */
	public static final int DEFAULT_CACHE_LIMIT = 1024;

	/** Dummy marker object for unresolved views in the cache Maps. */
	private static final View UNRESOLVED_VIEW = new View() {
		@Override
		@Nullable
		public String getContentType() {
			return null;
		}
		@Override
		public void render(@Nullable Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) {
		}
	};


	/** 缓存中键值对最大的数量,1024 */
	private volatile int cacheLimit = DEFAULT_CACHE_LIMIT;

	/** 一旦解析不成功,避免再次解析它,有一个缓存对此进行处理 */
	private boolean cacheUnresolved = true;

	/** 视图的缓存 */
	private final Map<Object, View> viewAccessCache = new ConcurrentHashMap<>(DEFAULT_CACHE_LIMIT);

	/** Map from view key to View instance, synchronized for View creation. */
	@SuppressWarnings("serial")
	private final Map<Object, View> viewCreationCache =
			new LinkedHashMap<Object, View>(DEFAULT_CACHE_LIMIT, 0.75f, true) {
				@Override
				protected boolean removeEldestEntry(Map.Entry<Object, View> eldest) {
					if (size() > getCacheLimit()) {
						viewAccessCache.remove(eldest.getKey());
						return true;
					}
					else {
						return false;
					}
				}
			};


	/**
	 * 设置缓存中键值对的数量限制
	 */
	public void setCacheLimit(int cacheLimit) {
		this.cacheLimit = cacheLimit;
	}

	/**
	 * 返回缓存中键值对的数量的限制
	 */
	public int getCacheLimit() {
		return this.cacheLimit;
	}

	/**
	 * 开启或者关闭缓存
	 */
	public void setCache(boolean cache) {
		this.cacheLimit = (cache ? DEFAULT_CACHE_LIMIT : 0);
	}

	/**
	 * 返回缓存是否可以使用。即规定的键值对数量限制大于0
	 */
	public boolean isCache() {
		return (this.cacheLimit > 0);
	}

	/**
	 * 缓存解析失败的视图
	 */
	public void setCacheUnresolved(boolean cacheUnresolved) {
		this.cacheUnresolved = cacheUnresolved;
	}

	/**
	 * 返回是否开启了缓存解析失败的视图的功能
	 */
	public boolean isCacheUnresolved() {
		return this.cacheUnresolved;
	}


	/**
	 * 如果开启了缓存,先从缓存中尝试获取视图,如果没有则创建视图,然后放到缓存中;如果没有开启缓存,直接创建视图
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值