Составление макета Apache Tiles 2 из множества шаблонов - PullRequest
3 голосов
/ 07 февраля 2011

Я создаю веб-приложение с помощью Spring 3 и Tiles 2.2. Я поместил следующее определение макета:

<tiles-definitions>  
<definition name="default" template="/WEB-INF/layouts/default.jspx">  
<put-attribute name="header" value="main.header" />  
<put-attribute name="top_menu" value="/WEB-INF/views/top_menu.jspx" />  
<put-attribute name="left_column" value="main2.left_column" />  
<put-attribute name="main_column" value="main2.main_column" />  
<put-attribute name="footer" value="/WEB-INF/views/footer.jspx" />  
</definition> 

<definition name="main2.main_column" template="/WEB-INF/layouts/double_column/main_column.jspx">  
</definition>

<definition name="main2.left_column" template="/WEB-INF/layouts/left_column.jspx">  
        <put-attribute name="profile_menu" value="/WEB-INF/views/userprofile/userdetails.jspx" />  
        <put-attribute name="common_menu" value="/WEB-INF/views/menu.jspx" />  
      </definition>  
</tiles-definitions>

В WEB-INF / layouts / default.jspx

<div id="main_page" >   
    <tiles:insertAttribute name="left_column"/>    
    <tiles:insertAttribute name="main_column"/>   
        <div id="footer" >  
<tiles:insertAttribute name="footer" ignore="true"/>  
                </div>  
            </div>  

Теперь в /WEB-INF/layouts/double_column/main_column.jspx у меня есть:

<tiles:insertAttribute name="body"/>  

Запрошенный путь view.xml определяется следующим образом:

<tiles-definitions>  
    <definition extends="default" name="secure/createAccount/*">  
        <put-attribute name="body" value="/WEB-INF/views/secure/createAccount/{1}.jspx"/>  
    </definition>  
</tiles-definitions>

и ошибка:

org.apache.tiles.template.NoSuchAttributeException: Attribute 'body' not found.
    org.apache.tiles.template.DefaultAttributeResolver.computeAttribute(DefaultAttributeResolver.java:49)
    org.apache.tiles.template.InsertAttributeModel.resolveAttribute(InsertAttributeModel.java:187)
    org.apache.tiles.template.InsertAttributeModel.start(InsertAttributeModel.java:107)
    org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:306)
    org.apache.jsp.WEB_002dINF.layouts.double_005fcolumn.main_005fcolumn_jspx._jspx_meth_tiles_005finsertAttribute_005f0(main_005fcolumn_jspx.java:79)
    org.apache.jsp.WEB_002dINF.layouts.double_005fcolumn.main_005fcolumn_jspx._jspService(main_005fcolumn_jspx.java:54)

Если я помещаю «тело» непосредственно в шаблон по умолчанию, это работает, но я хочу, чтобы кирпичи шаблонов можно было многократно использовать во многих макетах, а не только по умолчанию, и я не хочу копировать все форматирование в каждое определение шаблона с помощью main_column

Пожалуйста, совет

Ответы [ 2 ]

3 голосов
/ 21 ноября 2011

Как говорит исключение, определение main_column не имеет атрибута body.Ваше второе определение говорит, что это ваше корневое определение, а не main_column.По умолчанию не существует такой вещи, как наследование атрибутов или пузыри.Следовательно, дети ничего не знают об атрибутах своих родителей и наоборот.Это два решения вашей проблемы:

Вы можете добавить атрибут cascade="true" к определению вашего атрибута.Это позволяет атрибуту каскадно обращаться к дочерним определениям (см. каскадные атрибуты )

Вы можете использовать вложенные определения:

<tiles-definitions>  
  <definition extends="default" name="secure/createAccount/*">  
    <put-attribute name="main_column">
      <definition template="/WEB-INF/layouts/double_column/main_column.jspx">
        <put-attribute name="body" value="/WEB-INF/views/secure/createAccount/{1}.jspx"/>  
      </definition>
    </put-attribute>
  </definition>  
</tiles-definitions>

(см. определения вложенности )

2 голосов
/ 23 ноября 2012

Может быть, вы указываете страницу baselayout.jsp в welcomepagelist в web.xml. если вы указали это, удалите его и отправьте фиктивный запрос в класс действий, а затем перешлите ваш ответ на некоторый jsp, который объявлен в файле tile.xml

...