我成功使用Struts tile 1,但是在尝试嵌套tile时遇到了问题。
我目前有这样的布局:
http://i49.tinypic.com/jhuemc.jpg
我希望有另一个这样的模板,用于很多用户页面:
http://i46.tinypic.com/14o4mk3.jpg
所以我希望扩展用户布局的第一个布局。在我定义的瓷砖定义中:
<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
答案 0 :(得分:3)
另一种方法是在 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必须知道(任何)body.jsp页面的可能参数列表。
答案 1 :(得分:0)
自从我使用Struts Tiles已经有很长一段时间了,但您不应该使用<tiles:insert>
代替<tiles:get>
吗?
就是这样:
<tiles:insert attribute="userContent" flush="false"/>
答案 2 :(得分:0)
我从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>
答案 3 :(得分:0)
我从您的问题中可以看出,您为内容属性使用了不同的名称。 user.layout为content
,user.page为userContent
。
您是否可以尝试为该属性使用相同的名称content
或userContent
?
希望这有帮助。
<强>更新强> 这是快速入侵的解决方案。您可以对tiles使用ignore属性设置为true:get操作。当没有定义userContent时,它将静默运行。
但我认为这是瓷砖定义的错误。
错误消息表明您正在尝试使用未定义的磁贴。当.user.layout
是.basic.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>