1.Tiles框架简介:
最早的Tiles是组装在Struts1.1里面的,主要目的是为了将复杂的jsp页面作为一个的页面的部分机能,然后用来组合成一个最终表示用页面用的,这样的话,便于对页面的各个机能的变更及维护。现在Tiles已经作为一个Apache独立的开源项目维护着。
所有的网站都有一些共通的东西:所有的网站都是有网页构成,而且它们彼此分享着共通的结构。这些页面有着共通的布局,但是页面和页面之间又有不同的地方,而且不同的地方通常都在同样的位置。
如下图所示
通常的来说一个页面大概可以划分为如下几块:
head页面头部:存放一个应用的公共信息:logo等,如果是网站可能是最上面的一块。
menu页面菜单:放置一个应用中需要使用的菜单,或者在每一个页面都使用的连接。
footer页面尾部:如版权信息等。
body页面主题内容:每个页面相对独立的内容。
我们的所有页面,按上面的划分,每一个页面我们只要写body里面的内容,其他的就可以共享重用。既然大多数页面的布局基本相同我们甚至可以使用一个jsp文件根据不同的参数调用不同的body,其余相同的部分直接重用即可。
当然,接触Java Web开发的人都知道,JSP中可以通过include标签动态插入一个JSP页面。在了解这个功能后可能会兴奋不已,因为这样可以实现多个JSP页面共用一个JSP的内容,但是在海量的jsp页面数量下,jsp页面的每个页面都需要声明,若要更改的话,更改的速度有时候真的赶不上老板页面变化的速度,而使用tiles这一框架,完全可以在老板话说完的时候就完成改动。
2.在spring中使用Tiles框架
jar包引入:
在引入jar包对手,我用了exclusion来排除tilesjar包和slf4j的冲突,如果你的不报错,请忽视这个,哈哈~
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.7</version>
<!--<exclusions>-->
<!--<exclusion>-->
<!--<artifactId>slf4j-api</artifactId>-->
<!--<groupId>org.slf4j</groupId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
核心的tiles的配置文件,tiles-defs.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-configuration" template="/WEB-INF/tiles/template.jsp">
<put-attribute name="title" value=""/>
<put-attribute name="body" value=""/>
<put-attribute name="header" value="/WEB-INF/tiles/header.jsp"/>
<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp"/>
<!--<put-attribute name="menu" value="/WEB-INF/tiles/menu.jsp"/>-->
</definition>
<!--home页-->
<definition name="homePage" extends="base-configuration">
<put-attribute name="title" value="/WEB-INF/jsp/titleHome.jsp"/>
<put-attribute name="body" value="/WEB-INF/jsp/bodyHome.jsp"/>
</definition>
</tiles-definitions>
说明:definition的标签,第一个定义了模板文件的格式和名字,别的页面的引用,是基于这个template.jsp
文件的;
声明的方式为 template="/WEB-INF/tiles/template.jsp(文件路径)",重用的元件jsp文件,如header,footer等都在这块声明,在别的页面引用的时候,如果没有声明覆盖,会自动使用模板的格式;
put-attribute标签,即为放入页面的jsp页面,值为路径;
第二个<definition>下的定义,是项目的页面定义名称和模板文件;extends="base-configuration" 即是声明该页面跨基于模板页面,如果有重写,就声明来进行覆盖;
覆盖方式为:在put-attribute标签中,声明同一名称,但是路劲为该项目的文件;
模板template.jsp页面,需要进行tiles的各组成部分的声明,代码如下:
<head>
<title>
<tiles:insertAttribute name="title"/>
</title>
</head>
<header>
<tiles:insertAttribute name="header" />
</header>
<main>
<tiles:insertAttribute name="body" />
</main>
<footer>
<tiles:insertAttribute name="footer"/>
</footer>
<tiles:insertAttribute>标签,即为声明这个部分需要去加载对应的jsp文件;
Tiles的xml文件加载和视图解析配置:
<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
<!--<property name="prefix" value="/WEB-INF/jsp/" />-->
<!--<property name="suffix" value=".jsp" />-->
<!--<property name="order" value="1"/>-->
<property name="order" value="1"/>
</bean>
<!--tiles的路径配置-->
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions" value="/WEB-INF/tiles.xml"/>
</bean>
说明:order属性,在程序中有多个视图处理器时,声明视图处理器的优先级,值越小,优先级越高;
使用tiles框架后,视图的加载顺序说明:
客户端在地址栏输入方法url后——到controller层寻找对应方法——进入方法中,返回对应视图名——到优先最高的tiles的视图解析器中寻找返回的homepage——在layout.xml中找到了继承自layout的homepage——将homepage对应的body放进主视图template.jsp中——处理对应的jsp,将其返回到浏览器,就是我们看到的页面。
如果日后有需要更改的页面,只需要把复用的模块改动一下,然后一下总体布局文件和相关配置就可以啦。大大减少了工作量。
Tiles框架温馨提示
当然,程序运行最怕的就是jar包冲突,而且tiles的jar包跟slf4j的冲突真的很明显;这个自己使用exclusion排除吧;