Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离,支持EL,OGNL,MVEL等进行动态解析。

它用模板定义网页布局,每个页面模板都是一个简单的 JSP 页,它定义了一些由占位符(也可以指定具体jsp)组成的外形,以放置内容。执行时,Tiles 将会用相应的内容来替换占位符,因此,创建整个页面即形成布局。

Tiles框架是建立在JSP的include指令基础上的,但它提供了比JSP的include指令更强大的功能。

Tiles的方法体是用来创建版面布局,可复用部分等的,而Tiles的插入操作是用来插入Tiles的。同一个Tiles可以在同一个站点甚至同一个页面被重用多次。

Tiles的插入可以与一个在Tiles中称作“definition”的逻辑名联系起来。一个Tiles的definition包含一个逻辑名,一个主体页面和一些属性值。definition的声明并不插入与其相关联的Tiles方法体,它只是让Tiles与它的逻辑名关联起来。可以在任何能够插入Tiles地方运用定义的逻辑名,这样与其对应的Tiles及其属性就被插入进来了。


Tiles框架具有如下特性:

1.创建可重用的模板
2.动态构建和装载页面
3.定义可重用的Tiles组件
4.支持国际化。


【1】Tiles的definitions

Tiles的definition包含一个带有Tiles URL的逻辑名和一些属性值。定义并不插入Tiles,插入是在后来用definition的名字来完成的。

一个definition的逻辑名可以在站点中使用多次,实现对Tiles的轻松复用。 Tiles的definition可以继承自另外一个definition,并且能够重载其属性或者添加属性。这使得通过一些属性来构造不同的definition变得更加容易。

比如,你可以定义一个“父类”的definition同时定义主要的 header, menu, footer, 和一个默认的 title。然后令你的每一个页面的definitions继承自这个“父类”的definition并重载title和body属性。

Tiles的definitions的定义可以在JSP页面中进行,也可以在一个或者多个中心控制文件中进行。为了使中心控制文件中定义的definitions有效,你需要初始化“定义池”(definitions factory),这个定义池能够解释文件中的definitions并把它们提供给Tiles框架。


【2】Tiles需要的jar

可以在Apache主页下载tiles需要的jar:​​tiles需要的jar​

如果项目是maven,请使用如下配置:

  • 这里使用的是3.0.7版本。
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>3.0.7</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-api</artifactId>
<version>3.0.7</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.7</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.7</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>3.0.7</version>
</dependency>
<!--servlet 包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

【3】Tiles需要的监听器

<!-- tiles监听器,默认配置文件在/WEB-INF/tiles*.xml-->
<listener>
<listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
</listener>

也可以通过继承SimpleTilesListener 自定义监听器。


如果与Struts结合,需要配置插件​​org.apache.struts.tiles.TilesPlugin​​。该篇学习SpringMVC下使用tiles框架。


【4】springmvc.xml

SpringMVC只需要进行如下配置,并不需要在web.xml配置监听器。

<!-- 定义tiles视图解析器 -->
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.tiles3.TilesView</value>
</property>
</bean>

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

springmvc默认会加载​​/WEB-INF/tiles.xml​​,故上面不定义definitions属性也可以:

/**
* Set the Tiles definitions, i.e. the list of files containing the definitions.
* Default is "/WEB-INF/tiles.xml".
*/
public void setDefinitions(String... definitions) {
this.definitions = definitions;
}

【5】tiles.xml

示例如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
//定义基础模块
<definition name="base.definition" template="/WEB-INF/jsp/main.jsp">
// 定义模板
<put-attribute name="title" value="测试tiles" />
<put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
<put-attribute name="menu" value="/WEB-INF/jsp/menu.jsp" />
<put-attribute name="body" value="" />
</definition>

//继承了基础模板布局,注意罗继明welcome哦
<definition name="welcome" extends="base.definition">
<put-attribute name="title" value="主页" />
//放入属性body值
<put-attribute name="body" value="/WEB-INF/jsp/welcome.jsp" />
</definition>

</tiles-definitions>

Tiles与SpringMVC整合应用实践_xml


【6】模板文件main.jsp如下:

<body>
<div id="wrapper">
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
// 插入属性(其实就是放入参数),可以不设置值
<tiles:insertAttribute name="header" ignore="true"/>
<tiles:insertAttribute name="menu" ignore="true"/>
</nav>
<div id="tilesBody" style="margin-top: 50px">
<tiles:insertAttribute name="body" ignore="true"/>
</div>
</div>
</body>

【7】测试controller

//进入welcome页面
@RequestMapping(path = "/welcome")
public String welcome() {
return "welcome";
//根据该逻辑名,找到tiles.xml中 对应的definition...获取最后的jsp
}

【8】使用参数动态加载jsp

tiles.xml示例如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
"http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>

<definition name="layout" template="/mainLayout.jsp">
</definition>

<definition name="myView" extends="layout">
<put-attribute name="A" value="/A.jsp" />
//指定固定jsp
<put-attribute name="item" expression="/${item}.jsp" />
// 根据参数动态加载jsp
</definition>

</tiles-definitions>