使用XmlViewResolver
如果視圖對象的 Bean 數目太多,那么直接在 smart-servlet.xml 文件中配置,勢必影響主配置文件的簡潔性。XmlViewResolver 和 BeanNameViewResolver 功能相似,唯一不同的是它可以將視圖 Bean 定義在一個獨立的 XML 文件中。要使用 XmlViewResolver,必須在 smart-servlet.xml 添加以下片段:
<bean class="org.springframework.web.servlet.view.XmlViewResolver"p:order="20" p:location="/WEB-INF/views/smart-views.xml"/>
在默認情況下,XmlViewResolver 在 WEB-INF/views.xml 中查找視圖 Bean 的定義文件。我們將視圖 Bean 定義在 WEB-INF/views/smart-views.xml 文件中,所以需要通過?location 顯式指定。
定義視圖 Bean 的 smart-views.xml 文件,其格式和普通的 Spring 配置文件沒有任何區別。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="userListJson1"class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"p:modelKeys="message" /><bean id="userListExcel1" class="com.smart.web.UserListExcelView"/><bean id="userListPdf1" class="com.smart.web.UserListPdfView"/></beans>
不過在 smart-views.xml 文件中定義的 Bean 不能被 Spring Web 上下文的其他 Bean?引用,它是被 XmlViewResolver 獨享的。
?
使用ResourceBundleViewResolver
對于同一個邏輯視圖名,如果希望為不同地區的用戶提供不同類型的視圖,則應該考慮使用ResourceBundleViewResolver。和 XmlViewResolver 將視圖定義在 XML 文件中不同, ResourceBundleViewResolver 通過一個國際化資源文件定義視圖對象。
例如,假設小春論壇需要考慮不同國家和地區客戶的不同展現需求:中國人喜歡使用 HTML 頁面的展現方式,而美國人喜歡使用 PDF 的展現方式一一一雖然這個需求很“怪誕”,但不影響我們把它作為一個例子。可以通過 ResourceBundleViewResolver 來實現這個需求,在 smart-servlet.xml 中添加以下代碼:
<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver"p:order="30" p:basename="/i18n/views"/>
通過 basename 屬性指定視圖國際化資源文件的基名。對應于中國大陸的視圖資源文件為views_zh_CN.properies,其內容為:
userListi18n.(class)=org.springframework.web.servlet.view.JstlView //①
userListi18n.url=/WEB-INF/views/user/userList.jsp //②
其中,使用 <邏輯視圖名>.(class) 屬性設置視圖實現類,如①處所示。如果視圖實現需要一個 URL 資源的支持,則可以通過 <邏輯視圖名>.url 設置這個 URL 資源。對于?JstlView 視圖實現類來說,其實是通過調用 JstlView#seturl() 設置 <邏輯視圖名>.url 指定?JSP 文件的。
對應于美國的視圖資源文件為 views_en_US.properties,其內容為:
userListi18n.(class)=com.smart.web.UserListPdfView
當美國用戶查看論壇的用戶列表時,ResourceBundleViewResolver 視圖解析器將其解析為一個PDF文檔。
在一個視圖國際化資源文件中可以定義多個視圖對象,如下:
//第一個視圖
welcomeView.(class)=org.springframework.web.servlet.view.JstlView
welcomeView.url=/WEB-INF/jsp/welcome.jsp //第二個視圖
vetsView.(class)=org.springframework.web.servlet.view.JstlView
vetsView.url=/WEB-INF/jsp/vets.jsp
?