Tiles与SpringMVC整合应用实践

Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离,支持EL,OGNL,MVEL等进行动态解析。

它用模板定义网页布局,每个页面模板都是一个简单的 JSP 页,它定义了一些由占位符(也可以指定具体jsp)组成的外形,以放置内容。执行时,Tiles 将会用相应的内容来替换占位符,因此,创建整个页面即形成布局。

Tiles框架是建立在JSP的include指令基础上的,但它提供了比JSP的include指令更强大的功能。

Tiles的方法体是用来创建版面布局,可复用部分等的,而Tiles的插入操作是用来插入Tiles的。同一个Tiles可以在同一个站点甚至同一个页面被重用多次。

Tiles的插入可以与一个在Tiles中称作“definition”的逻辑名联系起来。一个Tiles的definition包含一个逻辑名,一个主体页面和一些属性值。definition的声明并不插入与其相关联的Tiles方法体,它只是让Tiles与它的逻辑名关联起来。可以在任何能够插入Tiles地方运用定义的逻辑名,这样与其对应的Tiles及其属性就被插入进来了。


Tiles框架具有如下特性:

1.创建可重用的模板
2.动态构建和装载页面
3.定义可重用的Tiles组件
4.支持国际化。


【1】Tiles的definitions

Tiles的definition包含一个带有Tiles URL的逻辑名和一些属性值。定义并不插入Tiles,插入是在后来用definition的名字来完成的。

一个definition的逻辑名可以在站点中使用多次,实现对Tiles的轻松复用。 Tiles的definition可以继承自另外一个definition,并且能够重载其属性或者添加属性。这使得通过一些属性来构造不同的definition变得更加容易。

比如,你可以定义一个“父类”的definition同时定义主要的 header, menu, footer, 和一个默认的 title。然后令你的每一个页面的definitions继承自这个“父类”的definition并重载title和body属性。

Tiles的definitions的定义可以在JSP页面中进行,也可以在一个或者多个中心控制文件中进行。为了使中心控制文件中定义的definitions有效,你需要初始化“定义池”(definitions factory),这个定义池能够解释文件中的definitions并把它们提供给Tiles框架。


【2】Tiles需要的jar

可以在Apache主页下载tiles需要的jar:tiles需要的jar

如果项目是maven,请使用如下配置:

  • 这里使用的是3.0.7版本。
	<dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-core</artifactId>
      <version>3.0.7</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-api</artifactId>
      <version>3.0.7</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.tiles</groupId>
      <artifactId>tiles-jsp</artifactId>
      <version>3.0.7</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.7</version>
  </dependency>
  <dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-servlet</artifactId>
    <version>3.0.7</version>
  </dependency>
 <!--servlet 包 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

【3】Tiles需要的监听器

	<!-- tiles监听器,默认配置文件在/WEB-INF/tiles*.xml-->
     <listener>
         <listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
     </listener>

也可以通过继承SimpleTilesListener 自定义监听器。


如果与Struts结合,需要配置插件org.apache.struts.tiles.TilesPlugin。该篇学习SpringMVC下使用tiles框架。


【4】springmvc.xml

SpringMVC只需要进行如下配置,并不需要在web.xml配置监听器。

<!-- 定义tiles视图解析器 -->
    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass">
            <value>org.springframework.web.servlet.view.tiles3.TilesView</value>
        </property>
    </bean>

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles.xml</value>
            </list>
        </property>
        <property name="preparerFactoryClass">  
			           value="org.springframework.web.servlet.view.tiles3.SpringBeanPreparerFactory" 
		</property>
    </bean>

springmvc默认会加载/WEB-INF/tiles.xml,故上面不定义definitions属性也可以:

/**
	 * Set the Tiles definitions, i.e. the list of files containing the definitions.
	 * Default is "/WEB-INF/tiles.xml".
	 */
	public void setDefinitions(String... definitions) {
		this.definitions = definitions;
	}

【5】tiles.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.definition" template="/WEB-INF/jsp/main.jsp">
	    // 定义模板
        <put-attribute name="title" value="测试tiles" />
        <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="" />
    </definition>

	//继承了基础模板布局,注意罗继明welcome哦
    <definition name="welcome" extends="base.definition">
        <put-attribute name="title" value="主页" />
	       //放入属性body值
        <put-attribute name="body" value="/WEB-INF/jsp/welcome.jsp" />
    </definition>

</tiles-definitions>

这里写图片描述


【6】模板文件main.jsp如下:

<body>
<div id="wrapper">
    <nav class="navbar navbar-default navbar-fixed-top" role="navigation">
	    // 插入属性(其实就是放入参数),可以不设置值
        <tiles:insertAttribute name="header" ignore="true"/>
        <tiles:insertAttribute name="menu" ignore="true"/>
    </nav>
    <div id="tilesBody" style="margin-top: 50px">
        <tiles:insertAttribute name="body" ignore="true"/>
    </div>
</div>
</body>

【7】测试controller

	 //进入welcome页面
    @RequestMapping(path = "/welcome")
    public String welcome() {
        return "welcome";
        //根据该逻辑名,找到tiles.xml中 对应的definition...获取最后的jsp
    }

【8】使用参数动态加载jsp

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="layout" template="/mainLayout.jsp">
	</definition>

	 <definition name="myView" extends="layout">
		<put-attribute name="A" value="/A.jsp" />
		//指定固定jsp
		<put-attribute name="item" expression="/${item}.jsp" />	
		// 根据参数动态加载jsp
	 </definition>

</tiles-definitions>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流烟默

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值