Struts Tiles 1 - 嵌套的tile问题

时间:2009-11-20 19:42:42

标签: java jsp struts tiles

我成功使用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

4 个答案:

答案 0 :(得分:3)

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必须知道(任何)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

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

希望这有帮助。

<强>更新 这是快速入侵的解决方案。您可以对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>