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:找不到属性“body”。
    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)

如果我将“body”直接放到默认模板中它可以工作,但是我希望我的模板块可以被许多布局重用,不仅是默认的,而且我不想使用 main_column 将所有格式复制到每个模板定义

请指教

4

2 回答 2

3

正如异常告诉您main_columnhas not attribute的定义body。您的第二个定义说它是您的根定义,而不是main_column. 默认情况下,没有属性继承或冒泡之类的东西。因此,孩子们对父母的属性一无所知,反之亦然。他们是您的问题的两种解决方案:

您可以将属性添加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 回答