14.3. Tiles

在使用了Spring的web项目中,很可能会用到Tiles--就像任何其它的web层技术。下面简要讲述了如何使用。

注意: 这部分重点在于Spring中的 org.springframework.web.servlet.view.tiles2 包对Tiles 2(Tiles独立版本,要求Java 5+)的支持。在最初的 org.springframework.web.servlet.view.tiles 包中Spring同样继续支持Tiles 1.x(也可以叫“Struts Tiles”,作为Struts 1.1+的成员;兼容 Java 1.4)。

14.3.1. 需要的资源

使用Tiles项目中必须得包含一些额外的资源,以下是你需要的资源列表:

  • Tiles version 2.0.4以及更高版本

  • Commons BeanUtils

  • Commons Digester

  • Commons Logging

这些资源全部包含于Spring的发行包中

14.3.2. 如何集成Tiles

使用Tiles,你必须为它配置一些包含了定义信息的文件(关于Tiles定义和其他概念的信息,可以参考 http://tiles.apache.org)。在Spring中,可以使用 TilesConfigurer来完成这项工作。看看下面这个应用上下文配置的例子:

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.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 初始化的阶段,这些文件被加载,同时由 factoryClass 属性定义的工厂类被初始化。然后,定义文件中的tiles可以做为views在Spring的web 项目中使用。为使views正常工作,你必须有一个 ViewResolver,就像使用spring提供的任何其它view层技术一样。它有二种选择: UrlBasedViewResolverResourceBundleViewResolver

14.3.2.1.  UrlBasedViewResolver

UrlBasedViewResolver 为它解析的每个view实例化一个viewClass类的实例。

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

14.3.2.2.  ResourceBundleViewResolver

ResourceBundleViewResolver类 需要一个属性文件,其中包含了它需要使用的视图名和视图类:

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

					

vetsView.class=org.springframework.web.servlet.view.tiles2.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类时,你可以混用不同的view层技术。

注意,Tiles 2的TilesView 类支持 JSTL(JSP标准标签库)的开箱即用,同时,为支持Tiles 1.x,提供一个单独的TilesJstlView子类。

14.3.2.3.  SimpleSpringPreparerFactorySpringBeanPreparerFactory

作为一个高级的特性,Spring支持两个特定的Tiles 2PreparerFactory实现。如何Tiles定义文件中使用 ViewPreparer引用,详细资料查看Tiles文档。

基于指定的preparer类,指定SimpleSpringPreparerFactory 自动装配 ViewPreparer 实体,不但应用 Spring的容器回调而且应用配置Spring BeanPostProcessors。假如Spring的上下文范围 annotation-config 已经被激活,ViewPreparer 类中的注解将被自动检测到及应用。注意,在 Tiles 定义文件中预计的preparer classes,就像默认PreparerFactory所作的一样。

指定SpringBeanPreparerFactory来操作指定preparer名称,而不是类,从DispatcherServlet的应用上下文 获取相应的Spring bean。在这种情况下,完整的 bean 创建过程将在Spring应用上下文控制中,允许明确使用依赖注入,范围bean等等。 注意,需要定义为每一个preparer名称定义一个Spring bean(用于Tiles定义中)。

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.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.tiles2.SpringBeanPreparerFactory"/>

</bean>