velocity自定义指令示例

    本文将简单举例如何创建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的基础语法需要自己查阅哦~

 

 

 

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------分割线----------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值