认识Tiles

来源:互联网 发布:网络风暴检测工具 编辑:程序博客网 时间:2024/06/14 09:06

最近在做东西,要求使用Tiles框架。就简单总结了一下。

一、什么是Tiles框架?

             Tiles 是一种JSP布局框架,主要目的是为了将复杂的jsp页面作为一个的页面的部分机能,然后用来组合成一个最终表示用页面用的,这样的话,便于对页面的各个机能的变更及维护。

二、为什么使用Tiles框架

         你可能觉得,Tiles跟jsp:include标签一样的作用。当然,Tiles实现了jsp:include的功能,但是我认为它比jsp:include更灵活。使用Tiles大大提高了视图层程序代码的可重用性、可扩展性和可维护性。但也增加了视图创建的难度,所以,建议Tiles应用于有一定规模的网页制作。

三、具体使用。

初步准备:由于本人使用的spring ,先在配置文件中定义如下:

    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver">        <property name="order" value="1"></property>    </bean>    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">        <property name="definitions">            <list>                <value>/layout/layout.xml</value>            </list>        </property>    </bean>

value指定了接下来使用的layout.xml的位置。order设置了优先级(数字越小优先级越高),springmvc配置文件中有多个视图解析器,优先级高的视图解析器会优先调用。

(1)   对于一个超级简单的页面,会由三部分组成。header,body,footer。

      而很多的页面公用header与footer,这时候,就可以将这两者摘出来,放在单独的jsp文件中,在body.jsp的地方引用这两者,这通过jsp:include可以实现。

       那个Tiles框架又如何实现这种功能呢?

     首先:需要创建一个layout.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="/jsp/mainLayout.jsp">    </definition>     <definition name="myView" extends="layout">//这是使用的继承,也可以直接使用上面的template。        <put-attribute name="header" expression="/jsp/header.jsp" />         <put-attribute name="body" expression="/jsp/body.jsp"></put-attribute>        <put-attribute name="footer" expression="/jsp/footer.jsp"/>    </definition>

</tiles-definitions>

这里面定义的内容相当于定义了默认模板。它引用了footer.jsp,body.jsp与header.jsp.

具体的mainLayout.jsp,定义了基本的网页布局。注意,这些头不可少。

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %><%@ taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %><%@ taglib prefix="title" uri="http://tiles.apache.org/tags-tiles" %><div><tiles:insertAttribute name="header"></tiles:insertAttribute><tiles:insertAttribute name="body"></tiles:insertAttribute><title:insertAttribute name="footer"></title:insertAttribute></div>

这样,网页的显示就是header,body,footer组合在一起的内容了。

具体访问方式。

    @RequestMapping("/test")    public String test(Model model){        model.addAttribute("body","other");        return "myView";    }

访问的对象为定义的模板的名称。


2)如果其他的页面想使用mainLayout.jsp布局,比如在other.jsp,可以这样写。

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %><%@ taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %><%@ taglib prefix="title" uri="http://tiles.apache.org/tags-tiles" %>
<tiles:insertDefinition name="myView"> <tiles:putAttribute name="body"> others </tiles:putAttribute> </tiles:insertDefinition>

其中,如果name对应的模板内的内容被重新修改,会覆盖原来的内容。如果不修改就会保持模板初始的内容。

访问:

    @RequestMapping("/test")    public String test(Model model){        model.addAttribute("body","other");        return "other";    }
访问的是other.jsp,不再是模板的名称。

这样,访问的结果会有

header.jsp  other.jsp  footer.jsp组合在一起的内容

3)tiles的强大的地方,假设10w个页面使用同样的布局,如果按照jsp:include的形式,每个页面都需要引入(那得累死)。

但是通过tiles,可以简化这个操作。

首先,在layout.xml中如下定义

     <definition name="myView" extends="layout">        <put-attribute name="header" expression="/jsp/header.jsp" />         <put-attribute name="body" expression="/jsp/${body}.jsp"></put-attribute>        <put-attribute name="footer" expression="/jsp/footer.jsp"/>    </definition>

注意,body的内容,这时候使用类似于el表达式的形式,

    public String test(Model model){        model.addAttribute("body","other");        return "myView";    }

对应的后台的代码,其中body名称与layout.xml的body一致。添加名称为other,返回值为定义的模板的名称myView,这样,当访问的时候,body的内容就相当于访问的/jsp/other.jsp了。就算有10w+的页面,也不用每一个都写jsp:include了。




 
原创粉丝点击