前提
前台的数据经常是由需要通过 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
|
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()); vos.add(vo); } return vos; }
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); 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
|
@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
这样就可以解决问题了,可是有时候我们需要控制循环的个数,因为我们网页端可能只需要特定的数据量
那么就需要中断 foreach,可以使用 #break 指令终止循环
1 2 3 4 5 6
| #foreach( $vo in $vos ) #if( $foreach.count > 5 ) #break #end $!{vo.customer.Name} #end
|
参考
Velocity入门指南——第七章 循环指令