我正在使用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: Attribute 'body' not found. 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将所有格式化复制到每个模板定义
请咨询
答案 0 :(得分:3)
正如例外情况告诉您main_column
的定义没有属性body
。您的第二个定义表明它是您的根定义,而不是main_column
。默认情况下,没有属性继承或冒泡这样的事情。因此,孩子们对父母的属性一无所知,反之亦然。他们是解决您问题的两种解决方案:
您可以将属性cascade="true"
添加到属性定义中。这使得属性级联到子定义(请参阅cascaded attributes)
您可以使用嵌套定义:
<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>
答案 1 :(得分:2)
可能是您在web.xml中的welcomepagelist指定了baselayout.jsp页面。如果您指定删除该请求并将虚拟请求发送到操作类,则将您的响应转发给在tiles.xml中声明的某个jsp