3

Spring 3 と Tiles 2.2 で Web アプリケーションを構築しています。次のレイアウト定義を入れました:

<tiles-definitions>  
<definition name="default" template="/WEB-INF/layouts/default.jspx">  
<put-attribute name="header" value="main.header" />  
<put-attribute name="top_menu" value="/WEB-INF/views/top_menu.jspx" />  
<put-attribute name="left_column" value="main2.left_column" />  
<put-attribute name="main_column" value="main2.main_column" />  
<put-attribute name="footer" value="/WEB-INF/views/footer.jspx" />  
</definition> 

<definition name="main2.main_column" template="/WEB-INF/layouts/double_column/main_column.jspx">  
</definition>

<definition name="main2.left_column" template="/WEB-INF/layouts/left_column.jspx">  
        <put-attribute name="profile_menu" value="/WEB-INF/views/userprofile/userdetails.jspx" />  
        <put-attribute name="common_menu" value="/WEB-INF/views/menu.jspx" />  
      </definition>  
</tiles-definitions>

WEB-INF/layouts/default.jspx 内

<div id="main_page" >   
    <tiles:insertAttribute name="left_column"/>    
    <tiles:insertAttribute name="main_column"/>   
        <div id="footer" >  
<tiles:insertAttribute name="footer" ignore="true"/>  
                </div>  
            </div>  

/WEB-INF/layouts/double_column/main_column.jspx に次のものがあります。

<tiles:insertAttribute name="body"/>  

要求されたパス view.xml は次のように定義されます。

<tiles-definitions>  
    <definition extends="default" name="secure/createAccount/*">  
        <put-attribute name="body" value="/WEB-INF/views/secure/createAccount/{1}.jspx"/>  
    </definition>  
</tiles-definitions>

エラーは次のとおりです。

org.apache.tiles.template.NoSuchAttributeException: 属性「本体」が見つかりません。
    org.apache.tiles.template.DefaultAttributeResolver.computeAttribute(DefaultAttributeResolver.java:49)
    org.apache.tiles.template.InsertAttributeModel.resolveAttribute(InsertAttributeModel.java:187)
    org.apache.tiles.template.InsertAttributeModel.start(InsertAttributeModel.java:107)
    org.apache.tiles.jsp.taglib.InsertAttributeTag.doTag(InsertAttributeTag.java:306)
    org.apache.jsp.WEB_002dINF.layouts.double_005fcolumn.main_005fcolumn_jspx._jspx_meth_tiles_005finsertAttribute_005f0(main_005fcolumn_jspx.java:79)
    org.apache.jsp.WEB_002dINF.layouts.double_005fcolumn.main_005fcolumn_jspx._jspService(main_005fcolumn_jspx.java:54)

「本文」をデフォルトのテンプレートに直接配置すると機能しますが、テンプレートのブリックをデフォルトのレイアウトだけでなく、多くのレイアウトで再利用できるようにする必要があり、main_column を使用してすべてのフォーマットを各テンプレート定義にコピーしたくありません。

ご意見をお聞かせください

4

2 に答える 2

3

例外として、main_columnhas not attributeの定義が示されますbody。2 番目の定義は、それがルート定義であり、の定義ではないことを示していますmain_column。デフォルトでは、属性の継承やバブリングのようなものはありません。したがって、子供は親の属性について何も知りません。また、その逆も同様です。それらはあなたの問題に対する2つの解決策です:

cascade="true"属性を属性定義に追加できます。これにより、属性を子定義にカスケードできます (カスケードされた属性を参照)

ネストされた定義を使用できます。

<tiles-definitions>  
  <definition extends="default" name="secure/createAccount/*">  
    <put-attribute name="main_column">
      <definition template="/WEB-INF/layouts/double_column/main_column.jspx">
        <put-attribute name="body" value="/WEB-INF/views/secure/createAccount/{1}.jspx"/>  
      </definition>
    </put-attribute>
  </definition>  
</tiles-definitions>

(ネスト定義を参照)

于 2011-11-21T13:04:25.383 に答える
2

web.xmlのwelcomepagelistでbaselayout.jspページを指定している可能性があります。それを削除してダミーリクエストをアクションクラスに送信するように指定した場合は、tiles.xmlで宣言されているjspに応答を転送します

于 2012-11-23T11:49:30.940 に答える