Struts Tiles 1 - verschachtelte Fliesen Ausgabe
Frage
Ich bin mit Struts Fliesen 1 erfolgreich, aber ich habe ein Problem entdeckt, wenn nisten Fliesen versuchen.
Im Moment habe ich ein Layout wie folgt:
Ich möchte eine andere Vorlage wie diese haben, für den Einsatz in ganz wenigen Benutzerseiten:
So möchte ich das erste Layout für den Anwender das Layout erweitern. In den Fliesen definiton Ich bin mit:
<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"/>
....
In user/layout.jsp
ich versuche, in der Regel die Fliese zu zeigen, <tiles:get name="userContent"/>
verwendet wird.
Und das Problem ist The requested resource (/WEB-INF/jsps/user/userContent) is not available
Lösung 3
fand ich einige Informationen von hier
Diese Lösung für mich gearbeitet.
In diesem Fall in der Regel haben Sie eine neue Definition erstellen verlauf aus einem vorhandenen, füllen Sie den Attribut in der richtigen Vorlage und weisen Sie die neue Definition als Attribut auf die Hauptvorlage.
Mit anderen Worten:
<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>
Andere Tipps
Es gibt eine sauberere Lösung .
Ein weiterer Ansatz ist nur eine Definition zu verwenden (plus die defaultlayout Definition) in der Fliesen-def.xml Datei.
Fliesen-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>
Der Nachteil dieses Ansatzes ist, dass layout.jsp die Liste der möglichen Argumente wissen müssen (any) body.jsp Seite.
Es ist schon lange eine Weile her, seit ich verwendet habe, Struts Tiles, aber sollten Sie nicht verwenden <tiles:insert>
statt <tiles:get>
Das heißt, so etwas wie:
<tiles:insert attribute="userContent" flush="false"/>
Ich kann aus Ihrer Frage sehen Sie verschiedene Namen für den Inhalt Attribut verwenden. Es ist content
für user.layout und userContent
für user.page.
Können Sie versuchen, den gleichen Namen entweder content
oder userContent
für dieses Attribut zu verwenden?
Hope, das hilft.
Aktualisieren. Dies ist eine schnelle Hack-Lösungen. Sie können für Fliesen-Attribut auf true eingestellt ignorieren verwenden: Operation erhalten. Es wird still gehen, wenn kein userContent definiert.
Aber ich denke, das ist etwas nicht in Ordnung ist mit Fliesen Definitionen.
Die Fehlermeldung deutet darauf hin, dass Sie versuchen, Ziegel zu verwenden, die nicht definiert ist. Ich ein Beispiel kompiliert, wenn .user.layout
eine Erweiterung von .basic.layout
ist. Der Unterschied zwischen beiden ist ein Körperteil.
<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>