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

前提

前台的数据经常是由需要通过 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入门指南——第七章 循环指令

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhisheng_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值