2013-02-23 65 views
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瓷砖attibute:容器HTML标签内

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

举例子视图:

<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

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