SpringMVC 流程(5)-- 視圖解析器



一. 視圖解析器概念

        視圖解析器主要是用來匹配名字和具體的視圖資源。通俗的講就是我們在控制層返回一個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自己是有的。



參考:


發佈了97 篇原創文章 · 獲贊 19 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章