您的位置:首页 > 编程语言 > Java开发

SpringMVC 流程(5)-- 视图解析器

2015-07-30 13:05 465 查看
一. 视图解析器概念

        视图解析器主要是用来匹配名字和具体的视图资源。通俗的讲就是我们在控制层返回一个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自己是有的。

参考:

1. http://www.jpalace.org/document/34/spring-mvc-tutorial#section11
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息