• Velocity学习(二)之语法


    基本语法

    在 hellovelocity.vm 里面可以看到很多以 # 和$符开头的内容,这些都是 Velocity 的语法,在 Velocity 中所有的关键字都是以 # 开头的,而所有的变量则是以$开头

    一、变量

    变量定义

    #set($name="velocity")

    等号后面的字符串 Velocity 引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换。以 "$" 开头,第一个字符必须为字母

    变量可以包含的字符有以下内容:

    • alphabetic (a .. z, A .. Z) 

    • numeric (0 .. 9) 

    • hyphen ("-") 

    • underscore ("_")

    变量使用

    ${name}

    $name

    在模板文件中使用$name 或者${name} 来使用定义的变量。推荐使用${name} 这种格式,因为在模板中同时可能定义了类似$name 和$names 的两个变量,如果不选用大括号的话,引擎就没有办法正确

    识别$names 这个变量。

    对于一个复杂对象类型的变量,例如$person,可以使用${person.name} 来访问 person 的 name 属性。值得注意的是,这里的${person.name} 并不是直接访问 person 的 name 属性,而是访问 person 的

    getName() 方法,所以${person.name} 和${person.getName()} 是一样的,即${person.name}=${person.getName()}【1】

    变量赋值

    在第一小点中,定义了一个变量,同时给这个变量赋了值。对于 Velocity 来说,变量是弱数据类型的,可以在赋了一个 String 给变量之后再赋一个数字或者数组给它。可以将以下六种数据类型赋给一

    个 Velocity 变量:变量引用, 字面字符串, 属性引用, 方法引用, 字面数字, 数组列表。

    • #set($foo = $bar)

    • #set($foo =“hello”)

    • #set($foo.name = $bar.name)

    • #set($foo.name = $bar.getName($arg))

    • #set($foo = 123)

    • #set($foo = [“foo”,$bar])

    注意

    1、右值是null, 则左值不会被赋值,也就是说会保留以前的值。

    #set( $monkey = "monica" ) 
    #set( $monkey = $monkey_a )
    
    $monkey 

    结果输出:monica,因为右边的$monkey_a并没有定义过

    2、velocity模板中不会将reference解释为对象的实例变量,详情见上方【1】

    3、变量的作用域 是从上而下往后的都会有

    A $monkey 
    <div class="list">
        <div class="item">
            <div class="inner-title”>
                #set( $monkey = “jerry" )
                <span class="color_bg point"></span>保障额度高
                B $monkey 
            </div>
            <div class="inner-list">
                <p>年度基础免赔额:<span class="color bold">1万元</span>&nbsp;</p>
            </div>
            C $monkey 
        </div>
        <div class="item">
            D $monkey 
            <div class="inner-title">
                <span class="color_bg point"></span>住院医疗金
            </div>
            <div class="inner-list">
                <p>重症监护费用:不设单项最高年限额</p>
            </div>
        </div>
    E $monkey 
    </div>
    
    // 以上ABCDE的输出结果是
    // 输出结果: 除了A是字符串显示$monkey , 其余的都是:jerry

    二、循环

    #foreach($element in $list)
     This is $element
     $velocityCount
    #end

    Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个$velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1.

    #foreach循环得到的是值,和es6中的for...of相似

    velocityCount变量在配置文件中定义:

    # Default name of the loop counter

    # variable reference.

    directive.foreach.counter.name = velocityCount

    # Default starting value of the loop

    # counter variable reference.

    directive.foreach.counter.initial.value = 1

    自带方法:

    $foreach.index //自带方法 : 计数从0开始 相当于index

    $foreach.hasNext //自带方法 : 等于false代表是最后一个

    $foreach.count //自带方法 : 计数 从1开始 相对于$velocityCount

    $foreach.first //自带方法 : 是否是第一个

    $foreach.last //自带方法 : 是否是最后一个

    #break:

    使用 #break指令在任何时候停止循环

    #if( $foreach.count > 3 )
            #break     
    #end 

    三、条件语句

    形式一:#if #elseif #else #end

    #if(condition)
        ...
    #elseif(condition)
        …
    #else
        …
    #end

    形式二:#if #else #end

    #if(condition)
        ...
    #else
        …
    #end

    形式二:#if  #end

    #if(condition)
        …
    #end

    四、关系操作符

    Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应&&、||和!

    #if($foo && $bar)
    #end
    
    #if($foo || $bar)
    #end
    
    #if(!$bar)
    #end

    五、宏

    Velocity 中的宏可以理解为函数定义。

    定义

    #macro(macroName arg1 arg2 …)
    ...
    #end

    macroName:宏的名字

    arg1 / arg2:宏的参数

    调用

    #macroName(arg1 arg2 …)

    这里的参数之间使用空格隔开

    宏的例子

    #macro(sayHello $name)
    hello $name
    #end
    #sayHello(“velocity”)
    // 输出的结果为 hello velocity

    ⚠️不推荐在界面模板中大量使用,经过测试,宏不支持方法重载

    六、#parse 和 #include

    #parse 和 #include 指令的功能都是在外部引用文件,而两者的区别是,#parse 会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析#include 是将引入文件当成资源文件,会将

    入内容原封不动地以文本输出。分别看以下例子:

    // foo.vm 文件:
    #set($name =“velocity”)
    
    // parse.vm:
    #parse(“foo.vm”)
    
    // 输出结果为:velocity
    
    // include.vm:
    #include(“foo.vm”)
    
    // 输出结果为:#set($name =“velocity”)

    ⚠️包含文件#inclue("模板文件名")或#parse("模板文件名"),主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。

    七、注释

    单行注释:##

    多行注释:#*  *#

    文档格式注释:#**  *#

    八、单引号和双引号

    #set ($var="helo")

    test"$var" 返回testhello:双引号解析变量

    test'$var' 返回test'$var':单引号不解析变量

    可以通过设置 stringliterals.interpolate=false改变默认处理方式

    补充

    读取不同数据的方法:

    .get()

    .getString()

    .getJSONArray()

    .getJSONObject()

    .getBooleanValue()

    数组的常用方法操作:

    $myarray.isEmpty()数组是否为空

    $myarray.size()获取数组元素个数

    $myarray.get(2)获取数组指定下标的元素

    $myarray.add()增加元素

    参考

    官网

    使用 Velocity 模板引擎快速生成代码

    《Apache Velocity用户指南》官方文档

  • 相关阅读:
    我对闭包的几点初步认识
    python 字符串的split()函数详解
    使用两个不同类型的数据进行加法计算时,使用异常处理语句捕获由于数据类型错误而出现的异常,发生生成错误。是否继续并运行上次的成功生成?
    自定义一个抽象类,用来计算圆的面积
    接口里不能包括字段,构造函数,析构函数,静态成员或常量等,否则会导致错误
    抽象类与抽象方法的使用
    如何设置修改WPS批注上的用户信息名称
    在双击控件进入到程序代码编辑界面后,没写东西不影响运行,但删除后报错
    电影管理系统修改后,为啥不能识别数据库
    添加现有项到当前项目的几点注意事项
  • 原文地址:https://www.cnblogs.com/kunmomo/p/10168529.html
Copyright © 2020-2023  润新知