2013-02-23 68 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定義中定義它。