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

来源:互联网 发布:淘宝店铺首页大图尺寸 编辑:程序博客网 时间:2024/06/05 06:22

      • 前提
      • 好的解决方案拿我最近做的一个项目做例子
      • 参考

前提

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

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

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

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

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 类

/**     * 在每个页面显示图书大分类,抽离出来     * @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 类

/**     * 返回首页     * @param model     * @return     */    @RequestMapping(path = {"/", "/index"})    public String index(Model model) {        //模板引擎设置图书分类左边导航栏        model.addAttribute("vos", selectAllCategory());        model.addAttribute("cds", selectAllCategoryDetail());      //返回主页        return "index";    }

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

<!--左边图书分类导航栏--><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

#parse("left.html")

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

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

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

参考

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