上次的文章中介紹了ModelAndView對象中的view對象,可以使用字符串來讓Spring框架進(jìn)行解析獲得適合的視圖。而解析View的就是ViewResolver技術(shù)。
ViewResolver的定義如下:
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;
}
在[spring-dispatcher-name]-servlet.xml中,可以定義viewResolver:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property
name="suffix" value=".jsp"/>
</bean>
來讓DispacherServlet進(jìn)行加載默認(rèn)的viewResolver,如果沒有設(shè)置viewResolver,spring使用InternalResourceViewResolver進(jìn)行解析。
Spring實(shí)現(xiàn)ViewResolver的非抽象類且我們經(jīng)常使用的viewResolver有以下四種:
InternalResourceViewResolver |
將邏輯視圖名字解析為一個(gè)路徑 |
BeanNameViewResolver |
將邏輯視圖名字解析為bean的Name屬性,從而根據(jù)name屬性,找定義View的bean |
ResourceBundleResolver |
和BeanNameViewResolver一樣,只不過定義的view-bean都在一個(gè)properties文件中,用這個(gè)類進(jìn)行加載這個(gè)properties文件 |
XmlViewResolver |
和ResourceBundleResolver一樣,只不過定義的view-bean在一個(gè)xml文件中,用這個(gè)類來加載xml文件 |
使用多視圖解析器:
我們不想只使用一種視圖解析器的話,可以在[spring-dispatcher-name]-servlet.xml定義多個(gè)viewResolver:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id=”beanNameViewResolver” class=”...BeanNameViewResolver”>
<property name="order" value="1"></property>
</bean>
<bean id=”beanNameViewResolver” class=”...XmlViewResolver”>
<property name="order" value="0"></property>
</bean>
DispatcherServlet會加載所有的viewResolver到一個(gè)list中,并按照優(yōu)先級進(jìn)行解析。注意order中的值越小,優(yōu)先級越高。而id為viewResolver
的viewResolver的優(yōu)先級是最低的。