Struts Tiles 1 - 嵌套Tiles问题

5

我正在成功使用Struts Tiles 1,但是当我尝试嵌套tiles时遇到了一个问题。

我目前的布局如下:

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

我希望将第一个布局扩展到用户布局。在瓷砖定义中,我正在使用:

<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个回答

3

有一个更简洁的解决方案

另一种方法是在tiles-def.xml文件中仅使用一个定义(加上默认布局定义)。

tiles-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页面可能用到的参数列表。

0

我已经很久没有使用Struts Tiles了,但是你应该使用<tiles:insert>而不是<tiles:get>,对吧?

也就是说,像这样:

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

谢谢,但我恐怕没有运气。我正在基本布局中完全使用相同的方法。 - Pool
不确定您所说的“相同方法”是什么意思。您尝试过上述方法吗?您是否仍然遇到与您发布的相同错误?我查看了我的一个旧项目,它具有与您描述的非常相似的设置,并且在整个项目中都使用了<tiles:insert attribute="XXX"/> - ChssPly76
更改后的错误不同:ServletException在'/WEB-INF/jsps/user/layout.jsp'中:错误-标签插入:找不到属性'userContent'的值。我在其他地方成功使用了tiles,但嵌套它们似乎是个问题。http://www.mail-archive.com/struts-user@jakarta.apache.org/msg24378.html有一个类似的问题,并发布了一个解决方案(我无法使其工作)。 - Pool

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>

0

从您的问题中可以看出,您在内容属性上使用了不同的名称。对于user.layout,它是content,而对于user.page,它是userContent

您能否尝试使用相同的属性名称,即contentuserContent

希望这可以帮助到您。

更新。 这是快速解决方案。您可以将ignore属性设置为true以进行tiles:get操作。当未定义userContent时,它将静默执行。

但我认为tiles定义有些问题。

错误消息表明您正在尝试使用未定义的瓷砖。我编译了一个示例,其中.user.layout.basic.layout的扩展。两者之间的区别在于body部分。

<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>

嗨,谢谢你的回答。那是故意的,内容和用户内容共存于页面上,用户内容是内容的子页面。问题在于它的定义没有层叠(我在下面回答了,但我要等到以后才能标记为已解决)。 - Pool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接