http://blog.csdn.net/madding/article/details/6641020当在velocity中需要显示一个列表信息,我们会用foreach循环输出,

要求:

假如现在需要在页面中输出单数的内容背景为红,双数的内容为黑,构造方式如下:

  1. package org.apache.velocity.test.issues;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.velocity.test.BaseTestCase;
  5. /**
  6. * 测试foreach
  7. * @author madding.lip at 2011.07.28
  8. */
  9. public class MaddingTestForeach extends BaseTestCase {
  10. public MaddingTestForeach(String name) {
  11. super(name);
  12. }
  13. public void test() {
  14. List<String> list = new ArrayList<String>();
  15. for(int i = 1; i <= 100; i++) {
  16. list.add(String.valueOf(i));
  17. }
  18. context.put("features", list);
  19. String template =
  20. "#foreach ($feature in $features)" +
  21. "#if($velocityCount%2 == 1)" +
  22. "<font color=\"red\">$feature</font>" +
  23. "#elseif($velocityCount%2 == 0)" +
  24. "<font color=\"black\">$feature</font>" +
  25. "#end" +
  26. "#if($velocityHasNext)" +
  27. "|" +
  28. "#end" +
  29. "#end";
  30. System.out.println(evaluate(template));
  31. }
  32. }

BaseTestCase是Velocity源代码中的测试类

说明:

1.#foreach是velocity指令,

2.velcotiyCount上, velocity foreach定义的一个变量,该变量主要用来记录当前的循环次数

3.velocityHasNext, velocity foreach定义的一个变量 ,表明该循环当前是否到尾部了

velocity.properties:

  1. # ----------------------------------------------------------------------------
  2. # F O R E A C H  P R O P E R T I E S
  3. # ----------------------------------------------------------------------------
  4. # These properties control how the counter is accessed in the #foreach
  5. # directive. By default the reference $velocityCount and $velocityHasNext
  6. # will be available in the body of the #foreach directive.
  7. # The default starting value for $velocityCount is 1.
  8. # ----------------------------------------------------------------------------
  9. directive.foreach.counter.name = velocityCount
  10. directive.foreach.counter.initial.value = 1
  11. directive.foreach.maxloops = -1
  12. directive.foreach.iterator.name = velocityHasNext

实战记录

有一种情况就是在一个foreach下遍历两个list,那么肯定要是for(int i=0;i<...)这种数字计数形式。java中很好实现,velocity说是有个$velocityCount,但我发现不好用。它的值是从1开始的,而取list的第一个对象list.get(0),所以我用计算方式($velocityCount-1)不行,好些无效,配置$velocityCount初始值为0,配置方式也无效

msgMap.put("directive.foreach.counter.initial.value", 0);
msgMap.put("insuranceCountList", insuranceCountList);
 
没办法了,我就再做一个数字数组或List,里面存储我需要的数字,专用来做迭代,比如手动做的list为insuranceCountList
          <AA_INSURANCELIST>
             ## AA_INSURANCE信息
             #foreach ($count in $insuranceCountList)
           <AA_INSURANCE>
             <NAME> $!{app.getComponent($insured).get($count).getCInsuredNme()} </NAME>
             <AA_PLYNO> $!{app.getComponent($base).get($count).getCPlyNo()}</AA_PLYNO >
           </AA_INSURANCE>
           #end
         </AA_INSURANCELIST>
 
注意的$velocityCount可以不用注入,velocity foreach中直接可使用,最后给一个实战配置模版例子
REQUEST_09.xml
<?xml version="1.0" encoding="GBK"?>
<PACKET type="REQUEST" version="1.0"> #set($base="PlyMain")
#set($insured="Insured")
#set($contactInfo="ContactInfo") <HEAD>
<REQUEST_TYPE>$!{REQUEST_TYPE}</REQUEST_TYPE>
<USER>$!{USER}</USER>
<PASSWORD>$!{PASSWORD}</PASSWORD>
</HEAD>
<BODY>
<VOUCHER_FLAG>$!{app.getComponent($contactInfo).get(0).getCVoucherFlag()}</VOUCHER_FLAG>
<AA_INSURANCELIST>
## AA_INSURANCE信息
#foreach ($count in $AA_INSURANCECountList)
<AA_INSURANCE>
<NAME>$!{app.getComponent($insured).get($count).getCInsuredNme()}</NAME>
<DD_PLYNO>$!{app.getComponent($base).get($count).getCDD_PLYNO()}</DD_PLYNO>
</AA_INSURANCE>
#end
</AA_INSURANCELIST>
</BODY>
</PACKET>

