0

我有一个所有页面的“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瓷砖属性:

<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>

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

换句话说,我想在所有级别上使用相同的属性名称来实现类似俄罗斯 Matrioszka 娃娃的效果。只是覆盖属性。我习惯了这种decorator模式,这composite view对我来说仍然是抽象的。任何帮助,将不胜感激。

4

1 回答 1

0

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

于 2013-08-11T02:59:08.457 回答