目录
二. AbstractCachingViewResolver
四. 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;
}
/**
* 如果开启了缓存,先从缓存中尝试获取视图,如果没有则创建视图,然后放到缓存中;如果没有开启缓存,直接创建视图