在Tiles中嵌套模板,为什么在包含的模板中未定义属性?

时间:2010-10-27 14:06:07

标签: apache jsp tiles2

我在我的网络应用程序中使用Tiles 2,而我在tiles.xml文件中的基本设置是:

<tiles-definitions>
    <definition name="mainLayout" template="/jsp/layout.jsp">
        <put-attribute name="header" value=""/>
        <put-attribute name="menu" value="/jsp/defaultMenu.jsp" />
        <put-attribute name="content" value="" />
        <put-attribute name="footer" value="/jsp/footer.jsp" />
    </definition>

    <definition name="HomePage" extends="mainLayout">
        <put-attribute name="content" type="template" value="/jsp/home.jsp"/>
        <put-attribute name="homeClass" value="active" />
    </definition>

    ... rest omitted for brevity.

在定义布局的layout.jsp中,我将菜单包含在适当的位置。

<tiles:insertAttribute name="menu" />

所以,然后在我的菜单模板中,我想使用tiles.xml中定义的homeClass属性。

<tiles:insertAttribute name='homeClass'/>

但是我收到有关未定义homeClass属性的错误。如果我在layout.jsp中执行insertAttribute,则值被正确定义,但我需要在菜单JSP中定义它,包含在我的布局中。

所以,我的问题是:如何才能将homeClass属性正确传递给我的布局模板,而不是布局模板中包含的菜单模板?< / p>

2 个答案:

答案 0 :(得分:3)

我相信您可以使用嵌套模板定义:

<definition name="mainLayout" template="/jsp/layout.jsp">
        <put-attribute name="header" value=""/>

        <put-attribute name="menu">
            <definition template="/jsp/defaultMenu.jsp">
                <put-attribute name="homeClass" value="active"/>
            </definition>
         </put-attribute>

        <put-attribute name="content" value="" />
        <put-attribute name="footer" value="/jsp/footer.jsp" />
    </definition>

答案 1 :(得分:3)

使用嵌套模板定义(因为不写)是答案。您需要DTD版本&gt; = 2.1才能使用 见Nesting Apache Tiles Template