XmlViewResolver 和 ResourceBundleViewResolver

使用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/beans
     http://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      
原文地址:https://www.cnblogs.com/jwen1994/p/11182507.html