Tiles —— 瓷砖
别笑,它真的就是这个意思,Tiles框架描述的就是,每一个页面可以分割成不同的部分,就好像瓷砖一样,可以进行拼接,达到展示不同效果的目的。
Tiles简介
一般情况下,Tiles包含如下几个部分
看这个布局就能大概理解一下:
Header——头部
Menu——菜单
Body——主题内容
Footer——尾部
那么Tiles是如何起到刚才提到的拼接作用的呢?
比如我们的Body中有一个链接可以跳转到另一个Body中,那么就可以这么实现
可以看到,出了Body部分有所变动,其他位置没有任何改变,这就是Tiles的神奇之处,我们可以只改变页面中的局部,而不用新建一个页面,包含着大量重复的部分。
所以Tiles实现的就是所谓的——页面复用
我们看一个小demo,来看一下Tiles是如何起效的吧。
小demo
项目结构图
这里直说关键内容。
先看spring-web.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:annotation-config/>
<!-- 扫描service包下所有使用注解的类型 -->
<context:component-scan base-package="com.yubotao.controller"/>
<!-- 2.静态资源默认servlet配置,将静态请求转由web容器处理
(1)加入对静态资源的处理:js,gif,png
(2)允许使用"/"做整体映射
-->
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<!--<mvc:resources mapping="" location=""/>-->
<!-- 3.配置jsp 显示ViewResolver ,根据前后缀获取view物理文件路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!--对tiles配置进行解析-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.tiles3.TilesView</value>
</property>
<property name="order" value="1"/>
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles.xml</value>
</list>
</property>
</bean>
</beans>
整个Tiles的请求流程和访问jsp很类似,不过这里差别就在视图渲染那里,对于jsp起效的是
<!-- 3.配置jsp 显示ViewResolver ,根据前后缀获取view物理文件路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
而访问Tiles布局起效的部分是
<!--对tiles配置进行解析-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.tiles3.TilesView</value>
</property>
<property name="order" value="1"/>
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles.xml</value>
</list>
</property>
</bean>
这里我们使用TilesConfigurer
类对tiles布局的文件进行了定位,也就是我们配置的tiles布局文件tiles.xml
。
这里有这么个类UrlBasedViewResolver
,它其实是InternalResourceViewResolver
的父类,在jsp渲染器中,相当于
UrlBasedViewResolver
使用了InternalResourceViewResolver
作为缺省的view对象,然后进行视图渲染,如果理解这个过程,那么tiles部分的也就很好理解了。
UrlBasedViewResolver
将TilesView
作为相应的view对象进行渲染,所以我们才能够使用对应的tiles布局进行展示。
web.xml
这个文件没什么改动,依旧是以DispatcherServlet
作为前置处理器即可。
然后我们看到我们之前在spring-web.xml
文件中定义了一个tiles的布局文件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="base.definition" >
<put-attribute name="title" value="Real Title"/>
<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=""/>
<put-attribute name="footer" value="/WEB-INF/jsp/footer.jsp"/>
</definition>
<definition name="tiles1" extends="base.definition" template="/WEB-INF/jsp/base1.jsp">
<put-attribute name="title" value="IIIIIIIII~Index"/>
<put-attribute name="body" value="/WEB-INF/jsp/body1.jsp"/>
</definition>
<definition name="tiles2" extends="base.definition" template="/WEB-INF/jsp/base2.jsp">
<put-attribute name="title" value="Indexxxxxxxxx~"/>
<put-attribute name="body" value="/WEB-INF/jsp/body2.jsp"/>
</definition>
</tiles-definitions>
我们可以看到该配置文件中涉及的标签只有一个<definition>
布局标签。
我们看到第一个<definition>
布局块是基础块,下面的两个都使用了extends
继承了该布局块,如果没有覆盖相关内容的话,就默认使用基础块中的内容;然后另外一个关键字template
表示目标布局,比如这里我在tiles1布局中,将目标布局设为base1.jsp
,那我就可以直接在base1.jsp
中使用tiles标签以及定义好的tiles1布局。
最后总结下来,配置tiles的关键是在spring-web.xml
中配置tiles view的专门的视图解析器,然后要配置tiles布局文件,在该文件中配置对应的布局信息,然后需要注意的一点是,在继承了基础布局的tiles布局还需要有一个目标jsp页面承载这个布局内容。
一个包冲突问题
原来,是Spring包和tiles包有冲突
tiles2支持的是Spring的3-4之间的包
而tiles3才支持Spring4以上的
成果展示
先看我们的body1
再看body2
我们看一下如果tiles和jsp混用的时候,是有如下报错的