zoukankan      html  css  js  c++  java
  • Tiles入门及项目实战

    1.Apache Tiles™


      Apache Tiles是一个模板布局框架。最初是为了简化Web应用界面开发,如今已不限于JavaEE Web环境。

      Tiles允许开发人员定义页面片段,它们在运行时会组装成一个完整的页面。这些片段,或者叫“瓷砖”(tiles本意即瓷砖),被其他页面引入以减少公共元素的重复定义,或者嵌入另一个tiles以组成一系列可重用的模板。


    2.关于复合视图模式(Composite View Pattern)


    Composite View Pattern

      不少网站都有这样的特点:大部分页面遵循着相同的结构和布局。Composite View Pattern就是这种情况的典型应用场景。请看下图,两个网页有着相似的结构,只是body部分随情况改变,然而这确实需要绘制两个页面,这和使用frameset刷新其中一个子frame是不同的。


     


    Composite View Pattern与Decorator pattern


      Tiles是一个Composite View框架,它允许在整个应用重用页面片段。另一种能实现相同效果的办法是使用Decorator pattern((页面)装饰模式),例如Sitemesh就是基于装饰模式的。不同于Composite View创建模板并动态组装页面片段,Decorator pattern利用一个HTML页面添加各个(页眉、页脚、菜单...)部分以呈现界面。你可以通过下表看到他们之间的使用差别:


    哪些方面 Composite View Decorator
    可重用性 页面的不同部分(模板和片段)能够在整个应用重用 每个装饰器都能被重用,但是同一时间装饰器本身只能应用于一个页面
    配置简便性 每个页面都必须显式定义 装饰器甚至能够应用于整个应用
    运行时配置 页面能在运行时配置、组装 由于页面装饰一次,没有此特性
    性能 组装开销很低 被装饰的页面必须被解析


    3.几个概念


      Tiles实现了复合视图模式(Composite View Pattern),为了实现这个模式Tiles添加了几个自己的概念:Template(模板)、Attribute(属性)、Definition(定义)。


    Template


      即页面布局,页面的各个部分由Attribute填充。(Template可以没有Attribute)

      举个栗子,考虑下图的经典风格布局:

     

      一个模板(Template)页面的代码可能类似下面这样:

    <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
    <table>
      <tr>
        <td colspan="2">
          <tiles:insertAttribute name="header" />
        </td>
      </tr>
      <tr>
        <td>
          <tiles:insertAttribute name="menu" />
        </td>
        <td>
          <tiles:insertAttribute name="body" />
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <tiles:insertAttribute name="footer" />
        </td>
      </tr>
    </table>

    Attribute


     Attribute就是页面上那些待填充的空白部分,它允许以下三种类型:

        ● string:页面直接呈现的内容。

        ● template:一个可能包含Attribute的模板,如果包含则必须填充Attribute以呈现页面。

        ● definition:一个可重用的页面部分,其中部分或全部的Attribute已被填充。


    Definition


      Definition是最终要展现给用户的部分,其实就是一个Attribute完全或部分填充的Template。

        ● 如果Attribute已完全填充,它就可以展现给用户。

        ● 如果还有尚未填充的Attribute,这被称作抽象定义(abstract definition),它可以被其他Definition继承以实现布局复用,或者也可以在运行时填充这些Attribute。

      就拿上面的经典布局风格举个栗子(注意页面中insertAttribute的name属性与definition中put-attribute的name属性的对应关系):

    <definition name="myapp.homepage" template="/layouts/classic.jsp">
      <put-attribute name="header" value="/tiles/banner.jsp" />
      <put-attribute name="menu" value="/tiles/common_menu.jsp" />
      <put-attribute name="body" value="/tiles/home_body.jsp" />
      <put-attribute name="footer" value="/tiles/credits.jsp" />
    </definition>


    4.在maven中添加Tiles依赖(以Tiles 3.0.5版本为例)


      Tiles是一个Web应用包,曾经和Struts捆绑使用,如今已独立出来,目前最常用的情形是基于servlet的web应用。

      你需要具备以下环境才能保证Tiles正常使用:JDK1.6或更高版本,Servlet2.5

      简单起见,仅仅你的pom.xml加入以下内容就可以使用Tiles的所有特性了(入门的话不需要再往下看配置了):

    <dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-extras</artifactId>
      <version>3.0.5</version>
    </dependency>


      如果你不打算使用所有特性,基本的仅支持servlet的依赖如下:

    <dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-servlet</artifactId>
      <version>3.0.5</version>
    </dependency>


      如果你还想加入JSP支持,继续添加:

    <dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-jsp</artifactId>
      <version>3.0.5</version>
    </dependency>


    5.SpringMVC集成Tiles


      Spring 3.2.x支持2.1.2及以上版本的Tiles,如果你使用Spring 4请集成Tiles 3.0.x及更高版本。


    配置


    配置TilesConfigurer以加载Tiles定义文件


      WebApplicationContext初始化时,下面的定义文件被加载并且定义工厂(DefinitionsFactory)被实例化。

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <!-- Tiles2:<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"> -->
        <property name="definitions">
            <list>
                <!-- <value>classpath:tiles/tiles-template.xml</value> -->
                <value>/WEB-INF/defs/general.xml</value>
                <value>/WEB-INF/defs/widgets.xml</value>
                <value>/WEB-INF/defs/administrator.xml</value>
                <value>/WEB-INF/defs/customer.xml</value>
                <value>/WEB-INF/defs/templates.xml</value>
            </list>
        </property>
    </bean>


      至此已经可以在Spring Web工程中作为view使用了,和使用Spring的其它视图技术一样,我们还需要一个视图解析器(ViewResolver)。我们可以使用支持解析多种视图的ResourceBundleViewResolver(参见:http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/view.html#view-tiles),简单起见,我们使用UrlBasedViewResolver:

    <!-- 配置方式一(UrlBasedViewResolver将会实例化给定的viewClass) -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
        <!-- Tiles2:<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/> -->
    </bean>
    <!-- 配置方式二 -->
    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">
    <!-- Tiles2:<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles2.TilesViewResolver"> -->


    如果打算使用Tiles的高级特性,看这里!


      如果你打算使用Tiles的某些高级特性,像运行时构建视图(Runtime Composition)、更复杂的通配符支持(Wildcard support)之类,启用方式有两种:

      方式一:springMVC集成Tiles3情形下很合适:

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    	<property name="definitions">
    		<list>
    			<value>/WEB-INF/config/tiles.xml</value>
    			<value>/WEB-INF/config/tiles-adf.xml</value>
    		</list>
    	</property>
    	
    	<!-- Specify whether to apply Tiles 3.0's "complete-autoload" configuration. -->
    	<property name="completeAutoload" value="true" />
    </bean>


      方式二:在web.xml中配置监听器:

    <listener>
    	<listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
    </listener>


    6.项目实战


      SpringMVC整合Tiles3,基于Maven构建,Bootstarp做前台页面呈现尽管做的相对简陋。菜单可以切换两种布局方式(用继承以及覆盖解释如何换汤不换药),当然,还有点彩蛋 ==


      下面的项目实战我们也用到了通配符以简化定义,在普通的springMVC集成Tiles工程里通配符的使用可能类似下面这样:

    <definition name="tiles/*" extends="base.definition">
    	<!-- {1}:通配符方式简化定义 -->
    	<put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/>
    </definition>


      然而,当我们用springMVC整合Tiles时在springMVC配置文件中启用了complete-autoload导致通配符的使用方式需要做些改进(配置监听器的方式不会出现此问题):

    <definition name="WILDCARD:tiles/*" extends="base.definition">
    	<!-- {1}:通配符方式简化定义 -->
    	<put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/>
    </definition>


    还有点说明


      文章并没有解释Tiles的高级特性部分,但是部分应用已经体现在下面的项目中了,比如定义的继承、Runtime Composition、通配符、EL支持...


    下载地址:tiles3-springmvc.rar








    今天很残酷,明天更残酷,后天很美好
  • 相关阅读:
    SQL基本操作(工作中够用了)
    用Ajax爬取今日头条图片集
    (完整)爬取数据存储之TXT、JSON、CSV存储
    (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括
    基础爬虫,谁学谁会,用requests、正则表达式爬取豆瓣Top250电影数据!
    正则表达式功能概括
    常用的os库笔记
    软件测试阶段
    Python接口自动化测试(一)什么是接口?
    界面和易用性测试
  • 原文地址:https://www.cnblogs.com/thinking-better/p/5327347.html
Copyright © 2011-2022 走看看