`

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{
	
	@Autowired
	TemplateService templateService;
	
	private static final VelocityEngine velocityEngine = new VelocityEngine();

	@Override
	public String getName() {
		return "remoteVelocity";
	}

	@Override
	public int getType() {
		return LINE;
	}

	@Override
	public 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 block
			e.printStackTrace();
		} catch (MethodInvocationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ResourceNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.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) 具体处理过程

 

参考:http://www.ibm.com/developerworks/cn/java/j-lo-velocity/

 

分享到:
评论

相关推荐

    velocity文档(Velocity1.4java开发指南中文版,Velocity1.4模板使用指南中文版中文版)

    4. **宏**:Velocity 支持宏定义,类似于 HTML 中的自定义标签,可以复用和封装代码,增强模板的模块化。 5. **指令集**:Velocity 提供了多种内置指令,如 #if, #foreach, #set 等,用于控制流程和处理数据。 ** ...

    velocity+ssi整合

    这可能涉及到自定义 Velocity工具或者中间件,使得Velocity引擎能够识别并处理SSI标签,然后将其转换为Velocity语法执行。 例如,我们可以创建一个 VelocityContext 对象,将SSI所需的变量添加进去,然后通过...

    velocity_lib1.7-jar包

    Velocity通过模板语言,允许开发者用简单的指令来控制页面元素的生成,这些指令可以与Java对象直接交互,无需繁琐的JSP标签或脚本。 二、核心概念 1. 模板(Template):模板是 Velocity 的灵魂,它是静态页面的...

    Jsp结合Velocity实现依据Word模板文件生成对应数据文件

    JSP的核心概念包括JSP指令、脚本元素、表达式和自定义标签等,这些元素帮助开发者创建动态网页。 **Velocity** 是Apache软件基金会的一个开源项目,它提供了一个简单易用的模板语言,用于分离业务逻辑和表现层。...

    记录一下Velocity防Xss攻击

    例如,可以使用Velocity的内置宏或者自定义函数来自动转义HTML特殊字符,如 `、`&gt;`、`&` 和 `'`。 `EscapeRequestReference`可能是一个类,用于处理HTTP请求中的引用,并确保它们在被插入到Velocity模板中之前得到...

    struts2Velocity.zip_velocity

    可以通过`&lt;velocity&gt;`标签在Struts2配置文件中自定义模板路径。 3. **Velocity模板语法**:Velocity模板语言是一种非侵入性的脚本语言,其语法简洁。例如,`$variable`用于引用Java对象,`#if`, `#else`, `#end`...

    Velocity用户手册---中文版

    手册通常会涵盖变量引用、条件语句、循环结构、函数调用、自定义标签等内容,帮助开发者充分利用Velocity的特性。 此外,压缩包中的"Struts 与 Velocity 的集成.htm"文件可能是对这个主题的深入讲解,而".files...

    Velocity VelocityHelper

    4. **宏库**: 宏是NVelocity中的可重用代码块,类似于HTML中的自定义标签。它们可以提高代码复用性和可维护性。 5. **指令(Control Directives)**: NVelocity提供了一系列的控制指令,如`#foreach`, `#if`, `#else`...

    java web标签大全

    内置对象如request、response、session等可以直接在页面中使用,指令标签如page、include、taglib用于配置页面属性或引入自定义标签库,动作标签如jsp:include、jsp:forward用于控制页面流程。 2. JSTL(JavaServer...

    java中web标签大全

    这两个模板引擎都支持自定义标签,可以根据项目需求扩展功能。 总的来说,Java Web中的这些标签库为开发者提供了丰富的工具,使他们能够更专注于业务逻辑,而不是页面的呈现细节。合理利用这些标签,可以显著提高...

    精通Apache Velocity

    3. **可扩展性**:用户可以通过自定义宏(macro)和指令(directive)来扩展 Velocity 的功能,满足不同的开发需求。 4. **易于集成**:Velocity 可以轻松地与其他 Java 应用程序框架集成,如 Struts、Spring 等。 ...

    Velocity用户手册

    VTL(Velocity Template Language)是Velocity的核心,它提供了一系列指令(如#set、#if、#foreach)和引用机制,使得在模板中嵌入动态数据变得简单。例如,`#foreach`循环可以遍历集合,`#if`判断可以根据条件展示...

    Velocity模板使用指南中文版

    - **Velocity**:一个基于Java的模板引擎,能够实现在Web页面中引用Java代码中定义的数据对象和方法。 - **目标群体**:适用于Web设计师和Java开发者,旨在帮助他们实现纯正的MVC架构系统。 #### 二、Velocity的...

    自定义 Hibernate Tools 的模板

    Velocity允许你使用#set, #if, #foreach等指令,并可以引用Java对象的属性。 - Freemarker:另一种常见的模板引擎,更加强大,支持更多的逻辑控制和数据处理。 2. **创建自定义模板**: - 分析项目需求,确定...

    sitemesh2 集成velocity 装饰页面乱码

    3. **velocity模板**:在velocity模板文件(.vm)顶部添加`#set($encoding = "UTF-8")`指令,确保模板在解析时使用UTF-8编码。 4. **sitemesh配置**:修改sitemesh的配置文件(通常为`sitemesh.properties`),设置...

    Struts标签 解说和练习

    深入理解Struts标签库,可以学习如何自定义标签,以满足项目中特殊的需求。同时,了解Struts2的FreeMarker或Velocity模板语言,可以更好地利用Struts2提供的标签库。 总结,Struts标签是提高开发效率的有效工具,...

    JSP技术文档

    JSP技术文档通常包含了关于JSP语法、生命周期、内置对象、指令、动作元素、EL表达式以及自定义标签等全面信息。 1. **JSP语法** JSP页面主要由两部分组成:静态内容(HTML、CSS、JavaScript)和动态内容(Java代码...

    struts2常用标签总结

    Struts2的标签库不仅限于JSP页面,也可以在Velocity和FreeMarker等模板技术中使用。 1. **Struts2的作用** - **简化视图**:Struts2的标签库提供了主题和模板功能,帮助开发者快速创建美观且结构清晰的视图页面。 ...

    模板引擎velocitye、nvelocitye手册

    5. **自定义和扩展**:Velocity 允许用户自定义工具包(Velocity Tools),扩展其功能,如自定义标签库(Taglibs)和宏库,以满足特定项目需求。 6. **性能优化**:Velocity 在处理大量数据和复杂模板时,能够保持...

    struts2标签详解(收集)汇编.pdf

    - **引入标签库**:在JSP页面中,需使用`&lt;%@ taglib&gt;`指令引入Struts2的标签库,例如`&lt;%@ taglib uri="/struts-tags" prefix="s"%&gt;`。 - **配置web.xml**:在`web.xml`中声明Struts2过滤器,如`&lt;filter-class&gt;org....

Global site tag (gtag.js) - Google Analytics