一. 视图解析器概念
视图解析器主要是用来匹配名字和具体的视图资源。通俗的讲就是我们在控制层返回一个ModelAndView对象,然后我们会在这个对象中setViewName("xx");那么就是匹配这个ViewName和具体的视图。
当然,它也用了策略模式,这样我们也可以根据实际需求更换不同的视图解析器。
视图解析器在DispatcherServlet中会有默认的配置,如下代码:
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
再看具体的代码:
private void initViewResolvers(ApplicationContext context) {
this.viewResolvers = null;
if (this.detectAllViewResolvers) {
// Find all ViewResolvers in the ApplicationContext, including ancestor contexts.
Map<String, ViewResolver> matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, ViewResolver.class, true, false);
if (!matchingBeans.isEmpty()) {
this.viewResolvers = new ArrayList<ViewResolver>(matchingBeans.values());
// We keep ViewResolvers in sorted order.
OrderComparator.sort(this.viewResolvers);
}
}
else {
try {
ViewResolver vr = context.getBean(VIEW_RESOLVER_BEAN_NAME, ViewResolver.class);
this.viewResolvers = Collections.singletonList(vr);
}
catch (NoSuchBeanDefinitionException ex) {
// Ignore, we'll add a default ViewResolver later.
}
}
// Ensure we have at least one ViewResolver, by registering
// a default ViewResolver if no other resolvers are found.
if (this.viewResolvers == null) {
this.viewResolvers = getDefaultStrategies(context, ViewResolver.class);
if (logger.isDebugEnabled()) {
logger.debug("No ViewResolvers found in servlet '" + getServletName() + "': using default");
}
}
}
从上面的代码的第8到12行,可以知道,我们还可以配置多个视图解析器。
二. 视图解析器种类
如下为官网的介绍的视图解析器种类图:
像我们一般使用的是:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
也就是说适合普通的 jsp。
以后我们就可以根据需要比如说需要更换freemarker,或者是velocity,就在这里更换配置相对应的视图解析器。
最后:这里具体是怎么解析其实还没有分析到。只是个人觉得不是特别的重要,我们目前需要知道的是
1. 学习它的策略模式,怎么才可以在不改变源码的情况下更换我们自己的视图解析器。
2. 知道有哪些视图解析器,以方便我们以后更换。不然需要用到也不知道原来spring自己是有的。
参考: