从零学习freemarker(4)<#list 的使用

本文介绍如何使用Freemarker模板引擎渲染列表数据,并通过一个具体示例展示了配置过程及模板语法。示例中创建了一个Java应用程序,该程序加载了包含网站名称列表的数据,并将其传递给Freemarker模板进行渲染。
 原文:http://www.java2000.net/p7848

<#list 的使用

源代码
package freemarker;
import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import freemarker.template.Configuration;import freemarker.template.Template;
public class TestList {  private Configuration cfg;
  public Configuration getCfg() {    return cfg;  }
  public void init() throws Exception {    cfg = new Configuration();    cfg.setDirectoryForTemplateLoading(new File("bin/freemaker"));  }
  public static void main(String[] args) throws Exception {    TestList obj = new TestList();    obj.init();    Map root = new HashMap();    List<String> list = new ArrayList<String>();    list.add("java2000.net");    list.add("youkuaiyun.com");    root.put("list", list);    Template t = obj.getCfg().getTemplate("TestList.ftl");    Writer out = new OutputStreamWriter(new FileOutputStream("TestList.html"), "GBK");    t.process(root, out);    System.out.println("Successfull................");  }}
模板

  1. <table border=1>
  2.   <tr><th>站点名称</th></tr>
  3.   <#list list as website>
  4.   <tr><td>${website}</td></tr>
  5.   </#list>
  6. </table>  
运行结果
  1. <table border=1>
  2.   <tr><th>站点名称</th></tr>
  3.     <tr><td>java2000.net</td></tr>
  4.   <tr><td>youkuaiyun.com</td></tr>
  5. </table>  
结果分析
指定List的每个项目为后面的名字website,然后在里面用${website} 来访问

















<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
&lt;think>好的,我需要回答用户关于FreeMarker中&lt;#list>指令的使用方法的问题。首先,我要确保自己正确理解用户的需求。用户想知道使用&lt;#list>迭代集合时需要满足哪些条件,以及具体的使用方法。 首先,回忆一下FreeMarker的基本知识。&lt;#list>指令用于遍历集合,如列表或数组。根据引用[5],用户给出的例子是遍历一个userList,每个元素是user,然后在循环内输出用户的信息。这说明&lt;#list>的基本语法是&lt;#list collection as item>...&lt;/#list>,其中collection是要迭代的集合,item是每次迭代的变量名。 接下来,用户提到“条件”,可能指的是在遍历时是否可以有条件过滤某些元素?或者在集合本身需要满足什么条件才能正确迭代?需要明确这一点。根据引用[3]和[5],没有直接提到在&lt;#list>中使用条件判断,但FreeMarker允许在循环内部使用&lt;#if>指令进行条件判断。例如,在遍历时,可以结合if来过滤元素。 另外,关于集合的条件,可能需要注意集合是否为空。如果集合为空,可能需要使用&lt;#else>来处理空情况,避免错误或显示友好信息。比如,&lt;#list users as user>...&lt;#else>列表为空&lt;/#list>。这一点在引用中没有提到,但根据FreeMarker的常见用法,这是一个重要点。 然后,集合的数据类型需要是可迭代的。FreeMarker支持各种集合类型,如Java中的List、数组等。如果传入的对象不是集合类型,可能会导致错误。例如,如果传入一个字符串或数字,使用&lt;#list>会报错,所以用户需要确保传入的集合变量是正确的类型。 还要注意集合的访问权限,比如在Java中,如果集合是通过模型传递到模板的,需要确保其可访问性,比如是public的或者有对应的getter方法。 此外,用户可能想了解如何在遍历时获取索引或其他循环变量。例如,使用item_index来获取当前项的索引,这在引用中没有提到,但也是&lt;#list>的常见用法。例如: &lt;#list items as item> 第${item_index + 1}项: ${item} &lt;/#list> 另外,可能有嵌套循环的情况,比如在引用[4]中的例子,九九乘法表使用了嵌套的&lt;#list>指令,说明可以多层嵌套使用。 需要确保在模板中正确访问集合变量。如果变量名错误或不存在,FreeMarker会抛出异常。例如,如果用户尝试遍历一个未定义的变量,需要处理这种情况,或者使用默认值操作符!来避免错误,比如&lt;#list users! as user>,这样当users为空时,不会报错。 总结用户的问题,使用&lt;#list>的条件可能包括: 1. 集合变量存在且为可迭代类型。 2. 处理集合为空的情况,使用&lt;#else>。 3. 在循环内部使用条件判断&lt;#if>来过滤元素。 4. 正确访问集合中的元素属性,如user.userName需要user对象有该属性。 接下来,根据这些点组织回答,并引用提供的参考文献中的相关内容。例如,引用[5]中的例子展示了基本遍历,引用[4]中的嵌套循环,引用[3]中提到nested指令可能与宏一起使用,但可能和&lt;#list>关系不大,但需要确认是否有其他相关引用。例如,引用[2]中提到了list指令的详解,但具体内容未给出,可能需要假设它包含更多使用细节。 最后,生成相关问题,比如如何处理空集合,如何结合条件判断,如何获取索引等。&lt;/think>### FreeMarker中`&lt;#list>`指令的使用条件与方法 在FreeMarker使用`&lt;#list>`指令迭代集合需满足以下条件,并可通过以下方法实现: #### 一、使用条件 1. **集合必须为可迭代类型** 集合需是Java中的`List`、数组、`Set`等实现了`Iterable`接口的类型。若传入非集合对象(如字符串、数字),模板引擎会报错[^5]。 2. **集合变量需存在或可安全访问** 若集合可能为空或未定义,建议使用默认值操作符(`!`)避免异常。例如: ```freemarker &lt;#list users! as user> &lt;!-- 当users不存在时,视为空列表 --> ``` 3. **集合元素的属性需可访问** 若集合元素是Java对象,需确保其属性有公共访问权限(如通过`getter`方法)[^5]。 --- #### 二、基本语法与使用 ```freemarker &lt;#list 集合变量 as 单个元素变量> ${元素变量.属性} &lt;#else> 集合为空时的提示 &lt;/#list> ``` - **示例**:遍历用户列表并输出用户名(引用自示例[^5]): ```freemarker &lt;#list userList as user> 用户名:${user.userName} &lt;#else> 当前用户列表为空 &lt;/#list> ``` --- #### 三、进阶用法 1. **结合条件过滤元素** 在循环内部使用`&lt;#if>`进行条件判断: ```freemarker &lt;#list userList as user> &lt;#if user.age > 18> ${user.userName}(成年) &lt;/#if> &lt;/#list> ``` 2. **获取循环索引与状态** - `变量名_index`:当前元素的索引(从0开始)。 - `变量名?has_next`:判断是否有下一个元素。 ```freemarker &lt;#list userList as user> 第${user_index + 1}位用户:${user.userName} &lt;#if !user?has_next>(最后一位)&lt;/#if> &lt;/#list> ``` 3. **嵌套循环** 可多层嵌套`&lt;#list>`,例如生成九九乘法表(引用自示例[^4]): ```freemarker &lt;#list 1..9 as i> &lt;#list 1..i as j> ${j}*${i}=${j*i}  &lt;/#list> &lt;br> &lt;/#list> ``` --- #### 四、注意事项 - **空集合处理**:使用`&lt;#else>`分支可提升模板健壮性。 - **性能优化**:避免在循环内执行复杂计算,建议在Java层预处理数据。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值