Velocity语言的介绍
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>
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>
3)velocity.properties(velocity配置文件)
#encoding
input.encoding=UTF-
output.encoding=UTF-
contentType=text/html;charset=UTF-
#autoreload when vm changed
file.resource.loader.cache=true
file.resource.loader.modificationCheckInterval=
resource.manager.defaultcache.size=
parser.pool.size=
velocimacro.library.autoreload=false
Velocity语言的介绍的更多相关文章
- 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输
002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...
- Cocos2d-x 脚本语言Lua介绍
Cocos2d-x 脚本语言Lua介绍 本篇博客记录Lua学习.学习来自eoe论坛,Lua语言开发Cocos2d-x游戏入门视频教程,猛戳下面地址: http://www.eoeandroid.com ...
- 一、Go语言开篇介绍
Go语言开篇介绍 Go语言 是Google公司 在2007开发一种静态强类型.编译型语言,并在 2009 年正式对外发布. Go语言以其近C的执行性能和近解析型语言的开发效率,以及近乎于完美的编译速度 ...
- Lua语言的介绍和编程语言的归类
Lua 本条目介绍的是一种编程语言.关于关于Lua在维基百科中的使用,请见"维基百科:Lua".关于"Lua"一词的其他意思,请见"卢阿". ...
- go语言基本介绍
Golang发展历史 1. 诞生历史a. 诞生与2006年1月2号下午15点4分5秒b. 2009发布并正式开源c. 2012年第一个正式版本Go 1.0发布d. 截至到2017年8月24号Go 1. ...
- Velocity模板引擎介绍
整理下Velocity使用方法,整理比较详细用例 1 Velocity基础语法 1.1 用户和开发人员参考文档 http://velocity.apache.org/engine/releases/v ...
- Scheme语言--简单介绍
一年前事实上有时间看完SICP这本书,后来由于种种原因,一直没有继续再学.由于SICP中使用Scheme确实应用不多.在Java,C++的语言眼里,Scheme确实非常另类.现在MIT已经放弃了使用S ...
- Java语言的介绍
1. 计算机语言 语言:沟通交流的方式 计算机语言:人与计算机之间的交流方式 java是一门计算机编程语言,也是意大利自行车品牌 软件工程师,java开发工程师 <--------------- ...
- REST建模语言RAML介绍
原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com RAML是什么? RAML是一种简洁的RESTful API描述性语言,它基于 YAML和JSON这样的公 ...
随机推荐
- 异步编程,采用WorkgroupWorker,async和await关键字
金科玉律:不要在UI线程上执行耗时的操作:不要在除了UI线程之外的其他线程上访问UI控件! NET1.1的BeginInvoke异步调用,需要准备3个方法:功能方法GetWebsiteLength,结 ...
- LR12.53—第5课:创建负载测试场景
在前面的课程中,您使用VuGen将验证您的Vuser脚本.在本课中,您将评估多个Vuser的负载下您的系统.您将模拟十个旅行代理同时使用航班预订系统的行动,以及这些用户的负载下观察系统的行为.设计和运 ...
- dede无子栏目的栏目直接调用顶级栏目(不让调用的解决方法) noself=\'yes\'
大家在用dede做网站的时候经常会出现一个问题就是当调用子栏目的时候会出现无子栏目的栏目直接调用顶级栏目, 解决dede无子栏目时出现同级栏目的问题 {dede:channel type='s ...
- The source attachment does not contain the source for the file ActionSupport.class 错误
报错 Syntax error, insert ";" to complete FieldDeclaration 报错 The source attachment does ...
- PIC32MZ tutorial -- Core Timer
Core Timer is a very popular feature of PIC32 since it is a piece of the MIPS M4K core itself and is ...
- 怎么解决svn清理失败且路径显示乱码问题
http://jingyan.baidu.com/article/295430f1d728830c7e0050f9.html 上面这个网址是百度经验给的方法,我也是参照这个方式解决了问题,虽然是解决了 ...
- java ppt课后作业
1 .仔细阅读示例: EnumTest.java,运行它,分析运行结果? 枚举类型是引用类型,枚举不属于原始数据类型,它的每个具体值都引用一个特定的对象.相同的值则引用同一个对象.可以使用“==”和e ...
- redis 基本数据类型
概述 Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合.本文详细介绍这五种数据类型的使用方法.本文命令介绍部分只是列举了基本的命令,至于具体的使用示例,可以参考Redis官方 ...
- VIM编辑器之常用命令
分类: vim 目录(?)[-] 第一级 存活 第二级 感觉良好 第三级 更好更强更快 更好 更强 更快 第四级 Vim 超能力 在当前行上移动光标 0 f F t T 区域选择 acti ...
- jquery ajax 前前后后,所有的函数并查询链接
jQuery Ajax 操作函数 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 描述 jQuery.ajax() 执行异步 H ...