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>
【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>