views:

254

answers:

1

Can freemarker be used to loop through collections and output the properties of each item in the collection?

This collections properties will be dynamic i.e. can't be hard coded, will be generated from the database.

what I am looking for: be able to point to different databases, and loop through each table and output the tables columns.

+2  A: 

Probably, although it depends on what structure the data is in in Java land. Freemarker handles basic operations on collections (hashes, sequences). If you have a Map in Java, Freemarker will let you use it like a "hash" (you can get its keys directly), and Lists in Java look like "sequences" in Freemaker.

If you had, say, in Java, a List<List<String>> representing a list of tables, then you could walk them in FTL like:

<#-- getMyTables() is a call into the primary template model object -->
<#assign myTables = getMyTables() />
<#list myTables as table>
  <#list table as column>
    ${column}
  </#list> 
</#list>

If your collections are custom classes that do not implement the List or Map interfaces, then you can of course simply access their methods directly (Freemarker supports the direct access of methods on its template model and anything you can get out of the template model). E.g.

<#-- getMyTablesAsList() is a call into the primary template model object -->
<#assign myTables = getMyTablesAsList() />
<#list myTables as table>
  <#list table.getColumnNames() as column>
    ${column}
  </#list> 
</#list>
quixoto
wow this is great, and it provides a safe way to output for end users rigth? like they only get access to the classes that we inject into the view page?
mrblah
yes, you will have to manually inject it in for the object to be reference-able in freemarker
Chii