Velocity模板引擎

我与影子孤独终老i 提交于 2020-02-04 11:16:07

1.Velocity模板引擎

1.1.简介

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

1.2.使用场景

开发Velocity的目标是分离 MVC 模式中的持久化层和业务层。但是在实际应用过程中,Velocity 不仅仅被用在了 MVC 的架构中,还可以被用在以下一些场景中:

  • Web应用:开发者在不使用JSP的情况下,可以用Velocity让HTML具有动态内容的特性
  • 源代码生成Velocity可以被用来生成Java代码、SQL或者PostScript,有很多开源和商业开发的软件是使用Velocity来开发的
  • 自动Email:很多软件的用户注册、密码提醒或者报表都是使用Velocity来自动生成的,使用Velocity可以在文本文件里面生成邮件内容,而不是在Java代码中拼接字符串
  • 转换XML:Velocity提供一个叫Anakia的ant任务,可以读取XML文件并让它能够被Velocity 模板读取。一个比较普遍的应用是将xdoc文档转换成带样式的HTML文件

2.基本语法

2.1.注释

  • 单行:## 句子
  • 多行:#* 句子句子 *#
  • 文档格式:#** 句子句子 **#

2.2.变量定义

#set($name =“velocity”)

等号后面的字符串Velocity引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换

#set($hello =“hello $name”)

上面的等式会给$hello赋值为“hello velocity”

2.3.变量的使用(两种)

1.${name}:推荐
2.$name

  • 因为在模板中同时可能定义了类似$name和$names 的两个变量,如果不选用大括号的话,引擎就没有办法正确识别$names 这个变量
  • 对于一个复杂对象类型的变量,例如$person,可以使用${person.name}来访问person的name属性。值得注意的是,这里的${person.name}并不是直接访问person的name属性,而是访问person的getName()方法,所以${person.name}和${person.getName()}是一样的
  • 变量的作用域是从上而下,赋值后都会有,比如:
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

2.4.变量赋值

定义一个变量,同时给这个变量赋了值。对于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])

2.5.循环

在Velocity中循环语句的语法如下:

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

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

#foreach ($item in $list)
    $foreach.index   ## 自带方法 : 计数从0开始 相当于index  
    $foreach.hasNext ## 自带方法 : 等于false代表是最后一个 
    $foreach.count   ## 自带方法 : 计数 从1开始 相对于$velocityCount
    $foreach.first   ## 自带方法 : 是否是第一个
    $foreach.last    ## 自带方法 : 是否是最后一个
    
    #if( $foreach.count > 3 )
        #break       ## 使用 #break指令在任何时候停止循环
    #end 

    $velocityCount   ## 计数 从1开始
    This is $item</br>
#end

## 输出: 1 this is a

实例:

## 数据格式
$datas的值:
{
  {“key123":{"bonus":"1","name":"aa"}},
  {"key124”:{"bonus”:"2","name":”bb"}}
}

$yanShi的值:
{
  {“key123":{"title":"特殊门诊医疗金","values":[600000,600000,600000]}},
  {"key124”:{"title”:”住院医疗金","values”:[100000,200000,600000]}}
}

## 方法一:
#foreach ( $key in $datas.keySet())
    Key: $key -> Value: $datas.get($key) 
#end
## 输出:Key:key123 -> Value: {"bonus":"1","name":"aa"}

## 方法二:
#foreach ( $key in $bonus_datas.entrySet())
    Key: $key.getKey() -> Value: $key.getValue() 
    $yanShi.getJSONObject($key.getKey()).get(“title”) 
    ## 例如循环datas里面再对应去读yanShi的title 
#end
## 输出:Key:key123 -> Value: {"bonus":"1","name":"aa"}

读取不同数据的方法:

  • .get()
  • .getString()
  • .getJSONArray()
  • .getJSONObject()
  • .getBooleanValue()

2.6.条件语句

条件语句的语法如下

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

2.7.关系逻辑符

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

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

2.8.宏

Velocity中的宏可以理解为函数定义,语法如下:

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

调用这个宏的语法是:

#macroName(arg1 arg2 …)

这里的参数之间使用空格隔开,使用实例如下:

#macro(sayHello $name)
hello $name
#end
#sayHello(“velocity”)

输出的结果为 hello velocity

2.9.#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”)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!