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

よりクリーンな解決策があります。

もう1つのアプローチは、 tiles-def.xmlファイルで1つの定義(およびdefaultLayout定義)のみを使用することです。

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ページへの可能な引数のリストを認識している必要があることです。

于 2014-01-22T02:21:01.503 に答える
0

<tiles:insert>Struts Tilesを使用してから久しぶりですが、代わりに使用するべきではありません<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 に答える
0

あなたの質問からわかるように、コンテンツ属性に異なる名前を使用しています。user.layoutcontent用とuser.pageuserContent用です。

その属性に同じ名前を使用することを試みることができますcontentuserContent

お役に立てれば。

アップデート。 これはクイックハックソリューションです。tiles:get操作にtrueに設定されたignore属性を使用できます。userContentが定義されていない場合は、サイレントに実行されます。

しかし、これはタイルの定義に問題があると思います。

エラーメッセージは、定義されていないタイルを使用しようとしていることを示しています。.user.layoutの拡張子である場合の例をまとめました.basic.layout。2つの違いは体の部分です。

<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 に答える