velocity语言的介绍

农夫 农夫     2022-08-03     130

关键词:

Velocity语言的介绍

                                                    2016-09-06 15:39:25     

语言介绍            

Velocity是一种Java模版引擎技术,是一个基于Java的模板引擎(template engine)。她允许任何人简简单单的使用模板语言类引用由Java代码定义的对象。

当Velocity应用于web开发时,界面设计人员可以和Java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序员关注业务逻辑编码。Velocity将Java代码从web页面中分离出来,这样web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。

 

基础使用             

Velocity中,变量的定义都是使用“$”开头的,$作为Velocity的标识符。字母、数字、中划和下划线都可以作为Velocity的定义变量。

 

Velocity——注释

  单行注释,使用##           如:##<div class="tt">$shopUser.username</div> 会隐藏此div

  多行注释,使用 #* comment *#      如: #* <div class="tt">$shopUser.username</div> *#

 

Velocity——引用

注意:规范的引用写法应该是${Foo},也可以使用下面的形式; 规范的肯定是不会错的。

如果没有对应的引用,VTL会作为普通的字符串处理。

在Velocity Template Language(VTL)中,有三种类型的引用: 变量,属性,方法。

所有的引用都被看做是字符串,如果某个引用是一个整型值,Velocity会调用toString()方法,将她转换为String。

 

变量:(如:$username)

变量是由$和紧跟其后的VTL标识符组成的。

VTL标识符必须以字母开头,后面可以包含并且仅能包含字母数字下划线以及减号

像$2.4这样的字符串,是不会被识别为变量的,因为2.4不是一个VTL标识符。

 

属性:(如:$shopUser.username)

属性是由四部分组成,依次是$+VTL标识符+“.”+VTL标识符。

这个标识符有两个含义,它可以表示在shopUser标记的hashtable中寻找并返回这个key对应的value,也可以表$shopUser.getUsername这个方法(方法在java程序中定义)。如:{'$!shopUser.getUsername()'}。

 

方法:如($shopUser.getPass("test"))

方法是由四部分组成,依次是$+VTL+'.'+函数调用。这里的函数调用是可以带参数的。

很显然,属性有时是方法的一种简写,$Foo.bar和$Foo.getbar()是等价的,这种情况下,尽量使用属性的形式。但是方法有参数的话,就没有和它等价的属性了。

 

属性的搜索规则:

属性可以表示为调用方法,也可表示从hashtable中找值,对于$Foo.bar来说,Velocity会按照以下顺序解析:

$Foo.getbar()>$Foo.getBar()> $Foo.get("bar")>$Foo.isBar()

而对于$Foo.Bar来说,Velocity会按照以下顺序解析:

$Foo.getBar() > $Foo.getbar() > $Foo.get("Bar") > $Foo.isBar()

所以,前两个是寻找方法,第三个是在hashtable中找值,第四个是一个is判断。

另外需要注意的是,属性不会被解析为对象的实例变量。$Foo.bar可以表示$Foo.getbar()或者$Foo.get("bar"),但是它不表示Foo这个java对象的bar属性。

 

Velocity——指令

引用可以让模板设计者生成动态内容,而指令允许设计者真正的负责页面的展现和内容。

 

#Include和#Parse都是用于将本地文件引入当前文件的指令,而且被引入的文件必须位于TEMPLATE_ROOT(配置Velocity视图文件时设置的路径,稍后再SpringMvc整合Velocity时介绍)。

 

#Include

被#Include引入的文件,其内容不会被Velocity引擎解析,所以这些文件应该是静态模板,即不含有VTL的模板。使用#Include()指令时,参数是被双引号括起来的文件名或者是表示文件名的变量。如果有多个文件,以逗号隔开即可。比如#Include("mode.vm", "b.html", $file)。

 

#Parse

#Parse用来在当前模板中引入并执行另一个(本地的)模板——可以是静态的,也可以是动态的——并把结果嵌入到当前位置。#Parse()指令的参数,可以是一个双引号括起来的文件名,也可以是一个变量,但是它不能接受多个参数

被#Parse引入的文件仍然可以使用#Parse指令。在velocity.properties文件中有一个属性directive.parse.max.depth,默认值是10,它指定了#Parse嵌套的最大层次。既然#Parse嵌套是允许的,#Parse递归也是允许的。

假如a.vm #Parse b.vm,那么a.vm中定义的变量$v,在b.vm中可以随便使用。如果b.vm也定义了$v,那么b.vm中用到的将会是自己的$v,而不是a.vm中的$v。

 

#set

#set指令用于向一个变量或者属性赋值。

  其格式为 #set($username="chen")或者#set($username.bar=$test) 。

 

#if

