Struts瓷砖1 - 嵌套瓷砖问题

问题描述:

我正在使用Struts瓷砖1成功,但是我试图嵌套瓷砖时遇到了问题。Struts瓷砖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

我发现从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> 

这是一个很长一段时间,因为我使用Struts的瓷砖,但你不应该使用<tiles:insert>代替<tiles:get>

也就是说,这样的:

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

谢谢,但没有运气,恐怕。我在基本布局中完全使用相同的方法。 – Pool 2009-11-20 22:55:09

+0

不确定你的意思是“相同的方法”。你有没有尝试过以上?您是否仍然收到与您发布的相同的错误?我看过我的一个旧项目,它与您所描述的设置非常相似,并且''是整个过程中使用的。 – ChssPly76 2009-11-20 23:02:17

+0

错误,当改变是不同的:'/WEB-INF/jsps/user/layout.jsp'中的ServletException:错误 - 标记插入:找不到属性'userContent'的值。我在其他地方成功地使用了瓷砖,但嵌套他们似乎是问题所在。 http://www.mail-archive.com/[email protected]/msg24378.html与发布的解决方案有类似的问题(我无法工作)。 – Pool 2009-11-21 11:58:10

我是从你的问题看你用的内容属性不同的名称。 user.layout为content,user.page为userContent

您可以尝试使用该属性的相同名称:contentuserContent

希望这会有所帮助。

更新。 这是快速入侵解决方案。您可以使用tile属性的ignore属性设置为true:get操作。当没有定义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

嗨,谢谢你的回答。这是故意的,content和userContent共存于一个页面上,userContent是内容的子页面。问题在于它的定义并没有级联(我在下面回答,但我不能标记为解决,直到后来。) – Pool 2009-11-21 21:29:26

有一个cleaner solution

另一种方法是只使用tiles-def.xml文件中的一个定义(加上defaultLayout定义)。

瓦片-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必须知道(any)body.jsp页面的可能参数列表。