Velocity 循环指令一种好的解决方法

前提

前台的数据经常是由需要通过 foreach 循环获取。

好的解决方案:(拿我最近做的一个项目做例子)

购物商城左边的导航栏,商品大分类和小分类(Category)

1、在 model 包下创建一个 ViewObject 类

1
2
3
4
5
6
7
8
9
10
11
public class ViewObject
{
private Map<String, Object> objs = new HashMap<>();
public void set(String key, Object value) {
objs.put(key, value);
}

public Object get(String key) {
return objs.get(key);
}
}

2、在 controller 包下创建个 BaseController 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 在每个页面显示图书大分类,抽离出来
* @return
*/
public List<ViewObject> selectAllCategory() {
List<Category> categories = categoryService.selectAllCategory();
List<ViewObject> vos = new ArrayList<>();
for (Category category : categories) {
ViewObject vo = new ViewObject();
vo.set("category", category);
vo.set("id", category.getId());
//System.out.println("category 中的 id 是 "+category.getId());
vos.add(vo);
}
return vos;
}

/**
* 获取图书的小分类,在这里将小分类中的大分类id查找出来,保存在 cds.id 中,
* 然后在模板引擎中通过将 vos.id 和 cds.id 相比较。然后如果相同的话,就取出来放在对应的大分类下
* @return
*/
public List<ViewObject> selectAllCategoryDetail() {
List<CategoryDetail> categoryDetails = categoryDetailService.selectAllCategoryDetail();
List<ViewObject> cds = new ArrayList<>();
for (CategoryDetail categoryDetail : categoryDetails) {
ViewObject vo = new ViewObject();
vo.set("categoryDetail", categoryDetail);
//System.out.println("categoryDetail 中的 categoryDetail id =" + categoryDetail.getId() + "category id = " + categoryDetail.getCategory_id() + " name = " + categoryDetail.getName());
vo.set("id", categoryDetail.getCategory_id());
cds.add(vo);
}
return cds;
}

3、在 IndexController 类下,需要继承 BaseController.java 类

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 返回首页
* @param model
* @return
*/
@RequestMapping(path = {"/", "/index"})
public String index(Model model) {
//模板引擎设置图书分类左边导航栏
model.addAttribute("vos", selectAllCategory());
model.addAttribute("cds", selectAllCategoryDetail());
//返回主页
return "index";
}

4、抽离导航部分的代码 left.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!--左边图书分类导航栏-->
<div class="c3_b1_left">
<dl>
#foreach($vo in $vos)
<dd>
<h1>$!{vo.category.name}</h1>
<p>
#foreach($cd in $cds)
#if($vo.id == $cd.id)
<a href="/list">$!{cd.categoryDetail.name}</a>
#end
#end
</p>
</dd>
#end
</dl>
</div>

5、首页中相应的位置引入 left.html

1
#parse("left.html")

这样就可以解决问题了,可是有时候我们需要控制循环的个数,因为我们网页端可能只需要特定的数据量

那么就需要中断 foreach,可以使用 #break 指令终止循环

1
2
3
4
5
6
#foreach( $vo in $vos )
#if( $foreach.count > 5 )
#break
#end
$!{vo.customer.Name}
#end

参考

Velocity入门指南——第七章 循环指令

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 前提
  2. 2. 好的解决方案:(拿我最近做的一个项目做例子)
  3. 3. 参考