当前位置: 首页 > 工具软件 > Tile Menu > 使用案例 >

apache-tile学习入门

洪浩
2023-12-01

第一部分:简单的入门案例

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tile_exercise</groupId>
    <artifactId>tile_exercise</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <jdk.version>1.8</jdk.version>
        <spring.version>4.3.4.RELEASE</spring.version>
        <freemarker.version>2.3.23</freemarker.version>
        <servletapi.version>3.1.0</servletapi.version>
        <org.slf4j.version>1.7.21</org.slf4j.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${org.slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${org.slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>


        <!-- compile only, deployed container will provide this -->
        <!-- Need this for config annotation -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servletapi.version}</version>
            <!-- scope>provided</scope -->
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}</version>
        </dependency>




        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </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-freemarker</artifactId>
            <version>3.0.7</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <!--scope>runtime</scope-->
        </dependency>



    </dependencies>
</project>

1、仅使用jsp+tile+springmvc的配置

第一步:web.xml配置

        <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springMVC-servlet-jsp.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>

第二步:resources文件夹下新建springMVC-servlet-jsp.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.2.xsd
        http://www.springframework.org/schema/aop  
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
    <mvc:annotation-driven/>

    <context:component-scan base-package="com.exercise.controller"/>

    <bean id="tileViewResolver" 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/jsp/tiles-defs.xml</value><!--这里用来加载配置文件,可以有多个-->
            </list>
        </property>
    </bean>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

第三步:webapp下新建文件夹jsp-tiles,其中分别新建四个文件

banner.jsp内容为
     banner
common_menu.jsp内容为
    common_menu.jsp
credits.jsp内容为
    credits.jsp
home_body.jsp内容为
     home_body.jsp

第四步:WEB-INF文件夹下新建jsp文件夹,其中分别新建三个文件

index2.jsp(这个页面用于显示)内容为
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
    <tiles:insertDefinition name="myapp.index.homepage" /><!--这里的名称要与 tiles-defs.xml中使用布局文件的definition的name的值一致-->
layout.jsp(这个页面用于布局)内容为
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
    <table>
        <tr>
            <td colspan="2">
                <!--这里的name的值与tiles-difis.xml文件中的值put-attribute的name的值相同-->
                <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>
tiles-defs.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="myapp.homepage" >
            <put-attribute name="title" value="Tiles tutorial homepage" />
            <!--这里个人理解为用一个名称来对应需要加载的页面-->
            <put-attribute name="header" value="/jsp-tiles/banner.jsp" />
            <put-attribute name="menu" value="/jsp-tiles/common_menu.jsp" />
            <put-attribute name="footer" value="/jsp-tiles/credits.jsp" />
        </definition>
        <!--这里使用了一个继承关系,并且在这里使用了布局文件,extends的值为需要继承definition的name的值-->
    <definition name="myapp.index.homepage" extends="myapp.homepage" template="/WEB-INF/jsp/layout.jsp">
            <put-attribute name="body" value="/jsp-tiles/home_body.jsp" />
        </definition>
    </tiles-definitions>

2、使用jsp+ftl+tile+springmvc,方法一的配置

第一步:web.xml配置 (只是与第一个引入的springmvc的配置文件不一样)

      <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springMVC-servlet-jsp-flt.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>

