当前位置:首页 > 开发 > 开源软件 > 正文

[Velocity二]自定义Velocity指令

发表于: 2014-08-19   作者:bit1129   来源:转载   浏览:
摘要: 什么是Velocity指令 在Velocity中,#set,#if, #foreach, #elseif, #parse等,以#开头的称之为指令,Velocity内置的这些指令可以用来做赋值,条件判断,循环控制等脚本语言必备的逻辑控制等语句,Velocity的指令是可扩展的,即用户可以根据实际的需要自定义Velocity指令   自定义指令(Directive)的一般步骤 &nbs

什么是Velocity指令

在Velocity中,#set,#if, #foreach, #elseif, #parse等,以#开头的称之为指令,Velocity内置的这些指令可以用来做赋值,条件判断,循环控制等脚本语言必备的逻辑控制等语句,Velocity的指令是可扩展的,即用户可以根据实际的需要自定义Velocity指令

 

自定义指令(Directive)的一般步骤

 1.定义自定义指令对应的Java代码,这个需要继承自org.apache.velocity.runtime.directive.Directive,覆盖其中的三个抽象方法,

  • getName(表示指令的名字,下面的例子中,自定义指令的名字是test)
  • getType(表示是行级指令还是块级指令,行级指令解析得到的只有一行,不需要#end指令表明指令结束;而块级指令则需要使用#end显示的指明指令的结束)
  • render( public boolean render(InternalContextAdapter context, Writer writer,Node node),用于根据需要,对vm页面进行渲染,以返回期望在页面上显示的值)

 2. 在vm文件中使用自定义指令,比如#test,每个指令可以有参数,需要再#test的API文档中清楚说明,例如示例中的#test指定可以包含3个参数

 

 3. 在velocity.properties中指明用户自定义的指令类

 

 

 

指令Java代码

package com.tom.directive

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 java.io.IOException;
import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestDirective extends Directive {

    private static final VelocityEngine velocityEngine = new VelocityEngine();

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

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

    @Override
    public boolean render(InternalContextAdapter context, Writer writer,
                          Node node) throws IOException, ResourceNotFoundException,
            ParseErrorException, MethodInvocationException {
        SimpleNode sn = (SimpleNode) node.jjtGetChild(0);
        String value = (String) sn.value(context);
        sn = (SimpleNode) node.jjtGetChild(1);
        Serializable s = (Serializable) sn.value(context);

        sn = (SimpleNode) node.jjtGetChild(2);
        Object data = sn.value(context);
        Map map = new HashMap();
        List<String> strings = new ArrayList<String>();
        strings.add("MSN");
        strings.add("QQ");
        strings.add("Gtalk");
        map.put("data", strings);
        String vel = "#foreach($element in $data) \n<li>$element</li>\n  #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();
        velocityEngine.evaluate(context, writer, "", vimStr);
        return writer.toString();
    }
}

 

 velocity代码

 

<html>
<body>
   <div id="123">
       #test("Attribute1","Attribute2","Attribute3")
    </div>
</body>
</html>

 

velocity.properties文件的修改

  需要把velocity.properites文件放到classpath根目录,在userdirective这个节点添加用户自定义的指令,多个指令类需要用,\进行分割

 

userdirective=com.tom.directive.DevelopmentDirective,\
   com.tom.directive.TestDirective

 

示例结果

 

以上代码经Velocity模板引擎解析后,得到的结果是

 

<html>
<body>
   <div id="123">
       <li>MSN</li>
       <li>QQ</li>
       <li>Gtalk</li>
    </div>
</body>
</html>

 

 

[Velocity二]自定义Velocity指令

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
参考爱国者转载的文章 velocity整合servlet 我使用的是velocity1.7和velocity tools2.0 @红薯大哥 V
第四部分:与 Struts 框架的互操作 Struts 是一种构造基于 MVC 模型的框架的流行 Web 应用程序。Str
原文地址: http://www.khotyn.com/2011/07/22/velocity_sourcecode/ 很久之前就接触了Velocity,但
代码下载地址:http://download.csdn.net/detail/jxlgzwh/6025487 项目结构: add.vm 源码: <ht
之前在“velocity源码分析:velocity初始化 ”文章中粗略地介绍了velocity整体的初始化过程,包括各
之前在“velocity源码分析:velocity初始化”文章中粗略地介绍了velocity整体的初始化过程,包括各
Velocity是一个基于java的模板引擎。它允许任何人仅仅简单的使用模板语言来引用由java代码 定义的对
http://velocity.apache.org/tools/releases/1.3/generic/ http://velocity.apache.org/tools/devel/
http://velocity.apache.org/tools/releases/1.3/generic/ http://velocity.apache.org/tools/devel/
(1)为什么要使用模版语言? 在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTML、XML等
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号