技术开发 频道

Java进阶:编写自定义的Velocity指令

   在 Velocity 模板语言的语法中,以美元符 $ 开头的为变量的声明或者引用,而以井号 # 开头的语句则为 Velocity 的指令(Directive)。其中 Velocity 的指令又分为内置指令、自定义宏和自定义指令。 Velocity 包含下列这些内置指令:  

 另外也可以通过宏来扩展指令,例如,请看下面这个宏的定义:

#macro(invoke $__p_page) 
    #if($__p_page.startsWith("/")) 
        #parse($__p_page) 
    #else 
        #set($__uri = $resource.this_vm()) 
        #set($__path = $__uri.substring(0, $__uri.lastIndexOf("/"))) 
        #parse("$__path/$__p_page") 
    #end 
 #end
 

上面这个名为 invoke 的宏的作用是以相对路径的方式嵌入某个动态的页面。使用的方法是 #invoke( “ hello.vm ” )。尽管 Velocity 的自定义宏可以用来扩展指令,但是宏有一个不足的地方,它更适合用来执行一些比较通用的代码嵌入和简单的功能处理。

 由此引出来的问题是,我如何来编写一个类似于 #foreach 的指令呢,并具有逻辑判断的功能? 

Velocity 的指令类型简介 

在 Velocity 的指令定义上,有两种指令类型分别是行指令和块指令。行指令例如 #set($name= ” Winter Lau ” ) 赋值指令,只有一行,中间没有任何的代码;而块指令例如循环指令 #foreach($idx in [1..20]) $idx #end,块指令需要用 #end 来结束。在 Velocity 自带的指令中块指令包括有:#if #elseif #foreach #define 和 #macro 这几个指令,除此之外都是行指令。 

编写自定义的 Velocity 指令  

Velocity 允许您对指令系统进行扩展,在 Velocity 引擎初始化的时候会加载系统内置指令和用户的自定义指令。系统的内置指令已经在 Velocity 的 Jar 包中的 directive.properties 文件中定义,不建议直接修改该文件。而自定义的指令要求用户在 velocity.properties 文件中定义的,例如:userdirective=net.oschina.toolbox.CacheDirective。如果是多个自定义指令则使用逗号隔开。 

所有的自定义指令要求扩展 org.apache.velocity.runtime.directive.Directive 这个类。为了更加形象直观的表现 Velocity 自定义指令的优点,接下来我们将以一个实际的应用场景进行讲解。 

在该应用场景中,所有的页面请求直接指向 vm 文件,中间没经过任何的控制器。数据是通过 Velocity 的 toolbox 直接读取并显示在页面上。如果数据是来自数据库的,而且访问量非常大的时候,我们就需要对这些数据进行缓存以便快速响应用户请求和降低系统负载。一种方法是直接在 toolbox 的读取数据的方法中进行数据的缓存;另外一种就是我们接下来要介绍的,通过编写自定义的缓存指令来缓存页面上的某个 HTML 片段。

0
相关文章