什么是Velocity?以及Velocity的语法

什么是Velocity?

Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离 !

在这里插入图片描述

应用场景

  • Web应用程序 : 作为为应用程序的视图, 展示数据。

  • 源代码生成 : Velocity可用于基于模板生成Java源代码

  • 自动电子邮件 : 网站注册 , 认证等的电子邮件模板

  • 网页静态化 : 基于velocity模板 , 生成静态网页

组成结构

在这里插入图片描述

Velocity主要分为app、context、runtime和一些辅助util几个部分。

  • app模块 : 主要封装了一些接口 , 暴露给使用者使用。主要有两个类,分别是Velocity(单例)和VelocityEngine。

  • Context模块 : 主要封装了模板渲染需要的变量

  • Runtime模块 : 整个Velocity的核心模块,Runtime模块会将加载的模板解析成语法树,Velocity调用>mergeTemplate方法时会渲染整棵树,并输出最终的渲染结果。

  • RuntimeInstance类为整个Velocity渲染提供了一个单例模式,拿到了这个实例就可以完成渲染过程了

基础语法

VTL介绍

Velocity Template Language (VTL) , 是Velocity 中提供的一种模版语言 ,
旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中

VTL的语句分为4大类:注释 , 非解析内容 , 引用和指令

VTL注释

行注释
## 行注释内容
块注释
#*
块注释内容1
块注释内容2
*#
文档注释
#**
文档注释内容1
文档注释内容2
*#

非解析内容

所谓非解析内容也就是不会被引擎解析的内容。

#[[
非解析内容1
非解析内容2 
]]#
 
示例: this.#[[$]]  等于  this.$

引用

变量引用

引用语句就是对引擎上下文对象中的属性进行操作。语法方面分为常规语法($属性)和正规语法(${属性})。

$变量名, 若上下文中没有对应的变量,则输出字符串"$变量名"
${变量名},若上下文中没有对应的变量,则输出字符串"${变量名}" 
$!变量名, 若上下文中没有对应的变量,则输出空字符串"" 
$!{变量名}, 若上下文中没有对应的变量,则输出空字符串""
属性引用
$变量名.属性, 	若上下文中没有对应的变量,则输出字符串"$变量名.属性"
${变量名.属性}	若上下文中没有对应的变量,则输出字符串"${变量名.属性}"
$!变量名.属性	若上下文中没有对应的变量,则输出字符串""
$!{变量名.属性}	若上下文中没有对应的变量,则输出字符串""
方法引用

方法引用实际就是指方法调用操作,关注点返回值和参数 , 方法的返回值将输出到最终结果中

$变量名.方法([入参1[, 入参2]*]?), 常规写法
${变量名.方法([入参1[, 入参2]*]?)}, 正规写法
 
$!变量名.方法([入参1[, 入参2]*]?), 常规写法
$!{变量名.方法([入参1[, 入参2]*]?)}, 正规写法

指令

指令主要用于定义重用模块、引入外部资源、流程控制。指令以 # 作为起始字符。

流程控制
#set

作用 : 在页面中声明定义变量

语法: #set($变量 = 值)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>set指令</h1>
#set($str = "hello world")
#set($int = 1)
#set($arr = [1,2])
#set($boolean = true)
#set($map = {"key1":"value1", "key2":"value2"})
 
## 在字符串中也可以引用之前定义过的变量
#set($str2 = "$str , how are you !")
#set($str3 = '$str , how are you !')
    
 
<h1>获取set指令定义的变量</h1>
${str}
${int}
${arr}
${boolean}
${map.key1}--${map.key2}
${str2}
${str3}
 
 
</body>
</html>
#if/#elseif/#else

作用 : 进行逻辑判断

语法 :

#if(判断条件)
  .........
#elseif(判断条件)
  .........
#else
  .........
#end 
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>if/elseif/else指令</h1>
#set($language="PHP")
 
#if($language.equals("JAVA"))
    java开发工程师
#elseif($language.equals("PHP"))
    php开发工程师
#else
    开发工程师
#end
 
</body>
</html>
#foreach

作用 : 遍历循环数组或者集合

格式:

