apache瓷砖模板里面另一个模板

时间:2013-02-23 01:46:05

标签: templates java-ee tiles

我为所有页面都有一个“t.base”视图定义:

<definition name="t.base" template="/WEB-INF/tiles/base.jsp">
    <put-attribute name="title" value="SomeTitle"/>
</definition>

它的主要属性是body,必须在每个子模板中定义。现在我想在主页上有一个滑块,它将直接放入正文(与屏幕一样宽):

<definition name="t.homepage" extends="t.base">
    <put-attribute name="body" value="/WEB-INF/jsp/homepage.jsp"/>
    <put-attribute name="title" expression="lyricsBase : home of lyrics"/>
</definition>

所有其余的页面都必须放在HTML容器中(添加一些CSS样式),不要让它像屏幕一样宽(边距等)。我希望此容器模板“覆盖”body tile attibute:

<div class="container marketing">
    <div class="container">
        <tiles:insertAttribute name="body" />
    </div>
</div>

容器HTML标记内的子视图示例:

<definition name="t.jukebox" extends="t.base">
    <put-attribute name="body">
        <definition template="/WEB-INF/tiles/container.jsp">
            <put-attribute name="body" value="/WEB-INF/jsp/jukebox.jsp" />
        </definition>
    </put-attribute>
    <put-attribute name="title" expression="${jukebox.name} - lyricsBase"/>
</definition>

无论如何,这看起来不太好,我希望有一个更好的解决方案,可以减少配置大小,并给出完全相同的效果。我正在尝试对此容器进行定义:

<definition name="t.container" extends="t.base">
    <put-attribute name="body" value="/WEB-INF/tiles/container.jsp"/>
</definition>

将由子模板使用。但我不知道如何配置它。

换句话说,我希望在所有级别上使用相同的属性名称来实现Russian Matrioszka dolls之类的内容。只是覆盖属性。我习惯了decorator模式,这个composite view对我来说仍然是抽象的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以使用定义继承,其中t.homepage将是t.container的扩展名,t.container将是t.base的扩展名。 甚至更多 - 您可以在body属性内部创建另一个插槽并在子节点定义中定义它。