#if指令用于判断某个条件是否为true。形式: #if()  #elseif()  #else  #end,和java中的用法基本相同。如下:

#if($userNameMap.get("name") == 'zhangsna')
    <div class='tt'>$userNameMap.get("name")</div>
#elseif($userNameMap.get("name") == 'zhangsan')
    <div class='tt'>不是zhangsna</div>
#else
     <div class='tt'>什么都不是</div>
#end

 

#foreach  

 

#foreach($userName in $userNames)
      $userName</br>
#end

 

上面这个例子中,$userNames可以是一个Vector,一个HashTable,一个数组。

在Velocity中,有一个变量$velocityCount用作循环计数,初始值是1。这个变量的名字和初始值是在velocity.properties文件里配置的。

 

Velocity——运算

判断是否为null

1、#if (! $userName) 判断$userName为空,判断非空为 #if ($userName) 

2、使用null工具判断 

    #if($null.isNull($userNames)) 

    在需要这个判断作为一个判断字句时,比如我要你判断一个集合为null或为空时只能使用这种方式了: 

    $if ($null.isNull($userNames) || $userNames.size()==0) 

 

3、判断为空的方法 

#if("" == $变量名) 或 #if("" != $变量名) 

 

"!"的使用

“!”用来强制把不存在的变量或变量值为null的对象显示为空白。

如当页面中包含$userName,如果userName对象有值,将显示msg的值,如果不存在msg对象,则在页面中显示$userName字符。

 

Velocity——宏

#macro(d)

#macro指令用于定义一个VTL模板的重复代码块——宏。如:

#macro(d)
<tr><td>宏</td><tr>
#end

Velocity中写入#d或者#d(),则会替换为‘<tr><td>宏</td><tr>’。

 

#macro(d $name)

宏也可以带参数,而且是任意多个参数。不过,宏定义时有几个参数,宏调用时就要提供同样数目的参数。

#macro( d $name)
<tr><td>$name</td></tr>
#end
#d("name1")

宏的参数可以是以下VTL元素中的任意一种:引用、字符串字面值、数值字面值、整数范围(比如[1 .. 10]、[$start .. $end])、数组、布尔值true或者false。

 

SpringMVC整合Velocity        

Velocity现在应用非常广泛,现在尝试将SpringMVC项目与Velocity整合

 

整合过程

1、主要涉及改变的文件:
  pom.xml(引入velocity的jar包)
  pbqshop-servlet.xml(视图配置,配置velocity)
  velocity.properties(velocity配置文件)

  1)pom.xml中引入Velocity是由的jar包

<!-- Velocity 模板 -->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>
        <dependency>
            <groupId>velocity-tools</groupId>
            <artifactId>velocity-tools-generic</artifactId>
            <version>1.2</version>
        </dependency>         
View Code

  2)pbqshop-servlet.xml中视图配置

 <!-- 视图模式配置,Velocity配置文件 -->
    <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
        <property name="resourceLoaderPath" value="template"></property>
        <property name="configLocation" value="classpath:velocity.properties"></property>
    </bean>
    <!-- 配置后缀 -->
    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
        <property name="contentType" value="text/html;charset=UTF-8"></property>
        <property name="suffix" value=".vm"></property>
    </bean>
View Code

  3)velocity.properties(velocity配置文件)

#encoding
input.encoding=UTF-8
output.encoding=UTF-8
contentType=text/html;charset=UTF-8
#autoreload when vm changed
file.resource.loader.cache=true
file.resource.loader.modificationCheckInterval=1
resource.manager.defaultcache.size=0
parser.pool.size=100
velocimacro.library.autoreload=false
View Code

 

velocity介绍及语法

1、Parse导入脚本:#parse("me.vm")2、"$"用来标识一个对象(或理解为变量)3、"{}"用来明确标识Velocity变量4、"!"用来强制把不存在的变量显示为空白,如当页面中包含$msg,如果msg对象有值,将显示msg的值,  如果不存在msg对象,则在... 查看详情

Velocity 模板语言中词法正确的语句是啥

】Velocity模板语言中词法正确的语句是啥【英文标题】:WhatisthelexicallycorrectstatementinVelocityTemplateLanguageVelocity模板语言中词法正确的语句是什么【发布时间】:2011-04-0501:42:32【问题描述】:以下代码行是我正在处理的模板中的行... 查看详情

使用 Velocity 模板语言创建 JSON 对象

】使用Velocity模板语言创建JSON对象【英文标题】:CreateJSONObjectwithVelocityTemplateLanguage【发布时间】:2019-08-0322:22:42【问题描述】:我正在使用AWSAppSync中的ApacheVelocity模板语言(VTL)。在我的请求模板中,我查询了具有不同元素的未... 查看详情

使用 Telosys 浏览 Velocity 模板语言中的目录

