2009-11-20 4 views
5

Я использую плитки Struts 1 успешно, однако я столкнулся с проблемой при попытке вложить плитки.Struts Tiles 1 - проблема с вложенными плитами

Я в настоящее время макет так:

http://i49.tinypic.com/jhuemc.jpg

Я хотел бы иметь другой шаблон, как это, для использования в очень немногих страницах пользователей:

http://i46.tinypic.com/14o4mk3.jpg

Я хотите расширить первый макет для макета пользователя. В плитки Definiton я использую:

<definition name=".basic.layout" path="/WEB-INF/jsps/basicLayout.jsp"> 
    .... 

<definition name=".user.layout" extends=".basic.layout"> 
    <put name="content" value="/WEB-INF/jsps/user/layout.jsp"/> 
    .... 

<definition name=".user.page" extends=".user.layout"> 
    <put name="userContent" value="/WEB-INF/jsps/user/page.jsp"/> 
    .... 

В user/layout.jsp я попытаюсь показать плитку обычно, используя <tiles:get name="userContent"/>.

И проблема The requested resource (/WEB-INF/jsps/user/userContent) is not available

ответ

0

Я нашел некоторую информацию из here

Это решение работал для меня.

В этом случае, как правило, у вас есть создать новое определение простирающегося из существующей, заполнить атрибут в правильном шаблоне и назначить новое определение в качестве атрибута главного шаблону.

Другими словами:

<definition name="product.nav" template="/productNavLayout.jsp">  
    <put-attribute name="productPathNav" value="/productPathNav.jsp" />  
    <put-attribute name="productNav" value="/productNav.jsp" /> 
</definition> 

<definition name="product.nav.extended" extends="product.nav">  
    <put-attribute name="productContent" value="product.grid" /> 
</definition> 

<definition name="page.products" extends="layout"> 
    <put-attribute name="content" value="product.nav.extended" /> 
</definition> 
0

Это было долгое время, так как я использовал Struts Tiles, но не вы должны использовать <tiles:insert> вместо <tiles:get>?

То есть, что-то вроде:

<tiles:insert attribute="userContent" flush="false"/> 
+0

Спасибо, но не повезло, я боюсь. Я использую тот же метод точно в базовом макете. – Pool

+0

Не уверен, что вы подразумеваете под «тем же методом». Вы пробовали это? Вы по-прежнему получаете ту же ошибку, что и вы опубликовали? Я рассмотрел один из моих старых проектов, который имеет очень похожую настройку на то, что вы описали, и '<плитки: insert attribute =" XXX "/>' - это то, что используется повсюду. – ChssPly76

+0

Ошибка при изменении была другой: 'ServletException в '/WEB-INF/jsps/user/layout.jsp': Ошибка - вставка тега: не найдено значения для атрибута 'userContent'.' Я использую плитки успешно в другом месте, но вложенность они кажутся проблемой. http://www.mail-archive.com/[email protected]/msg24378.html имеет аналогичную проблему с размещенным решением (что я не могу работать). – Pool

0

Я, как видно из вашего вопроса вы используете разные имена для атрибута контента. Это content для user.layout и userContent для user.page.

Можете ли вы попытаться использовать одно и то же имя для этого атрибута либо content, либо userContent?

Надеюсь, это поможет.

Обновление. Это быстрые решения для взлома. Вы можете использовать атрибут ignore для true для плит: get operation. Он отключится, когда не будет определен userContent.

Но я думаю, что это неправильно с определениями плиток.

Сообщение об ошибке предполагает, что вы пытаетесь использовать плитку, которая не определена. Я составил пример, когда .user.layout является расширением . Разница между двумя - это часть тела.

<definition name=".basic.layout" path="/WEB-INF/jsps/basicLayout.jsp"> 
    <put name="header" value="/WEB-INF/jsps/header.jsp"/> 
    <put name="content" value="/WEB-INF/jsps/basicLayout.jsp"/> 
    <put name="footer" value="/WEB-INF/jsps/footer.jsp"/> 
</definition> 

<!-- extending content part of basic layout --> 
<definition name=".user.content" value="/WEB-INF/jsps/user/layout.jsp"> 
    <put name="userContent" value="/WEB-INF/jsps/user/page.jsp"/> 
</definition> 

<!-- defining new layout --> 
<definition name=".user.layout" extends=".basic.layout"> 
    <put name="content" value=".user.content"/> 
</defnition> 

<definition name=".user.page" extends=".user.layout"> 
    <put name="userContent" value="/WEB-INF/jsps/page.jsp"/> 
</definition> 

<definition name=".user.info" extends=".user.layout"> 
    <put name="userContent" value="/WEB-INF/jsps/userInfo.jsp"/> 
</definition> 

<definition name=".other.page" extends=".basic.layout"> 
    <put name="content" value="/WEB-INF/jsps/other.jsp"/> 
</definition> 
+0

Привет, спасибо за ваш ответ. Это было преднамеренно, контент и userContent сосуществовали на странице, а userContent - подстраница к контенту. Проблема заключалась в том, что определения не каскадировались (я ответил ниже, но не могу пометить как разрешенные до более позднего времени). – Pool

3

Существует cleaner solution.

Другим подходом является использование только одного определения (плюс определение по умолчанию) в файле tiles-def.xml.

плитки-def.xml:

<definition name="defaultLayout" template="/WEB-INF/layout.jsp"> 
    <put name="header" value="/WEB-INF/header.jsp" /> 
    <!-- definitions based on this layout must define "body" --> 
    <put name="footer" value="/WEB-INF/footer.jsp" /> 
</definition> 

<definition name="editPage" extends="defaultLayout"> 
    <put name="body" value="/WEB-INF/editBody.jsp" /> 
    <put name="a" value="/WEB-INF/a.jsp" /> 
    <put name="b" value="/WEB-INF/b.jsp" /> 
</definition> 

layout.jsp:

<tiles:insert attribute="header"> 
    <tiles:insert attribute="body" > 
     <!-- propogate "a" and "b" down to the next level --> 
     <tiles:put name="a" beanName="a"/> 
     <tiles:put name="b" beanName="b"/> 
    </tiles:insert> 
<tiles:insert attribute="footer"> 

editBody.jsp:

<table> 
    <tr> 
     <td><tiles:insert attribute="a"/></td> 
     <td><tiles:insert attribute="b"/></td> 
    </tr> 
</table> 

Недостатком этот подход заключается в том, что layout.jsp должен знать список возможных аргументов (любой) body.jsp-страницы.

Смежные вопросы