Tiles,瓷砖,就像Windows8的磁贴一样,多个瓷砖构成了整个UI页面。它是一个免费开源的模板框架,基于组合模式来简化UI界面的开发。对于复杂的网站来说,它可以简单优雅地结合MVC技术一起工作。
配置:
1.引入相应的依赖文件
在Maven中添加完整依赖:
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>${tiles.version}</version>
</dependency>
如果是Struts,由于其集成了Tiles可以直接启用。具体怎么启用就不关心了,Struts基本都被SpringMVC取代了。
注意,Tiles3.X需要JDK6.0及以上,Servlet2.5及以上,JSP2.1及以上。
2.配置Tiles
在WEB-INF/spring-servlet.xml中进行配置:
<!-- Tiles相关配置 -->
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>classpath:tiles/tiles.xml</value>
</list>
</property>
<property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles3.SpringBeanPreparerFactory" />
</bean>
<!-- Tiles视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
</bean>
3.使用
tiles.xml文件对页面进行定义并添加默认属性,不进行HTML布局,只是配置好逻辑名和逻辑页面包含关系。
<?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="baseTemplate">
<put-attribute name="title" value="" />
<put-attribute name="header" value="/tiles-template/header.jsp" />
<put-attribute name="navigator" value="/tiles-template/navigator.jsp" />
<put-attribute name="body" value="" />
<put-attribute name="footer" value="/tiles-template/footer.jsp" />
</definition>
<definition name="mainSimpleTemplate" template="/tiles-template/layoutSimple.jsp" extends="baseTemplate" ></definition>
<definition name="mainTemplate" template="/tiles-template/layout.jsp" extends="baseTemplate" ></definition>
<!-- User -->
<definition name="login" extends="mainSimpleTemplate">
<put-attribute name="title" value="登录" />
<put-attribute name="body" value="/jsp/user/login.jsp" />
</definition>
</tiles-definitions>
当然,并不是每个页面都需要definition定义,可以使用通配符,正则表达式,甚至jsp el、MVEL、OGNL等进行描述。
layoutSimple.jsp文件才是真正的模板布局文件:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title><tiles:insertAttribute name="title" ignore="true" /></title>
</head>
<body>
<div id="body_ccontainer">
<tiles:insertAttribute name="body" />
</div>
<tiles:insertAttribute name="footer" />
</body>
模板布局中,可以不插入任何属性,但如果要insertAttribute,属性必须要已经定义好(像上面的body和footer属性),否则会出错。
然后login.jsp只需要书写登录的元素即可。
----------------------------------------华丽的分割线----------------------------------------
那什么是属性(Attribute)呢?
一个attribute就是模板中的空缺(或称占位符),需要你在应用中填充它,一个attribute可以是一下三种类型:
string: 直接渲染的字符串。
template: 一个模板。可以没有属性,如果有属性,必须要填充好,以便渲染页面。
definition: 可重用的组合页面。其全部或部分属性已经填充好。
那什么是定义(Definition)呢?
一个definition就是展现给最终用户的构图,本质上就是模板和其全部或部分填充好的属性的组合。
如果该定义的属性已经完全填充好,就可以直接渲染页面了。如果有些属性没填充,它可以作为抽象定义以供其它定义继承重写,或者没填充的定义将在运行时填充。
视图准备者(View Preparers)
有时候一个definition在渲染之前需要“预处理”。例如,显示一个menu时,menu的结构必须在request范围内进行创建和存储。
为了达到“预处理 ”,View Preparers将在渲染definition之前被调用,因此所有需要正确渲染definition的东西都将被准备。
创建View Preparers:只需要实现ViewPreparer接口即可,也可以继承ViewPreparerSupport类以免ViewPreparer接口改变出现编译问题。其中的execute方法将在渲染definition之前执行。
为definition关联View Preparers:只需为definition元素的preparer属性指定类的完整路径名即可。如:
<definition name="preparer.definition" preparer="org.apache.tiles.test.preparer.TestViewPreparer">
<put-attribute name="foo" value="/bar/foo.jsp" />
</definition>