第二步:resources文件夹下新建springMVC-servlet-jsp-ftl.xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/aop  
            http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
        <!-- step 1 -->
        <mvc:annotation-driven/>

        <context:component-scan base-package="com.exercise.controller"/>
        <bean id="freemarkerConfigurer"
              class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="templateLoaderPath" value="WEB-INF/jsp-ftl/" />
            <property name="freemarkerSettings">
                <props>
                    <prop key="defaultEncoding">UTF-8</prop>
                    <prop key="template_update_delay">0</prop>
                    <prop key="locale">zh_CN</prop>
                    <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                    <prop key="time_format">HH:mm:ss</prop>
                    <prop key="number_format">0.######</prop>
                </props>
            </property>
        </bean>

        <!-- FreeMarker视图解析 如返回userinfo。。在这里配置后缀名ftl和视图解析器。。 -->
        <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
            <property name="viewClass"
                      value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" />
            <property name="suffix" value=".ftl"/>
            <property name="contentType" value="text/html;charset=UTF-8" />
            <property name="exposeRequestAttributes" value="true" />
            <property name="exposeSessionAttributes" value="true" />
            <property name="exposeSpringMacroHelpers" value="true" />
            <property name="requestContextAttribute" value="request" />
        </bean>

        <bean id="tileViewResolver" 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="tilesInitializer">
                <bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer.SpringCompleteAutoloadTilesInitializer"/>
            </property>

            <property name="definitions">
                <list>
                    <value>/WEB-INF/jsp-ftl/tiles-defs1.xml</value>
                </list>
            </property>
        </bean>
    </beans>

第三步:webapp下新建文件夹jsp-ftl-tiles,其中分别新建五个文件

banner1.ftl内容为
     jsp-ftl-banner.ftl
common_menu1.ftl内容为
    jsp-ftl-common_menu.ftl
credits1.ftl内容为
    jsp-ftl-home_body.ftl
home_body1.ftl内容为
     jsp-ftl-credits.ftl
left.jsp内容为
     left.jsp

第四步:WEB-INF文件夹下新建jsp-ftl文件夹,其中分别新建三个文件

index3.ftl(这个页面用于显示)内容为
   <#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>
  <@tiles.insertDefinition name="myapp.jsp.ftl.homepage" />
layout2.jsp(这个页面用于布局)内容为
   <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
    <table>
        <tr>
            <td colspan="2">
                <tiles:insertAttribute name="header1" />
            </td>
        </tr>
        <tr>
            <td>
                <tiles:insertAttribute name="menu1" />
            </td>
            <td>
                <tiles:insertAttribute name="body1" />
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <tiles:insertAttribute name="footer1" />
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <tiles:insertAttribute name="left" />
            </td>
        </tr>
    </table>
tiles-defs1.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="myapp.jsp.ftl.homepage" template="/WEB-INF/jsp-ftl/layout2.jsp" >
            <put-attribute name="header1" value="/jsp-ftl-tiles/banner1.ftl" />
            <put-attribute name="menu1" value="/jsp-ftl-tiles/common_menu1.ftl"    />
            <put-attribute name="footer1" value="/jsp-ftl-tiles/credits1.ftl"   />
            <put-attribute name="body1" value="/jsp-ftl-tiles/home_body1.ftl"   />
            <put-attribute name="left" value="/jsp-ftl-tiles/left.jsp"   />
        </definition>
    </tiles-definitions>

3、使用jsp+ftl+tile+springmvc,方法二的配置

这里只是修改web.xml和springMVC-servlet-jsp-ftl.xml文件,其他同方法一。

第一步:在web.xml文件中添加

        <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

        <!-- FreemarkerServlet settings: -->
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>

第二步:在springMVC-servlet-jsp-ftl.xml文件中删除(这里不删也可以)

    <property name="tilesInitializer">
        <bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer.SpringCompleteAutoloadTilesInitializer"/>
    </property>

4、使用ftl+tile+springmvc的配置

第一步:web.xml配置 (只是与第三个引入的springmvc的配置文件不一样)

<servlet>
        <servlet-name>springMVC</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC-servlet-ftl.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springMVC</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--layout为ftl时的解决方案,添加以下配置-->
    <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

        <!-- FreemarkerServlet settings: -->
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>

