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"/>
我是从你的问题看你用的内容属性不同的名称。 user.layout为content
,user.page为userContent
。
您可以尝试使用该属性的相同名称:content
或userContent
?
希望这会有所帮助。
更新。 这是快速入侵解决方案。您可以使用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>
嗨,谢谢你的回答。这是故意的,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页面的可能参数列表。
谢谢,但没有运气,恐怕。我在基本布局中完全使用相同的方法。 – Pool 2009-11-20 22:55:09
不确定你的意思是“相同的方法”。你有没有尝试过以上?您是否仍然收到与您发布的相同的错误?我看过我的一个旧项目,它与您所描述的设置非常相似,并且''是整个过程中使用的。 –
ChssPly76
2009-11-20 23:02:17
错误,当改变是不同的:'/WEB-INF/jsps/user/layout.jsp'中的ServletException:错误 - 标记插入:找不到属性'userContent'的值。我在其他地方成功地使用了瓷砖,但嵌套他们似乎是问题所在。 http://www.mail-archive.com/[email protected]/msg24378.html与发布的解决方案有类似的问题(我无法工作)。 – Pool 2009-11-21 11:58:10