我有一个非常基本的tiles1设置,带有标题、菜单和内容,如下所示:
<definition name="Main" path="/WEB-INF/jsp/MainLayout.jsp">
<put name="header" value="/WEB-INF/jsp/Header.jsp"/>
<put name="menu" value="/WEB-INF/jsp/Menu.jsp"/>
<put name="content" value=""/>
</definition>
我所有的子页面都扩展了这个定义,并为内容部分提供了一个 jsp:
<definition name="SearchPage" extends="Main">
<put name="content" value="/WEB-INF/jsp/Search.jsp"/>
</definition>
我正在寻找的是一种让上面的 SearchPage 定义“放置”一个属性以便它可以在 Search.jsp 中使用的方法。我的第一次尝试是:
<definition name="SearchPage" extends="Main">
<put name="content" value="/WEB-INF/jsp/Search.jsp"/>
<put name="showOptions" value="true" type="string"/>
</definition>
但在这种情况下,showOptions 属性将仅对 MainLayout.jsp 可用,而不会传递给 Search.jsp。我知道有一些方法可以通过布局页面中的 useAttribute 显式传递它,但我非常希望避免布局页面需要了解我可能在子页面中使用的每个变量。
注意在tiles2 中似乎有一个漂亮的cascade="true" 属性,它完全符合我的要求,但不幸的是我认为我被tiles1 卡住了。
感谢 GriffeyDog 提供了很好的单行修复:
在 MainLayout.jsp 中,将所有图块属性导入请求范围。然后它们可用于所有子页面(注意名称冲突)。
<tiles:importAttribute scope="request"/>
我还找到了一种替代方法,它使用具有必要属性的定义作为内容而不是 jsp 页面:http ://wiki.apache.org/struts/StrutsDocTiles (解决方案 #1)