velcoity使用说明:foreach指令的更多相关文章

  1. Velocity(7)——#foreach指令

    首先是#foreach的简单示例: #foreach( $elem in $allElems) $elem</br> #end 上面这个例子中,$allElems可以是一个Vector,一 ...

  2. angularJS内置指令一览

    基础ng指令 ng-href ng-src ng-disabled ng-readonly ng-checked ng-selected ng-class ng-style ng-show ng-hi ...

  3. CMake--常用指令

    1 . ADD_DEFINITIONS 向 C/C++ 编译器添加 -D 定义,比如 在CMakeList.txt文件中添加: ADD_DEFINITIONS(-DENABLE_DEBUG -DABC ...

  4. cmake指令详解

    所需文件名:CmakeLists.txt,在需要操作的每个目录下都需要 PROJECT(工程名字)     这条指令会自动创建两个变量: <projectname>_BINARY_DIR( ...

  5. 【PHP对XML文件的操作技术【完整版】】

    无论是c/c++还是java.c#均有对XML文件操作的技术,PHP对XML文件的操作的技术主要有三种: DOM.XPath.SimpleXml. 一.DOM DOM:Document Object ...

  6. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  7. 《Velocity java开发指南》中文版(下)转载

    文章出自:http://sakyone.iteye.com/blog/524292 8.Application Attributes Application Attributes (应用程序属性)是和 ...

  8. 《Velocity java开发指南》中文版(上)转载

    文章引自:http://sakyone.iteye.com/blog/524289 1.开始入门 Velocity是一基于java语言的模板引擎,使用这个简单.功能强大的开发工具,可以很容易的将数据对 ...

  9. 深入浅出KnockoutJS

    深入浅出KnockoutJS 写在前面,本文资料大多来源网上,属于自己的学习笔记整理. 其中主要内容来自learn.knockoutjs.com,源码解析部分资料来自司徒正美博文<knockou ...

随机推荐

  1. 从dao层查出的数据到页面时数值都是零的异常

    异常问题: IllegalArgumentException: argument type mismatch at cn.tedu.utils.BeanListHandler.handle(BeanL ...

  2. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...

  3. HSV做通道分离是出现的Vector内存越界错误

    vector<Mat> hsvSplit; //因为我们读取的是彩色图,直方图均衡化需要在HSV空间做 split(imgHSV, hsvSplit); equalizeHist(hsvS ...

  4. ansible管理window

    设置window以支持远程执行命令======================================= 升级powershell到3.0+-------------------------- ...

  5. Educational Codeforces Round 10 E - Pursuit For Artifacts (强联通缩点 + 回溯)

    题目链接:http://codeforces.com/contest/652/problem/E 给你n个点m个边,x和y双向连接,要是z是1表示这条边上有宝藏,0则没有,最后给你起点和终点,问你要是 ...

  6. 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列

    [题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[ ...

  7. python3开发进阶-Django框架的起飞加速一(ORM)

    阅读目录 ORM介绍 Django中的ORM ORM中的Model ORM的操作 一.ORM介绍 1.ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一 ...

  8. 1.7(学习笔记)过滤器(Fliter)

    一.过滤器(Fliter)简介 过滤器是位于客户端与服务器之间的滤网,在访问资源时会经过一系列的过滤器, 满足条件则放行,不满足条件的将其拦截. 过滤器可以看做是一个特殊的Servlet,设置了过滤器 ...

  9. 【棋盘DP】【OpenJudge7614】最低通行费

    最低通行费 总时间限制: 1000ms 内存限制: 65536kB [描述] 一个商人穿过一个 N*N 的正方形的网格,去参加一个非常重要的商务活动.他要从网格的左上角进,右下角出.每穿越中间1个小方 ...

  10. IO流--字符流缓冲技术

    缓冲技术是为了提高数据的读写效率而提出的. (1)字符流的缓冲读 在字符流的缓冲技术中提供了一个newLine()方法,这个方法是跨平台的 在读数据的时候采用读完直接刷新的方式可以保证断电后数据不会丢 ...