velocity本身支持自定义标签和指令的扩展,

在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用,而以井号 # 开头的语句则为 Velocity 的指令(Directive)。

velocity支持的指令有:#set,#foreach,#if #else #end,#parse,#include,#evaluate,#define,#macro,

在velocity的jar包中的directive.properties中定义了这些实现:

directive.1=org.apache.velocity.runtime.directive.Foreach
directive.2=org.apache.velocity.runtime.directive.Include
directive.3=org.apache.velocity.runtime.directive.Parse
directive.4=org.apache.velocity.runtime.directive.Macro
directive.5=org.apache.velocity.runtime.directive.Literal
directive.6=org.apache.velocity.runtime.directive.Evaluate
directive.7=org.apache.velocity.runtime.directive.Break
directive.8=org.apache.velocity.runtime.directive.Define

自定义标签和指定,比如我们定义了下面的remoteVelocity指令

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<title>click ok page</title>
</head>
<body>This app runs well#set($monkey= {"banana" : "good", "roast beef" : "bad"})#remoteVelocity("namespace","velocityname",$monkey)
</body>
</html>

要对这个指令的实现要继承Directive这个类,这个宏我们可以从其他服务获取vm的内容,动态渲染,这种方式可以统一管理公共模板,

import java.io.IOException;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.context.InternalContextAdapter;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.runtime.directive.Directive;
import org.apache.velocity.runtime.parser.node.Node;
import org.apache.velocity.runtime.parser.node.SimpleNode;
import org.springframework.beans.factory.annotation.Autowired;import com.alibaba.citrus.service.template.TemplateService;
import com.alibaba.click.util.HostUtil;public class RemoteVelocity extends Directive{@AutowiredTemplateService templateService;private static final VelocityEngine velocityEngine = new VelocityEngine();@Overridepublic String getName() {return "remoteVelocity";}@Overridepublic int getType() {return LINE;}@Overridepublic boolean render(InternalContextAdapter context, Writer writer,Node node) throws IOException, ResourceNotFoundException,ParseErrorException, MethodInvocationException {SimpleNode sn_region = (SimpleNode) node.jjtGetChild(0);   String region = (String)sn_region.value(context);   SimpleNode sn_key = (SimpleNode) node.jjtGetChild(1);   Serializable key = (Serializable)sn_key.value(context);   SimpleNode sn_data = (SimpleNode) node.jjtGetChild(2); Object data = sn_data.value(context);   Map map = new HashMap();map.put("data", data);
//      String vel = HostUtil.getResponseText("http://127.0.0.1/index.html");String vel="#foreach($member in $data.entrySet())<li>$member.key - $member.value</li>#end ";writer.write(renderTemplate(map,vel));return true;}public static String renderTemplate(Map params,String vimStr){VelocityContext context = new VelocityContext(params);StringWriter writer = new StringWriter();try {velocityEngine.evaluate(context, writer, "", vimStr);} catch (ParseErrorException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (MethodInvocationException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ResourceNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//渲染模板return writer.toString();}}

node.jjtGetChild(2) 这个方法可以获取对应指令的参数,下标从0开始,

在web工程的WEB-INF下面定义velocity.properties这个配置文件,用户扩展的指令最好放到这个文件里面,velocity的jar包里面提供了默认实现,我们可以覆盖重新定义自己的扩展,类就是对应自己的扩展类的类名

#自定义标签

userdirective=com.alibaba.click.test.RemoteVelocity

这样启动后就可以正常使用了。

Directive的三个方法:

getName:指令的名称
getType:当前有LINE,BLOCK两个值,line行指令,不要end结束符,block块指令,需要end结束符
public boolean render(InternalContextAdapter context, Writer writer,Node node) 具体处理过程

转载于:https://www.cnblogs.com/secbook/archive/2012/06/02/2655173.html

velocity自定义标签和指令相关推荐

  1. java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)

    velocity本身支持自定义标签和指令的扩展,我们看看扩展指令的步骤及searchweb2的应用场景, 1.使用方法 在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用 ...

  2. Velocity 自定义标签

    本文转自:http://zl198751.iteye.com/blog/828058 编写自定义的 Velocity 指令   Velocity 允许您对指令系统进行扩展,在 Velocity 引擎初 ...

  3. javaweb学习总结(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  4. freemarker自定义标签(二十一)

    一,讲解一 假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术 ...

  5. JSP标签:jsp内置标签、jstl标签、自定义标签

     一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签    1 ...

  6. JSP自定义标签开发与打包

    前言:最近用到JSP的自定义标签,于是到网上寻找资料,结果发现很多的网上教程要么不全要么就是步骤流程错误,尤其是将自定义标签打jar包这一过程,按照网上的教程操作,结果被坑惨了,所以才有现在这一篇博文 ...

  7. Java-Web JSTL标签库、自定义标签库和MVC设计模式

    目录 一.JSTL标签库 1.什么是JSTL 2.JSTL标签库 3.使用taglib指令导入标签库 4.core标签库常用标签 (1)out和set (2)remove (3)url (4)if ( ...

  8. 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门

    javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...

  9. 往写好的html插入标签,写一个可插入自定义标签的 Textarea 组件

    - "插入自定义标签是什么鬼?" - "比如你要插入一个的标签..." - "什么情况下会有这种需求?" - "得罪了产品的情况下 ...

最新文章

  1. Xamarin XAML语言教程构建ControlTemplate控件模板
  2. Sqli-labs第一题详解
  3. 亚伦•斯沃茨:怎样有效利用时间
  4. Hibernate的事件机制
  5. Android开发网
  6. linux系统自动执行任务(转)
  7. Lua 中写 C 扩展库时用到的一些技巧
  8. 环境搭建:mobaxterm连接本地虚拟机
  9. 如何下载所有Instagram照片
  10. HTML图片设置成为页面背景 ( 五个小步骤)
  11. Guacamole会话记录屏幕录像
  12. jQuery获取或设置元素的属性值
  13. C语言实验——时间间隔(java)
  14. 编译小度deng wifi源码出错
  15. 我是怎么提升写作能力的
  16. 阿里云 云效Codeup提示git did not exit cleanly (exit code 128)
  17. 自学 java 怎样快速入门?
  18. 为什么,总是失去后才会懂得珍惜呢?
  19. 用Python构建和可视化决策树
  20. html 删除icon图标素材,精选Dribbble图标Icon素材集(2013年春季版50+)

热门文章

  1. IntelliJ IDEA 2019.3这回真的要飞起来了,新特性抢先看!
  2. 哥们,你真以为你会做这道JVM面试题?
  3. 算法er的尽头会是To B吗?
  4. 【特征提取+分类模型】4种常见的NLP实践思路
  5. 别再用ls、cat命令了,这有一套全新升级版,简洁快速还易上手
  6. 吴恩达老师,被曝靠「教书」实现首个IPO上市,估值50亿美元
  7. 有哪些高效看文献的方法?
  8. 让 PyTorch 更轻便,这款深度学习框架你值得拥有!在 GitHub 上斩获 6.6K 星
  9. 如何保护你写的 Python 代码?
  10. 基于CENTOS7 Linux高可用集群LVS+Keepalived配置