Tiles框架

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值