Up to now we have seen simple attributes, i.e. attributes that have a simple value: a template, a string or a definition. But there are cases where you need a collection of values, for example a list of definitions to be redendered one below the other.
To include a list attribute you can use the <put-list-attribute> tag in your Tiles definitions file:
<definition name="myapp.homepage.body" template="/layouts/variable_rows.jsp"> <put-list-attribute name="items"> <add-attribute value="/tiles/banner.jsp" /> <add-attribute value="/tiles/common_menu.jsp" /> <add-attribute value="/tiles/credits.jsp" /> </put-list-attribute> </definition>
In your template page, you can read the list attribute iterating over its elements:
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %> <tiles:useAttribute id="list" name="items" classname="java.util.List" /> <c:forEach var="item" items="${list}"> <tiles:insertAttribute value="${item}" flush="true" /> <br/> </c:forEach>
The list attribute is first converted into a scripting variable; after that it is iterated using the <c:forEach> tag. The compound attributes are then rendered one after the other.
When you extend a definition that contains a list attribute, you can "inherit" its elements. For example:
<definition name="myapp.homepage.body" template="/layouts/variable_rows.jsp"> <put-list-attribute name="items"> <add-attribute value="/tiles/banner.jsp" /> <add-attribute value="/tiles/common_menu.jsp" /> <add-attribute value="/tiles/credits.jsp" /> </put-list-attribute> </definition> <definition name="myapp.homepage.body.extended" extends="myapp.homepage.body"> <put-list-attribute name="items" inherit="true"> <add-attribute value="/tiles/greetings.jsp" /> </put-list-attribute> </definition>
In this case, the myapp.homepage.body.extended has the items attribute that inherits the content of the items attribute of its parent definition. In other words, the items attribute will container the following elements: