`
bit1129
  • 浏览: 1049057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Velocity二]自定义Velocity指令

 
阅读更多

什么是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自定义标签无法注入spring的Service解决办法

    用springMVC+velocity时,当使用自定义标签,发现自定义标签无法注入spring的其它服务类,归根源码发现,velocity的源码中有一段,有一段代码永远获取的是新实例。所以,把这个地方的源码改了,所以使用这个的时候,...

    velocity语法

    当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示: #set($directoryRoot = "www" ) #set($templateName = "index.vm" ) #set($template = "$directoryRoot/$templateName" ) $template 输出...

    Java进阶教程Velocity快速掌握模板引擎视频

    第二部分我们会使用velocity作为web项目的视图, 实现基础数据的CRUD 2. 课程特色 Velocity是Apache顶级项目从2007-02-08发布第一个可用版本开始, 一直广受欢迎 ! 但是遗憾的是 , 市面上并没有一款详细的Velocity教程...

    velocity.min.js

    利用velocity来定义动画序列,可以直接使用velocity.js中预定义动画开发自己的网页动画,也可以利用velocity.js自定义动画

    Velocity 和 FreeMarker区别

    Velocity 和 FreeMarker区别 对于大部分的应用来说,使用 FreeMarker 比 Velocity 更简单,因为 Velocity 还必须编写一些自定义的

    Velocity模板引擎Velocity模板引擎

    Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎Velocity模板引擎

    velocity-engine-core-2.3-API文档-中英对照版.zip

    赠送jar包:velocity-engine-core-2.3.jar; 赠送原API文档:velocity-engine-core-2.3-javadoc.jar; 赠送源代码:velocity-engine-core-2.3-sources.jar; 赠送Maven依赖信息文件:velocity-engine-core-2.3.pom;...

    velocity-engine-core-2.3-API文档-中文版.zip

    赠送jar包:velocity-engine-core-2.3.jar 赠送原API文档:velocity-engine-core-2.3-javadoc.jar 赠送源代码:velocity-engine-core-2.3-sources.jar 包含翻译后的API文档:velocity-engine-core-2.3-javadoc-...

    velocity为空判断

    在使用velocity作为视图层时候,经常会碰到为空的判断,这里整理了velocity为空判断

    velocity所需的jar包

    开发velocity所需的jar包

    Velocity1.4

    Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity Velocity

    velocity-1.7-API文档-中文版.zip

    赠送jar包:velocity-1.7.jar; 赠送原API文档:velocity-1.7-javadoc.jar; 赠送源代码:velocity-1.7-sources.jar; 包含翻译后的API文档:velocity-1.7-javadoc-API文档-中文(简体)版.zip 对应Maven信息:...

    模板:velocity和freemarker的比较

    模板:velocity和freemarker的比较模板:velocity和freemarker的比较

    Velocity入门教程(Spring集成Velocity)

    Velocity入门教程,语法,Velocity布局,Spring框架集成Velocity

    Velocity-API.chm--采用官方文档制作-超值的Velocity API参考文档。

    Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员...

    velocity-1.5.jar.zip( 359 k)

    Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员...

    velocity-tools-2.0.jar

    velocity-tools-2.0.jar velocity-tools-2.0.jar velocity-tools-2.0.jar velocity-tools-2.0.jar velocity-tools-2.0.jar

    velocity标签 、velocity教程

    打开网址:http://www.web-tag.net/all_17.htm 就是velocity标签大全 、教程 或下载CHM格式帮助文档

    velocity-1.7-sources.zip

    velocity 的源代码 Velocity 是一个基于 Java 的模板引擎框架,提供的模板语言可以使用在 Java 中定义的对象和变量上。Velocity 是 Apache 基金会的项目,开发的目标是分离 MVC 模式中的持久化层和业务层。但是在...

    Velocity+Struts 配置

    Velocity 是一个基于Java的模版引擎。它允许web 页面设计者引用JAVA代码预定义的方法。Web 设计者可以根据MVC模式和JAVA程序员并行工作,这意味着Web设计者可以单独专注于设计良好的站点,而程序员则可单独专注于...

Global site tag (gtag.js) - Google Analytics