2009-11-20 8 views
5

Estoy usando Struts tiles 1 con éxito, sin embargo, he encontrado un problema al intentar anidar fichas.Struts Tiles 1 - problema de mosaicos anidados

actualmente tienen un diseño de este modo:

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

Deseo tener otra plantilla como esta, para su uso en un buen número de páginas de usuario:

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

Por lo tanto, desea extender el primer diseño para el diseño del usuario. En los azulejos definiton estoy usando:

<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 intento mostrar la baldosa por lo general, el uso de <tiles:get name="userContent"/>.

Y el problema es The requested resource (/WEB-INF/jsps/user/userContent) is not available

Respuesta

0

me encontré con algo de información de here

Esta solución funcionó para mí.

En este caso, por lo general usted tiene para crear una nueva definición que se extiende de uno existente, llenar el atributo en la plantilla correcta y asignar la nueva definición como un atributo a la plantilla principal.

En otras palabras:

<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

Ha sido un largo tiempo desde que he usado Struts Tiles, pero no se debería estar utilizando en lugar de <tiles:insert><tiles:get>?

Es decir, algo así como:

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

Gracias, pero no tengo suerte, me temo. Estoy usando el mismo método exactamente en el diseño base. – Pool

+0

No estoy seguro de lo que quiere decir con "mismo método". ¿Has probado lo de arriba? ¿Sigues recibiendo el mismo error que has publicado? He visto uno de mis proyectos antiguos que tiene una configuración muy similar a la que describió y '' es lo que se está utilizando en todo momento. – ChssPly76

+0

El error, cuando se modificó fue diferente: 'ServletException in '/WEB-INF/jsps/user/layout.jsp': Error - Insertar etiqueta: no se encontró ningún valor para el atributo 'userContent'. Estoy utilizando cuadros con éxito en otro lugar pero anidando ellos parecen ser el problema. http://www.mail-archive.com/[email protected]/msg24378.html tiene un problema similar con una solución publicada (que no puedo ponerme a trabajar). – Pool

0

I como se puede ver en su pregunta se utilizan diferentes nombres para el atributo de contenido. Es content para user.layout y userContent para user.page.

¿Puedes intentar usar el mismo nombre para ese atributo ya sea content o userContent?

Espero que esto ayude.

Actualización. Esto es soluciones rápidas de hackeo. Puede usar el atributo ignorar establecido en verdadero para los mosaicos: obtener operación. Se irá en silencio cuando no se definió userContent.

Pero creo que esto es algo malo con las definiciones de los mosaicos.

El mensaje de error sugiere que está intentando utilizar mosaico que no está definido. Recopilé un ejemplo cuando .user.layout es una extensión de . La diferencia entre dos es una parte del cuerpo.

<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

Hola, gracias por tu respuesta. Eso fue deliberado, el contenido y el contenido del usuario coexistieron en una página, siendo UserContent la subpágina del contenido. El problema era que las definiciones no funcionaban en cascada (respondí a continuación pero no puedo marcar como resuelto hasta más tarde). – Pool

3

Hay un cleaner solution.

Otro enfoque es usar solo una definición (más la definición predeterminada de Layout) en el archivo tiles-def.xml.

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

La desventaja de este enfoque es que layout.jsp debe conocer la lista de posibles argumentos para (cualquier) página body.jsp.