`
bit1129
  • 浏览: 1070110 次
  • 性别: 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-1.7.jar

    4. **可扩展性**:Velocity支持自定义指令和工具,可以轻松扩展其功能以满足特定需求。 5. **性能**:Velocity在执行速度上表现出色,因为它在编译时就生成了Java字节码,从而提高了运行效率。 **依赖关系:** 在...

    velocity的jar包

    1. **模板引擎**:Velocity提供了一个强大的模板引擎,允许开发者使用简单的文本格式来创建动态页面,模板中的指令由#号开头,如#{if}、#{foreach}等。 2. **模板语言**:Velocity模板语言(VTL)是 Velocity 的...

    Velocity用户手册 中文版

    1. **模板(Template)**:模板是Velocity的核心,它是HTML或XML等静态页面中嵌入了Velocity指令的文件,用于生成最终的输出文档。 2. **上下文(Context)**:上下文是模板和应用程序之间的桥梁,它存储了模板需要...

    velocity的学习资料

    - 自定义指令:可以通过扩展Velocity,编写自定义指令以满足特定需求。 7. **最佳实践** - 尽量避免在模板中进行复杂的逻辑处理,保持模板简洁。 - 合理使用`#set`指令,避免全局变量污染。 - 使用`#macro`定义...

    Velocity

    5. **指令集**:Velocity提供了一系列内置指令,如#set、#if、#foreach等,用于控制模板的逻辑流程。 6. **可扩展性**:Velocity允许自定义宏库和工具,进一步扩展其功能。 ### 使用示例 在Velocity模板中,我们...

    velocity语法

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

    velocity入门使用教程

    3. 指令:Velocity提供了一系列内置指令,如#set、#if、#foreach、#include等,用来控制模板逻辑。 4. 宏:定义可复用的代码块称为宏,可以通过`#macro`指令定义,通过`#end`指令结束。 #### velocity.properties...

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

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

    Velocity 模版

    - **可扩展性强**:Velocity 支持自定义指令和工具,可以根据需求进行扩展。 **5. 实战经验分享** 在实际项目中,`Java的模板引擎Velocity初体验.doc` 可能包含了初学者如何快速上手 Velocity 的步骤和常见问题。...

    velocity+Java开发指南中文版.zip

    4. **可扩展性**:Velocity允许自定义宏库和工具方法,增强了模板的功能和灵活性。 总的来说,Velocity作为一个强大的模板引擎,为Java开发者提供了便利的手段来生成动态内容,提高开发效率和代码的可维护性。通过...

    Velocity用户手册(中文)

    4. **可扩展性**: Velocity支持自定义指令和宏,可以轻松地扩展功能以满足特定需求。 5. **社区支持**: 作为Apache项目,Velocity有着丰富的文档和活跃的社区支持,遇到问题时可以得到及时的帮助。 **Velocity核心...

    velocity-1.6.2.zip

    - **强大的内置指令**:Velocity 提供了丰富的内置指令,如 #if、#foreach、#set 等,用于控制流程和数据处理。 - **良好的扩展性**:Velocity 支持自定义方法和宏,可以轻松扩展其功能。 在实际应用中,Velocity ...

    velocity 电子书

    - 配置Velocity引擎涉及到设置资源加载器、缓存策略、错误处理以及自定义指令等。 - 通过调整配置,可以优化Velocity的性能和适应不同项目需求。 5. **Velocity与MVC模式** - 在Model-View-Controller架构中,...

    Java Web项目开发案例精粹--Velocity简单实例

    在Velocity中,开发者定义了模板(Template),这些模板包含HTML、CSS和JavaScript等静态内容,以及Velocity指令(如#set、#if、#foreach等)。Velocity引擎负责解析这些模板,执行嵌入的Java代码,并将结果合并到...

    Velocity小demo

    4. **可扩展性**:Velocity 支持自定义指令和方法,可以根据需求扩展其功能。 通过这个简单的 "Velocity 小 demo",你可以了解到 Velocity 如何工作以及如何在实际项目中使用它。进一步深入学习,你会发现 Velocity...

    Velocity_API

    Velocity 允许自定义指令和事件处理器,以适应特定的业务需求。 总结,Velocity API 提供了一套强大且灵活的工具,帮助开发者构建高效的数据驱动的模板。通过理解和熟练运用 Velocity API,我们可以创建出既美观又...

    Velocity资料汇总

    1. **模板(Template)**:模板是Velocity的基本元素,它是HTML或其他格式的文档,其中包含Velocity指令和变量。在运行时,这些指令和变量会被替换为相应的值。 2. **变量(Variable)**:在模板中,变量以`$`符号...

    velocity 配置jar包

    - **自定义指令(Directives)**:你可以通过扩展 Velocity,实现自定义的 VTL 指令,满足特定需求。 - **事件处理器(Event Handlers)**:Velocity 提供了一套事件处理机制,允许你在模板解析和渲染过程中进行...

Global site tag (gtag.js) - Google Analytics