velocity自定义标签和指令
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自定义标签和指令相关推荐
- java中velocity定义宏标签_velocity自定义标签和指令(转:zwj)
velocity本身支持自定义标签和指令的扩展,我们看看扩展指令的步骤及searchweb2的应用场景, 1.使用方法 在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用 ...
- Velocity 自定义标签
本文转自:http://zl198751.iteye.com/blog/828058 编写自定义的 Velocity 指令 Velocity 允许您对指令系统进行扩展,在 Velocity 引擎初 ...
- javaweb学习总结(二十三)——jsp自定义标签开发入门
一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...
- freemarker自定义标签(二十一)
一,讲解一 假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术 ...
- JSP标签:jsp内置标签、jstl标签、自定义标签
一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签 1 ...
- JSP自定义标签开发与打包
前言:最近用到JSP的自定义标签,于是到网上寻找资料,结果发现很多的网上教程要么不全要么就是步骤流程错误,尤其是将自定义标签打jar包这一过程,按照网上的教程操作,结果被坑惨了,所以才有现在这一篇博文 ...
- Java-Web JSTL标签库、自定义标签库和MVC设计模式
目录 一.JSTL标签库 1.什么是JSTL 2.JSTL标签库 3.使用taglib指令导入标签库 4.core标签库常用标签 (1)out和set (2)remove (3)url (4)if ( ...
- 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门
javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...
- 往写好的html插入标签,写一个可插入自定义标签的 Textarea 组件
- "插入自定义标签是什么鬼?" - "比如你要插入一个的标签..." - "什么情况下会有这种需求?" - "得罪了产品的情况下 ...
最新文章
- Xamarin XAML语言教程构建ControlTemplate控件模板
- Sqli-labs第一题详解
- 亚伦•斯沃茨:怎样有效利用时间
- Hibernate的事件机制
- Android开发网
- linux系统自动执行任务(转)
- Lua 中写 C 扩展库时用到的一些技巧
- 环境搭建:mobaxterm连接本地虚拟机
- 如何下载所有Instagram照片
- HTML图片设置成为页面背景 ( 五个小步骤)
- Guacamole会话记录屏幕录像
- jQuery获取或设置元素的属性值
- C语言实验——时间间隔(java)
- 编译小度deng wifi源码出错
- 我是怎么提升写作能力的
- 阿里云 云效Codeup提示git did not exit cleanly (exit code 128)
- 自学 java 怎样快速入门?
- 为什么,总是失去后才会懂得珍惜呢?
- 用Python构建和可视化决策树
- html 删除icon图标素材,精选Dribbble图标Icon素材集(2013年春季版50+)
热门文章
- IntelliJ IDEA 2019.3这回真的要飞起来了,新特性抢先看!
- 哥们,你真以为你会做这道JVM面试题?
- 算法er的尽头会是To B吗?
- 【特征提取+分类模型】4种常见的NLP实践思路
- 别再用ls、cat命令了,这有一套全新升级版,简洁快速还易上手
- 吴恩达老师,被曝靠「教书」实现首个IPO上市,估值50亿美元
- 有哪些高效看文献的方法?
- 让 PyTorch 更轻便,这款深度学习框架你值得拥有!在 GitHub 上斩获 6.6K 星
- 如何保护你写的 Python 代码?
- 基于CENTOS7 Linux高可用集群LVS+Keepalived配置