#foreach($item in $items)
    ..........
    [#break]
#end
  • $items : 需要遍历的对象或者集合

      - 如果items的类型为map集合, 那么遍历的是map的value
    
  • $item : 变量名称, 代表遍历的每一项

  • #break : 退出循环

  • 内置属性 :

      - $foreach.index : 获取遍历的索引 , 从0开始
    
      - $foreach.count : 获取遍历的次数 , 从1开始
    
      - hasNext()判断是否有下一个元素
    
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
<h1>遍历数组</h1>
#foreach($str in $hobbies)
    ${foreach.index} -- ${str}  <br>
#end
 
<h1>变量对象集合</h1>
<table border="1px" align="center">
    <tr>
        <td>编号</td>
        <td>用户名</td>
        <td>密码</td>
        <td>邮箱</td>
        <td>年龄</td>
        <td>操作</td>
    </tr>
    #foreach($user in $users)
        <tr>
            <td>${foreach.index}</td>
            <td>${user.username}</td>
            <td>${user.password}</td>
            <td>${user.email}</td>
            <td>${user.age}</td>
            <td>
                <a href="">编辑</a>
                <a href="">删除</a>
            </td>
        </tr>
    #end
</table>
 
<h1>遍历map集合</h1>
<h2>遍历值</h2>
 #foreach($value in $map)
     $value
 #end
 
<h2>遍历键值对</h2>
#foreach($entry in $map.entrySet())
    $entry.key -- $entry.value
#end
 
 
</body>
</html>
引入资源
#include

作用 : 引入外部资源 , 引入的资源不会被引擎所解析

语法 : #include(resource)

  • resource可以为单引号或双引号的字符串,也可以为$变量,内容为外部资源路径。

  • 注意 : 路径如果为相对路径,则以引擎配置的文件加载器加载路径作为参考

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
#include("demo8.vm")
 
</body>
</html>
#parse

作用 : 引入外部资源 , 引入的资源将被引擎所解析

语法 : #parse(resource)

  • resource可以为单引号或双引号的字符串,也可以为$变量,内容为外部资源路径。

  • 注意 : 路径如果为相对路径,则以引擎配置的文件加载器加载路径作为参考系

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
#parse("demo8.vm")
 
</body>
</html>
#define

作用 : 定义重用模块(不带参数)

语法 :

#define($模块名称)
	模块内容
#end
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>定义模块</h1>
#define($table)
<table border="1px" align="center">
    <tr>
        <td>编号</td>
        <td>用户名</td>
        <td>密码</td>
        <td>邮箱</td>
        <td>年龄</td>
        <td>操作</td>
    </tr>
    <tr>
        <td>0</td>
        <td>zhangsan</td>
        <td>123456</td>
        <td>zhangsan@qq.com</td>
        <td>18</td>
        <td>
            <a href="">编辑</a>
            <a href="">删除</a>
        </td>
    </tr>
    <tr>
        <td>1</td>
        <td>lisi</td>
        <td>123456</td>
        <td>zhangsan@qq.com</td>
        <td>18</td>
        <td>
            <a href="">编辑</a>
            <a href="">删除</a>
        </td>
    </tr>
    <tr>
        <td>2</td>
        <td>wangwu</td>
        <td>123456</td>
        <td>zhangsan@qq.com</td>
        <td>18</td>
        <td>
            <a href="">编辑</a>
            <a href="">删除</a>
        </td>
    </tr>
    <tr>
        <td>3</td>
        <td>tianqi</td>
        <td>123456</td>
        <td>zhangsan@qq.com</td>
        <td>18</td>
        <td>
            <a href="">编辑</a>
            <a href="">删除</a>
        </td>
    </tr>
</table>
#end
 
<h1>使用模块</h1>
$table
$table
$table
 
</body>
</html>
#evaluate

作用 : 动态计算 , 动态计算可以让我们在字符串中使用变量

语法 : #evalute(“计算语句”)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>动态计算</h1>
#set($name = "over")
 
#evaluate("#if($name=='over') over  #else  not over #end")
 
#if($name=='over')
    over
#else
    not over
#end
 
</body>
</html>
宏指令

作用 : 定义重用模块(可带参数)

语法 :

定义语法

#macro(宏名 [$arg]?)
   .....
#end
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>定义宏</h1>
#macro(table $list)
<table border="1px">
    <tr>
        <td>编号</td>
        <td>用户名</td>
        <td>密码</td>
        <td>邮箱</td>
        <td>年龄</td>
        <td>操作</td>
    </tr>
    #foreach($item in $list)
    <tr>
        <td>${foreach.count}</td>
        <td>${item.username}</td>
        <td>${item.password}</td>
        <td>${item.email}</td>
        <td>${item.age}</td>
        <td>
            <a href="">编辑</a>
            <a href="">删除</a>
        </td>
    </tr>
    #end
</table>
#end
 
<h1>调用宏</h1>
#table($users)
 
</body>
</html>
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个前端人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值