19.8 Tiles

在使用Spring的Web应用程序中,可以将Tiles 与任何其他视图技术集成在一起。 以下以广泛的方式描述如何做到这一点。

19.8.1 依赖

为了可以使用Tiles,您必须添加对Tiles 3.0.1版或更高版本的依赖关系,以及其对您的项目的传递依赖性。

19.8.2 怎样集成 Tiles

为了使用Tiles,你需要使用文件定义 配置 (对于基本定义和其他Tiles内容,请查看http://tiles.apache.org). 在Spring 是使用 TilesConfigurer. 请看下面的例子:

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/defs/general.xml</value>
            <value>/WEB-INF/defs/widgets.xml</value>
            <value>/WEB-INF/defs/administrator.xml</value>
            <value>/WEB-INF/defs/customer.xml</value>
            <value>/WEB-INF/defs/templates.xml</value>
        </list>
    </property>
</bean>

您可以看到,有五个文件包含定义,它们都位于“WEB-INF / defs”目录中。 在WebApplicationContext初始化时,将加载文件,并初始化定义工厂。 之后,这个定义文件中的Tile可以在Spring Web应用程序中用作视图。 为了能够使用视图,您必须拥有一个ViewResolver,就像Spring使用的任何其他视图技术一样。 下面你可以找到两种可能性:UrlBasedViewResolver和ResourceBundleViewResolver。

您可以通过添加下划线,然后添加区域设置来指定特定于区域设置的瓷砖定义。 例如:

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/defs/tiles.xml</value>
            <value>/WEB-INF/defs/tiles_fr_FR.xml</value>
        </list>
    </property>
</bean>

使用此配置,tiles_fr_FR.xml将用于具有fr_FR语言环境的请求,默认情况下将使用tiles.xml。

UrlBasedViewResolver

UrlBasedViewResolver为给定的viewClass实例化其必须解析的每个视图。

<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
</bean>

ResourceBundleViewResolver

ResourceBundleViewResolver必须提供一个属性文件,其中包含解析器可以使用的viewnames和viewclasses:

<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
    <property name="basename" value="views"/>
</bean>
...
welcomeView.(class)=org.springframework.web.servlet.view.tiles3.TilesView
welcomeView.url=welcome (this is the name of a Tiles definition)

vetsView.(class)=org.springframework.web.servlet.view.tiles3.TilesView
vetsView.url=vetsView (again, this is the name of a Tiles definition)

findOwnersForm.(class)=org.springframework.web.servlet.view.JstlView
findOwnersForm.url=/WEB-INF/jsp/findOwners.jsp
...

您可以看到,当使用ResourceBundleViewResolver时,您可以轻松地混合不同的视图技术。

请注意,TilesView类支持JSTL(JSP标准标记库)。

SimpleSpringPreparerFactory and SpringBeanPreparerFactory

作为高级功能,Spring还支持两种特殊的Tiles PreparerFactory实现。有关如何在您的Tiles定义文件中使用ViewPreparer引用的详细信息,请查看Tiles文档。

指定SimpleSpringPreparerFactory根据指定的preparer类自动导航ViewPreparer实例,应用Spring的容器回调以及应用配置的Spring BeanPostProcessors。如果Spring的上下文范围注释配置已激活,ViewPreparer类中的注释将被自动检测并应用。请注意,这需要在Tiles定义文件中的preparer类,就像默认的PreparerFactory一样。

指定SpringBeanPreparerFactory对指定的prepareer名称而不是类进行操作,从DispatcherServlet的应用程序上下文中获取相应的Spring bean。在这种情况下,完整的bean创建过程将控制Spring应用程序上下文,允许使用显式依赖注入配置,范围bean等。请注意,您需要为每个preparer名称定义一个Spring bean定义(如你的Tiles定义)。

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/defs/general.xml</value>
            <value>/WEB-INF/defs/widgets.xml</value>
            <value>/WEB-INF/defs/administrator.xml</value>
            <value>/WEB-INF/defs/customer.xml</value>
            <value>/WEB-INF/defs/templates.xml</value>
        </list>
    </property>

    <!-- resolving preparer names as Spring bean definition names -->
    <property name="preparerFactoryClass"
            value="org.springframework.web.servlet.view.tiles3.SpringBeanPreparerFactory"/>

</bean>