5

我成功地使用了 Struts 瓦片 1,但是在尝试嵌套瓦片时遇到了问题。

我目前有这样的布局:

我希望有另一个这样的模板,用于相当多的用户页面:

所以我希望为用户布局扩展第一个布局。在我使用的瓷砖定义中:

<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

4 回答 4

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>

布局.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">

编辑体.jsp

<table>
   <tr>
      <td><tiles:insert attribute="a"/></td>
      <td><tiles:insert attribute="b"/></td>
   </tr>
</table>

这种方法的缺点是 layout.jsp 必须知道(任何)body.jsp 页面的可能参数列表。

于 2014-01-22T02:21:01.503 回答
0

从您的问题中可以看出,您对内容属性使用了不同的名称。它content适用于 user.layout 和userContentuser.page。

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

希望这可以帮助。

更新。 这是快速破解解决方案。您可以使用设置为 true 的忽略属性来进行 tiles:get 操作。当没有定义 userContent 时,它将静默运行。

但我认为这是瓷砖定义的问题。

错误消息表明您正在尝试使用未定义的磁贴。我编译了一个示例 when.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>
于 2009-11-21T20:37:45.500 回答
0

自从我使用 Struts Tiles 以来已经有很长一段时间了,但是您不应该使用 Struts Tiles 来<tiles:insert>代替<tiles:get>吗?

也就是说,类似:

<tiles:insert attribute="userContent" flush="false"/>
于 2009-11-20T21:23:33.920 回答
0

我从这里找到了一些信息

这个解决方案对我有用。

在这种情况下,通常您必须创建一个从现有定义扩展的新定义,将属性填充到正确的模板中,并将新定义作为属性分配给主模板。

换句话说:

<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>
于 2009-11-21T12:53:20.523 回答