第二步:resources文件夹下新建springMVC-servlet-ftl.xml配置(与第三个的springmvc的配置文件只是引入的tile定义配置文件不同)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-4.2.xsd
            http://www.springframework.org/schema/aop  
            http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
        <!-- step 1 -->
        <mvc:annotation-driven/>

        <context:component-scan base-package="com.exercise.controller"/>



        <bean id="tileViewResolver" 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/ftl/tiles-defs4.xml</value>
                </list>
            </property>

        </bean>

        <bean id="freemarkerConfigurer"
              class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
            <property name="templateLoaderPath" value="WEB-INF/ftl/" />
            <property name="freemarkerSettings">
                <props>
                    <prop key="defaultEncoding">UTF-8</prop>
                    <prop key="template_update_delay">0</prop>
                    <prop key="locale">zh_CN</prop>
                    <prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
                    <prop key="time_format">HH:mm:ss</prop>
                    <prop key="number_format">0.######</prop>
                </props>
            </property>
        </bean>

        <!-- FreeMarker视图解析 如返回userinfo。。在这里配置后缀名ftl和视图解析器。。 -->
        <bean id="freeMarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">

            <property name="suffix" value=".ftl"/>
            <property name="contentType" value="text/html;charset=UTF-8" />
            <property name="exposeRequestAttributes" value="true" />
            <property name="exposeSessionAttributes" value="true" />
            <property name="exposeSpringMacroHelpers" value="true" />
            <property name="requestContextAttribute" value="request" />
            <property name="order" value="2"/>
        </bean>
    </beans>

第三步:webapp下新建文件夹ftl-tiles,其中分别新建五个文件

banner4.ftl内容为
     ftl-banner.ftl
common_menu4.ftl内容为
        ftl-common_menu.ftl
credits4.ftl内容为
    ftl-home_body.ftl
home_body4.ftl内容为
     ftl-credits.ftl

第四步:WEB-INF文件夹下新建jsp-ftl文件夹,其中分别新建三个文件

index4.ftl(这个页面用于显示)内容为
   <#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>

    <@tiles.insertDefinition name="myapp.ftl.homepage" />
layout4.ftl(这个页面用于布局)内容为
    <#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>
    <table>
        <tr>
            <td colspan="2">
                <@tiles.insertAttribute name="header4" />
            </td>
        </tr>
        <tr>
            <td>
                <@tiles.insertAttribute name="menu4" />
            </td>
            <td>
                <@tiles.insertAttribute name="body4" />
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <@tiles.insertAttribute name="footer4" />
            </td>
        </tr>
    </table>
tiles-defs4.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="myapp.ftl.homepage" template="/WEB-INF/ftl/layout4.ftl" >
            <put-attribute name="header4" value="/ftl-tiles/banner4.ftl"  />
            <put-attribute name="menu4" value="/ftl-tiles/common_menu4.ftl"   />
            <put-attribute name="footer4" value="/ftl-tiles/credits4.ftl"   />
            <put-attribute name="body4" value="/ftl-tiles/home_body4.ftl"  />
        </definition>
    </tiles-definitions>

结论

如果要使用freemarker来展示页面,那么只需要在web.xml文件中添加一下配置即可满足使用freemarker的条件,其除jsp与freemarker在使用tile时有所不同外,其他暂无区别。

<servlet>
            <servlet-name>freemarker</servlet-name>
            <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

            <!-- FreemarkerServlet settings: -->
            <init-param>
                <param-name>TemplatePath</param-name>
                <param-value>/</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>freemarker</servlet-name>
            <url-pattern>*.ftl</url-pattern>
        </servlet-mapping>

思考

多个页面如何使用统一的布局,并提取相同的部分达到复用,并使不同的页面能够显示自己的内容?

第二部分:多个页面使用同一个布局进行展示

1、初级版本

第一步:使用第一部分第四个建立的工程。

第二步:在ftl-tiles文件夹下新建

home_body5.ftl内容为

    ftl-home_body5.ftl

第三步:修改ftl文件夹下index4.ftl文件

<#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>

<@tiles.insertDefinition name="myapp.index4.page" />

