认识Tiles

最近在做东西,要求使用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了。


 

 







posted @ 2017-11-07 20:12  十禾。  阅读(297)  评论(0编辑  收藏  举报