】使用Telosys浏览Velocity模板语言中的目录【英文标题】:BrowseadirectoryinVelocityTemplateLanguagewithTelosys【发布时间】:2019-08-1801:04:40【问题描述】:我正在尝试在VTL中编写模板以使用telosys生成java类。我的出发点是一个包含json文件(m... 查看详情

velocity模板

Velocity模板引擎介绍引:https://www.ibm.com/developerworks/cn/java/j-lo-velocity1/在现今的软件开发过程中,软件开发人员将更多的精力投入在了重复的相似劳动中。特别是在如今特别流行的MVC架构模式中,软件各个层次的功能更加独立,同... 查看详情

在 Velocity 模板语言中替换字符串的子字符串

】在Velocity模板语言中替换字符串的子字符串【英文标题】:ReplaceaSubstringofaStringinVelocityTemplateLanguage【发布时间】:2011-10-1404:56:46【问题描述】:我想用另一个字符串替换Velocity模板语言中字符串的一部分。例如:#set($a="Hello")#se... 查看详情

在 Apache Velocity 模板语言中获取文件目录

】在ApacheVelocity模板语言中获取文件目录【英文标题】:GetfiledirectoryinApacheVelocityTemplateLanguage【发布时间】:2018-01-2904:33:45【问题描述】:CLion使用Apache的Velocity模板语言(VTL)为C++和C文件创建模板。在CLion的帮助下(https://www.jetbrains... 查看详情

velocity教程

...Java的模板引擎,通过特定的语法,Velocity可以获取在java语言中定义的对象,从而实现界面和java代码的真正分离,这意味着可以使用velocity替代jsp的开发模式了(实际上笔者所在的公司已经这么做了)。这使得前端开发人员可以和Jav... 查看详情

在 Velocity 模板语言中创建和遍历数组

】在Velocity模板语言中创建和遍历数组【英文标题】:CreateanditeratethroughanarrayinVelocityTemplateLanguage【发布时间】:2011-09-0116:40:32【问题描述】:如何在VTL中创建一个数组并向数组中添加内容?还有如何通过索引检索数组的内容?... 查看详情

velocity——velocity遍历josn格式的字符串

使用velocity脚本语言遍历josn格式的字符串1、由于数据库会存储一些json格式的字符,为方便以后使用筛选如果这些数据我们查出来直接遍历使用velocity是根本行不通的,例如这样的话:java后端这样传@RequestMapping(value="/mad/velocity.htm... 查看详情

velocity语法全解---常用语法

...引擎(templateengine),它允许任何人仅仅简单的使用模板语言(templatelanguage)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。一、基本语法1、"#"用... 查看详情

springmvc集成velocity

...sp; Velocity是一个基于Java的模板引擎框架,提供的模板语言可以使用在Java中定义的对象和变量上。Velocity是Apache基金会的项目,开发的目标是分离MVC模式中的持久化层和业务层。但是在实际应用过程中,Velocity不仅仅被用在了M... 查看详情

velocity教程

...引擎(templateengine)。它允许任何人仅仅简单的使用模板语言(templatelanguage)来引用由java代码定义的对象。当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设... 查看详情

如何使用 Velocity 模板语言检查数组中是不是存在值

】如何使用Velocity模板语言检查数组中是不是存在值【英文标题】:HowtocheckifvalueexistsinanarrayusingVelocityTemplateLanguage如何使用Velocity模板语言检查数组中是否存在值【发布时间】:2019-12-2711:26:36【问题描述】:我不确定如何使用Velo... 查看详情

velocity学习4

...引擎(templateengine)。它允许任何人仅仅简单的使用模板语言(templatelanguage)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页... 查看详情

在 Apache Velocity 模板语言中附加字符串变量

】在ApacheVelocity模板语言中附加字符串变量【英文标题】:appendforstringvariableinApacheVelocityTemplateLanguage【发布时间】:2020-11-2015:25:42【问题描述】:我想在APIGateway映射模板中构造查询字符串。我有这样的东西#foreach($entryin$entries)#se... 查看详情

velocity自定义标签和指令(代码片段)

velocity本身支持自定义标签和指令的扩展,在Velocity模板语言的语法中,以美元符$开头的为变量的声明或者引用,而以井号#开头的语句则为Velocity的指令(Directive)。velocity支持的指令有:#set,#foreach,#if#else#end,#parse,#include,#evaluate,... 查看详情

velocity工作原理解析和优化

在MVC开发模式下,View离不开模板引擎,在Java语言中模板引擎使用得最多是JSP、Velocity和FreeMarker,在MVC编程开发模式中,必不可少的一个部分是V的部分。V负责前端的页面展示,也就是负责生产最终的HTML,V部分通常会对应一个编... 查看详情