我为所有页面都有一个“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
对我来说仍然是抽象的。任何帮助将不胜感激。
答案 0 :(得分:0)
您可以使用定义继承,其中t.homepage
将是t.container
的扩展名,t.container
将是t.base的扩展名。
甚至更多 - 您可以在body属性内部创建另一个插槽并在子节点定义中定义它。