2009-11-20 19 views
5

J'utilise des tuiles Struts 1 avec succès, mais j'ai rencontré un problème en essayant d'imbriquer des tuiles.Struts Tiles 1 - problème de tuiles imbriquées

J'ai actuellement une mise en page comme ceci:

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

Je souhaite avoir un autre modèle comme celui-ci, pour une utilisation dans un bon nombre de pages de l'utilisateur:

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

Je souhaite étendre la première mise en page pour la mise en page de l'utilisateur. Dans les tuiles définiton J'utilise:

<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"/> 
    .... 

En user/layout.jsp je tente de montrer la tuile habituellement, en utilisant <tiles:get name="userContent"/>.

Et le problème est The requested resource (/WEB-INF/jsps/user/userContent) is not available

Répondre

0

J'ai trouvé quelques informations here

Cette solution a fonctionné pour moi.

Dans ce cas, vous avez généralement pour créer une nouvelle définition d'une extension existante, remplir l'attribut dans le modèle correct et attribuer la nouvelle définition comme un attribut au modèle principal.

En d'autres termes:

<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

Il a été longtemps depuis que je l'ai utilisé Struts Tiles, mais ne devrait pas vous utiliser <tiles:insert> au lieu de <tiles:get>?

C'est, quelque chose comme:

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

Merci, mais pas de chance, j'ai peur. J'utilise la même méthode exactement dans la mise en page de base. – Pool

+0

Vous ne savez pas exactement ce que vous entendez par "même méthode". Avez-vous essayé le ci-dessus? Recevez-vous toujours la même erreur que vous avez publiée? J'ai regardé un de mes anciens projets qui a une configuration très similaire à ce que vous avez décrit et '' est ce qui est utilisé tout au long. – ChssPly76

+0

L'erreur, lorsqu'elle était modifiée, était différente: 'ServletException dans '/WEB-INF/jsps/user/layout.jsp': Erreur - Insertion de balise: Aucune valeur trouvée pour l'attribut 'userContent'.' J'utilise des carreaux avec succès ailleurs mais je niche eux semblent être le problème. http://www.mail-archive.com/[email protected]/msg24378.html a un problème similaire avec une solution postée (que je n'arrive pas à utiliser). – Pool

0

I peut voir à partir de votre question que vous utilisez des noms différents pour l'attribut content. C'est content pour user.layout et userContent pour user.page. Pouvez-vous essayer d'utiliser le même nom pour cet attribut content ou userContent?

Espérons que cela aide.

Mise à jour. Il s'agit de solutions de piratage rapide. Vous pouvez utiliser l'attribut ignore défini sur true pour les tiles: get operation. Il ira en silence quand aucun userContent défini.

Mais je pense que c'est quelque chose qui ne va pas avec les définitions de carreaux.

Le message d'erreur suggère que vous essayez d'utiliser une vignette qui n'est pas définie. J'ai compilé un exemple lorsque .user.layout est une extension de . La différence entre deux est une partie du corps.

<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

Salut, merci pour votre réponse. C'était délibéré, le contenu et userContent coexistaient sur une page, le userContent étant la sous-page sur le contenu. Le problème était que les définitions ne tombaient pas en cascade (j'ai répondu ci-dessous mais je ne peux pas marquer comme résolu plus tard.) – Pool

3

Il existe un cleaner solution.

Une autre approche consiste à utiliser uniquement une définition (plus la définition defaultLayout) dans le fichier tiles-def.xml.

tuiles-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> 

L'inconvénient de cette approche est que layout.jsp doit connaître la liste des arguments possibles pour (any) la page body.jsp.