【转】 Struts之tiles的使用

Struts之tiles的使用

今天偶尔在网上看到一篇使用tiles的文章,觉得写的不错,拿来贴给大家:

tile英文意思是瓦片,tiles就是一堆瓦片。比如有个系统,顶端是快捷键,左边是导航条,下边是copyright。按基本的html写法,会导致大量的重复编码,增加开发和维护成本。tiles框架就是为创建web页面提供了一种模板机制,它将网页的布局和内容分开。它允许先创建模板,然后在运行时动态地将内容插入到模板中。我们可以将这个blog系统分成4个独立的jsp,导航条,快捷建,copyright和主要内容。然后把他们组合起来,这样减少了很多重复代码,降低了耦合度。

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

我们将该blog分成4块。

Sidebar.jsp

Header.jsp

Content.jsp

Footer.jsp

准备工作:

1./WEB-INF/lib下应该有如下jar包:

  • struts.jar
  • commons-digester.jar
  • commons-beanutils.jar
  • commons-collections.jar
  • commons-logging.jar

2./WEB-INF下应该有struts-tiles.tld(tiles标签库定义文件)

3.在web.xml中配置:

<taglib>

    <taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri>

    <taglib-location>/WEB-INF/struts-tiles.tld</taglib-location>

</taglib>

开动:

header.jsp

<font size="6">This is a header</font>

<hr>

footer.jsp

<hr>

<font size="6">This is a footer</font>

sidebar.jsp

<%@ page contentType="text/html;charset="UTF-8""%>

<table>

    <tr>

        <td>

            <a href="/spaces/content1.jsp">Content1</a><br>

            <a href="/spaces/content2.jsp">Content2</a><br>

        </td>

    </tr>

</table>

content1.jsp, content2.jsp 随便写点什么了,我们主要是看如何用。

再写一个将这些jsp拼合的layout.jsp

<%@ page contentType="text/html;charset="UTF-8""%>

<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>

<table>

    <%-- Sidebar section --%>

    <tr>

        <td width="150" valign="top" align="left" bgcolor="#CCFFCC">

            <tiles:insert attribute="sidebar"/>

        </td>

        <%-- Main Content section --%>

        <td valign="top" height="100%" width="*">

            <table width="100%" height="100%">

                <tr>

                    <%-- Header Section --%>

                    <td height="15%">

                        <tiles:insert attribute="header"/>

                    </td>

                </tr>

                <tr>

                    <%-- Content Section --%>

                    <td valign="top" height="*">

                        <tiles:insert attribute="content"/>

                    </td>

                </tr>

                <tr>

                    <%-- Footer Section --%>

                    <td valign="bottom" height="15%">

                        <tiles:insert attribute="footer"/>

                    </td>

                </tr>

            </table>

        </td>

    </tr>

</table>

在layout.jsp中就定义好了web的格局,只是没插入具体内容。在<tiles:insert>标签中的attribute属性指定了待插入内容的逻辑名。

写一个content3.jsp

<%@ page contentType="text/html;charset="UTF-8""%>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>

<tiles:insert page="layout.jsp" flush="true">
    <tiles:put name="sidebar" value="/spaces/sidebar.jsp"/>
    <tiles:put name="header" value="header.jsp"/>
    <tiles:put name="content" value="/spaces/content1.jsp"/>
    <tiles:put name="footer" value="footer.jsp"/>
</tiles:insert>

运行content3.jsp就可以看到前面的示例图。

但这不是标准的用法,下面展示标准用法,在配置文件中制定jsp的组合,jsp只需要调用这些组合就行了。

写一个tiles-defs.xml,放到/WEB-INF目录下。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<tiles-definitions>
   
    <definition name="content1-definition" path="/layout.jsp">
        <put name="sidebar" value="/sidebar.jsp" />
        <put name="header" value="/header.jsp" />
        <put name="content" value="/content1.jsp" />
        <put name="footer" value="/footer.jsp" />
    </definition> 

    <definition name="content2-definition" path="/layout.jsp">
        <put name="sidebar" value="/sidebar.jsp" />
        <put name="header" value="/header.jsp" />
        <put name="content" value="/content2.jsp" />
        <put name="footer" value="/footer.jsp" />
    </definition> 

</tiles-definitions>

在tiles-defs.xml中我们定义了2种组合,content是content1.jsp或content2.jsp。

在struts配置文件struts-config.xml中配置TilesPlugin插件

<plug-in className="org.apache.struts.tiles.TilesPlugin">
    <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>
    <set-property property="moduleAware" value="true" />
    <set-property property="definitions-parser-validate" value="true" />
</plug-in>

写个content3.jsp

<%@ page contentType="text/html;charset="UTF-8""%>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<tiles:insert definition="content1-definition"/>

这和前面那个content3.jsp效果是一样的。或则还有更好的方法,通过struts action来调用tiles组件,在struts-config.xml中加上action映射。

<action-mappings>
        <action path="/content1"
                type="org.apache.struts.actions.ForwardActon"
                parameter="content1-definition">
        </action>
</action-mappings>

这样只要通过浏览器访问 http://localhost:8080/content1.do,请求转发到ForwardAction,再转到content1-definition的tiles组件,最后在浏览器端显示和前面content1.jsp一样的页面。调用content2-definition可以得到content是content2.jsp的页面。

Tiles组件的再组合

我们只是把页面分成4块,你有兴趣可以把sidebar,header,content或footer再分下去。比如将sidebar分为top和bottom两部分,content1-definition和content2-definition就可以调用sidebar-definition

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<tiles-definitions>
   
    <definition name="sidebar-definition" path="/sidebarlayout.jsp">
        <put name="top" value="/sidebartop.jsp" />
        <put name="bottom" value="/sidebarbottom.jsp" />
    </definition>     

    <definition name="content1-definition" path="/layout.jsp">
        <put name="sidebar" value="sidebar-definition" type="definition"/>
        <put name="header" value="/header.jsp" />
        <put name="content" value="/content1.jsp" />
        <put name="footer" value="/footer.jsp" />
    </definition> 
    <definition name="content2-definition" path="/layout.jsp">
        <put name="sidebar" value="sidebar-definition" type="definition"/>
        <put name="header" value="/header.jsp" />
        <put name="content" value="/content2.jsp" />
        <put name="footer" value="/footer.jsp" />
    </definition> 
</tiles-definitions>

为了提高definition的利用率,还可实现继承。如我们定义了base-definition,它定义了sidebar,header,content和footer的模板。content1-definition只需要继承它并重写(override)自己的content块。

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">
<tiles-definitions>
   
    <definition name="sidebar-definition" path="/sidebarlayout.jsp">
        <put name="top" value="/sidebartop.jsp" />
        <put name="bottom" value="/sidebarbottom.jsp" />
    </definition>     

    <definition name="base-definition" path="/layout.jsp">
        <put name="sidebar" value="sidebar-definition" type="definition"/>
        <put name="header" value="/header.jsp" />
        <put name="content" value="" />
        <put name="footer" value="/footer.jsp" />
    </definition>

    <definition name="content1-definition" extends="base-definition">
        <put name="content" value="/content1.jsp" />
    </definition> 

    <definition name="content2-definition" extends="base-definition">
        <put name="content" value="/content2.jsp" />
    </definition> 
</tiles-definitions>

这些就是tiles的大概用法,保证测试通过

文章引用自:http://www.classky.com/spaces/user1/martincsy/archives/2006/200692421139.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值