Tiles框架

来源:互联网 发布:strstr 数组 编辑:程序博客网 时间:2024/05/22 10:31

Tiles —— 瓷砖

别笑,它真的就是这个意思,Tiles框架描述的就是,每一个页面可以分割成不同的部分,就好像瓷砖一样,可以进行拼接,达到展示不同效果的目的。

Tiles简介

一般情况下,Tiles包含如下几个部分
这里写图片描述

看这个布局就能大概理解一下:
Header——头部
Menu——菜单
Body——主题内容
Footer——尾部

那么Tiles是如何起到刚才提到的拼接作用的呢?

比如我们的Body中有一个链接可以跳转到另一个Body中,那么就可以这么实现
这里写图片描述

可以看到,出了Body部分有所变动,其他位置没有任何改变,这就是Tiles的神奇之处,我们可以只改变页面中的局部,而不用新建一个页面,包含着大量重复的部分。

所以Tiles实现的就是所谓的——页面复用

我们看一个小demo,来看一下Tiles是如何起效的吧。

小demo

GitHub项目地址

项目结构图
这里写图片描述

这里直说关键内容。

先看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部分的也就很好理解了。

UrlBasedViewResolverTilesView作为相应的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混用的时候,是有如下报错的
这里写图片描述

所以这里最需要注意的就是,Controller接口中返回的String类型,对于tiles布局,返回的应该是对应的tiles配置文件中的布局名,如上面demo中的tiles1tiles2.

原创粉丝点击