第四步:ftl文件夹下新建index5.ftl文件

<#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>

<@tiles.insertDefinition name="myapp.index5.page" />

第五步:修改tiles-defs4.xml文件

    <tiles-definitions>
    <definition name="myapp.ftl.homepage"  >
        <put-attribute name="header4" value="/ftl-tiles/banner4.ftl"  />
        <put-attribute name="menu4" value="/ftl-tiles/common_menu4.ftl"   />
        <put-attribute name="footer4" value="/ftl-tiles/credits4.ftl"   />
    </definition>
    <definition name="myapp.index4.page" extends="myapp.ftl.homepage" template="/WEB-INF/ftl/layout4.ftl">
        <put-attribute name="body4" value="/ftl-tiles/home_body4.ftl"  />
    </definition>
    <definition name="myapp.index5.page" extends="myapp.ftl.homepage" template="/WEB-INF/ftl/layout4.ftl">
        <put-attribute name="body4" value="/ftl-tiles/home_body5.ftl"  />
    </definition>
</tiles-definitions>

结论

通过以上方法可以实现多个页面使用统一的布局格式,并将公共部分提取出来。

思考

如果有100个甚至更多的页面使用同一个布局,那么在tiles的配置文件中,难道要写100个甚至更多个definition来继承公共部分并使用同一个布局?

2、升级版本(通配符的使用)

第一步:使用初级版本进行改造

第二步:修改tiles-defs4.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="myapp.ftl.homepage"  >
        <put-attribute name="header4" value="/ftl-tiles/banner4.ftl"  />
        <put-attribute name="menu4" value="/ftl-tiles/common_menu4.ftl"   />
        <put-attribute name="footer4" value="/ftl-tiles/credits4.ftl"   />
    </definition>
    <!--<definition name="myapp.index4.page" extends="myapp.ftl.homepage" template="/WEB-INF/ftl/layout4.ftl">-->
        <!--<put-attribute name="body4" value="/ftl-tiles/home_body4.ftl"  />-->
    <!--</definition>-->
    <!--<definition name="myapp.index5.page" extends="myapp.ftl.homepage" template="/WEB-INF/ftl/layout4.ftl">-->
        <!--<put-attribute name="body4" value="/ftl-tiles/home_body5.ftl"  />-->
    <!--</definition>-->
    <!--使用下边的配置来代替上边注释掉的配置,注意不同之处-->
    <definition name="myapp.index*.page" extends="myapp.ftl.homepage" template="/WEB-INF/ftl/layout4.ftl">
        <put-attribute name="body4" value="/ftl-tiles/home_body{1}.ftl"  />
    </definition>
</tiles-definitions>

结论

通过该方法实现了同一个definition配置,来实现对多个页面的管理。但是引用这个definition和body文件的命名需要有一个很好的统一的规范。

思考

现在有多个index页面来实现对不同内容的展示,那么能否有一个统一的入口呢?

3、版本再升级(使用一个index页面,一个controller入口)

第一步:在升级版本(即2)上进一步开发。

第二步:在controller中添加

            @RequestMapping("/index/{num}")
        public Object getIndexByNum(@PathVariable("num")String num, ModelMap map){
            map.put("num",num);
            return "index";
        }

第三步:在ftl文件夹下新建index.ftl文件

    <#assign tiles=JspTaglibs["http://tiles.apache.org/tags-tiles"]>

    <@tiles.insertDefinition name="myapp.index${num!''}.page" />

结论

通过同一个入口完成页面的切换,要求具有一个统一的命名规范。

第三部分:问题总结

1、中文乱码问题

web.xml中配置
          <servlet>
    <servlet-name>freemarker</servlet-name>
    <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

    <!-- FreemarkerServlet settings: -->
    <init-param>
      <param-name>TemplatePath</param-name>
      <param-value>/</param-value>
    </init-param>
    <init-param>
      <param-name>DefaultEncoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
 类似资料: