本文将简单举例如何创建velocity的自定义指令。
本示例的目的,使用自定义指令把字符串修整成定长(此处使用的是左边补零法),例如,源字符串为“56”,目标长度为6,则修整后的结果为“000056”。
本示例的准备工作,诸如安装环境导入velocity的jar包之类的就不说了,这一步不是本文的重点,大家参考其他资料很容易获得。以下直接上码。
第一步:编写自定义指令类,该类要继承velocity的Directive类:
package velocity;
import java.io.IOException;
import java.io.Writer;
importorg.apache.velocity.app.VelocityEngine;
importorg.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
importorg.apache.velocity.exception.ParseErrorException;
importorg.apache.velocity.exception.ResourceNotFoundException;
importorg.apache.velocity.runtime.directive.Directive;
importorg.apache.velocity.runtime.parser.node.Node;
importorg.apache.velocity.runtime.parser.node.SimpleNode;
public class StringUtil extends Directive {
//对输入的字符串按目标长度进行左边补零
publicstatic String getFixLengthString(String sourceString, int targetLength) {
String resultString =sourceString;
if(targetLength > sourceString.length()) {
for(int i = 0; i < (targetLength - sourceString.length()); i++) {
resultString= "0" + resultString;
}
}//
returnresultString;
}//getFixLengthString
@Override
publicString getName() {
//TODO Auto-generated method stub
//指令名称,也就是在模板中使用的指令名字
return"FixLength";
}
@Override
publicint getType() {
//TODO Auto-generated method stub
//getType:当前有LINE,BLOCK两个值,line行指令,不要end结束符,block块指令,需要end结束符
returnLINE;
}
@Override
publicboolean render(InternalContextAdapter context, Writer writer, Node node) throwsIOException, ResourceNotFoundException, ParseErrorException,
MethodInvocationException{
//TODO Auto-generated method stub
//#FixLength(第一个参数,第二个参数)
//获取第一个参数
SimpleNodesn_region = (SimpleNode) node.jjtGetChild(0);
StringsourceString = (String) sn_region.value(context);
//获取第二个参数
SimpleNodesn_key = (SimpleNode) node.jjtGetChild(1);
inttargetLength = (int) sn_key.value(context);
//将结果写入到writer中,相当于把结果输出
writer.write(StringUtil.getFixLengthString(sourceString,targetLength));
returntrue;
}
}// end
---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------分割线--------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
第二步,编写主函数。
package velocity;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
importorg.apache.velocity.app.VelocityEngine;
importorg.apache.velocity.runtime.RuntimeConstants;
importorg.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
public class FixLength {
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
VelocityEngine ve = newVelocityEngine();
ve.setProperty(RuntimeConstants.RESOURCE_LOADER,"classpath");
ve.setProperty("classpath.resource.loader.class",ClasspathResourceLoader.class.getName());
//这一步很重要,要把自己写的类的全名加到velocity的配置中去。
ve.setProperty("userdirective","velocity.StringUtil");
ve.init();
Template template =ve.getTemplate("helloVelocity.vm");
Map<String,Object> map4 = new HashMap<String, Object>();
map4.put("FEST","Spring");
map4.put("TIME","2015/12/24");
VelocityContext vcxt = newVelocityContext(map4);
List<Map<String,Object>> list = new ArrayList<>();
Map<String,Object> map1 = new HashMap<String, Object>();
map1.put("upay_mark","CMCC");
map1.put("month","1");
Map<String,Object> map2 = new HashMap<String, Object>();
map2.put("upay_mark","CMCC");
map2.put("month","2");
Map<String,Object> map3 = new HashMap<String, Object>();
map3.put("upay_mark","CMCC");
map3.put("month","3");
list.add(map1);
list.add(map2);
list.add(map3);
vcxt.put("name","velocity");
vcxt.put("date",new Date().toString());
vcxt.put("list",list);
vcxt.put("StringUtil",StringUtil.class);
StringWritersw = new StringWriter();
template.merge(vcxt,sw);
System.out.println("result:");
//输出结果:
System.out.println(sw.toString());
}
}//end
---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------分割线--------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
第三步,编写模板,文件名为:helloVelocity.vm。
#set( $iAmVarible="Hello" )
Welcome $name to velocity.com
Today is $date .
#foreach( $i in $list )
$!i.upay_mark||#FixLength($!i.month,12)
#end
$iAmVarible
-------------------------------------
FEST=$FEST;
TIME=$!TIME;
---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------分割线--------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
第四步,输出结果:
result:
Welcome velocity to velocity.com
Today is Sun Mar 20 11:39:08 CST 2016 .
CMCC||000000000001
CMCC||000000000002
CMCC||000000000003
Hello
-------------------------------------
FEST=Spring;
TIME=2015/12/24;
本文主要介绍的是自定义指令的用法,其他velocity的基础语法需要自己查阅哦~
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------