Velocity #foreach遍历集合 & 对象
一、遍历字符串List
C#后端代码
List<string> strList = new List<string>() {"dsd","sdfsd","asdfsd","asdfsdfsd"};
context.Put("strList", strList);Code language: C# (cs)
Velocity模板代码
#foreach($str in $strList)
$str <br/>
#endCode language: PHP (php)
执行效果:循环取出列表每一个字符串,换行输出。

语法说明
#foreach(循环变量 in 集合) 开启循环,#end 闭合循环。
二、遍历自定义实体类 List
1. Person实体(C#)
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
public Person(){}
public Person(string name,int age)
{
this.name = name;
this.age = age;
}
}Code language: C# (cs)
2. 后端封装List
List<Person> pList = new List<Person>();
pList.Add(new Person("Jack", 1));
pList.Add(new Person("Ben", 11));
pList.Add(new Person("Kevin", 100));
pList.Add(new Person("Simon", 500));
pList.Add(new Person("Lulu", 20));
context.Put("pList", pList);Code language: PHP (php)
3.模板访问属性写法
模板代码:
#foreach($per in $pList)
<tr>
<td>$per.name</td>
<td>$per.age</td>
</tr>
#endCode language: HTML, XML (xml)
❌会读取不到数据!报错/空白
根本原理
Velocity 访问对象属性规则:$per.xxx 会自动寻找 公共Get方法 GetXxx()
$per.name→ 尝试调用per.getName()$per.age→ 尝试调用per.getAge()
你的实体:
- 私有字段:
name、age - 公共属性大写开头:
Name、Age,对应方法GetName()、GetAge()
✅正确模板写法:
#foreach($per in $pList)
<tr>
<td>$per.Name</td>
<td>$per.Age</td>
</tr>
#endCode language: HTML, XML (xml)
补充:C#规范属性首字母大写;Java实体属性一般小写,这是新手最容易踩的大小写陷阱。
三、#foreach内置常用变量
循环内部自带变量,可以直接使用:
| 变量 | 作用 |
|---|---|
$foreach.index | 当前索引,从0开始 |
$foreach.count | 当前序号,从1开始 |
$foreach.first | 是否第一条数据(布尔值) |
$foreach.last | 是否最后一条数据(布尔值) |
示例:
#foreach($per in $pList)
$foreach.count 、姓名:$per.Name
#endCode language: PHP (php)
四、表格显示
<table border="0" cellpadding="0" cellspacing="0">
#foreach($per in $pList)
<tr>
<td>$per.Name</td>
<td>$per.Age</td>
</tr>
#end
</table>Code language: HTML, XML (xml)
总结
#foreach(变量 in 集合)+#end是Velocity标准循环;- 遍历普通List,直接输出
$变量; - 遍历实体对象:
$对象.属性名匹配公共属性名大小写,不要访问私有字段; - C#实体属性建议统一大写首字母,模板保持一致书写;
- 如果出现数据空白,优先检查属性大小写、是否存在get访问器。