当前位置: 首页 > 编程日记 > 正文

Velocity文档(3)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    velocity.properties 的一些配置项

  • velocimcro.library属性:指定自己的模板库,多个模板库以逗号分隔。默认情况下,velocity查找唯一的一个库:VM_global_library.vm
  • velocimacro.permissions.allow.inline属性:是否允许开发者在普通模板内定义Velocity宏。ho
  • velocimacro.permissions.allow.inline.replace.global属性: 是否允许设计者使用本地的inline的 宏替代全局的宏(全局的宏是指在velocimacro.library属性中指定的文件内定义的宏)。默认情况下,此值为false。这样就阻止本地的宏覆盖全局的。
  • velocimacro.permissions.allow.inline.local.scale属性: inline定义的宏是否仅仅在被定义的template内可见.  默认是false。 换句话说,如果这个属性设置为true,一个inline定义的宏只能在定义它的template内使用。
  • velocimacro.context.localscope属性:  默认值为false。当设置为true时,任何在宏内通过#set()对context的修改被认为是针对此宏的本地设置,而不会永久的影响内容。
  • velocimacro.library.autoreload属性: 控制宏库的自动加载。默认是false。当设置为ture时,对于一个宏的调用将自动检查原始库是否发生了变化,如果变化将重新加载它。这个属性使得你可以不用重新启动servlet容器而达到重新加载的效果,就像你使用regular模板一样。这个属性可以使用的前提就是resource loader缓存是off状态(file.resource.loader.cache = false)。注意这个属性实际上是针对开发而非产品的。
    Velocity宏的一些说明
Velocity宏必须定义在它们被使用之前,也就是说,你的#macro()声明应该出现在使用宏之前。特别要注意的是,当你试图#parse()一个包含#macro()的模板时候。因为#parse()发生在运行期,但是解析器在parsetiem决定一个看似VM元素的元素是否是一个VM元素,这样#parse()-ing一组VM声明将不按照预期的样子工作。为了得到预期的结果,只需要你简单的使用velocimacro.library使得Velocity在启动时加载你的VMs。

     再说Velocity的转义符
我们已经知道使用反斜杠(\)进行转义。下面总结一下:

## #include( “a.txt” ) renders as <ontents of a.txt>(注释行)#include( “a.txt” )## \#include( “a.txt” ) renders as \#include( “a.txt” )\#include( “a.txt” )## \\#include ( “a.txt” ) renders as \<contents of a.txt>\\#include( “a.txt” )

在对在一个directive内包含多个script元素的VTL directives, 使用逃逸符时要特别小心(比如在一个if-else-end statement内)。下面是VTL的if-statement的典型应用:
#if ( $jazz )Vyacheslav Ganelin#end

如果$jazz是ture,输出将是:
Vyacheslav Ganelin
如果$jazz是false,将没有输出。使用逃逸符将改变输出。考虑一下下面的情况:
\#if ( $jazz )Vyacheslav Ganelin\#end

现在无论$jazz是true还是false,输出结果都是:
#if ( $jazz )
Vyacheslav Ganelin
#end
事实上,由于你使用了逃逸符,$jazz根本就没有被解析为boolean型值。在逃逸符前使用逃逸符是合法的,例如:
\\#if ( $jazz )Vyacheslav Ganelin\\#end

以上程序的显示结果为:
\ Vyacheslav Ganelin
\
但是如果$jazz为false,那么将没有输出。(书上说会没有输出,但是我觉得应该还有有“\”字符被输出。)

VTL:Formatting issues
尽管在此用户手册中VTL通常都开始一个新行,如下所示:
#set ( $imperial = [ “Munetaka”, “Koreyasu”, “Hisakira”, “Morikune” ] )
#foreach ( $shogun in $imperial )$shogun
#end

但是像下面这种写法也是可以的:
Send me #set($foo = [“$10 and”,”a cake”])#foreach($a in $foo)$a #end please.

上面的代码可以被改写为:
Send me
#set ( $foo = [“$10 and “,”a cake”] )
#foreach ( $a in $foo )$a
#end
please.

或者
Send me
#set($foo = [“$10 and “,”a cake”])#foreach ($a in $foo )$a#end please.

这两种的输出结构将一样。

其他特性和杂项
  • 在模板中可以使用Velocity内建的算术函数,如:加、减、乘、除
#set ( $foo = $bar + 3 )
#set ( $foo = $bar - 4 )
#set ( $foo = $bar * 6 )
#set ( $foo = $bar / 2 )

当执行除法时将返回一个Integer类型的结果。而余数你可以使用%来得到:
#set ( $foo = $bar % 5 )

在Velocity内使用数学计算公式时,只能使用像-n,-2,-1,0,1,2,n这样的整数,而不能使用其它类型数据。当一个非整型的对象被使用时它将被logged并且将以null作为输出结果。

Range Operator

Range operator可以被用于与#set和#foreach statement联合使用。对于处理一个整型数组它是很有用的,Range operator具有以下构造形式:
[n..m]

m和n都必须是整型,而m是否大于n则无关紧要。例子:
First example:
#foreach ( $foo in [1..5] )$foo
#end

Second example:
#foreach ( $bar in [2..-2] )$bar
#end

Third example:
#set ( $arr = [0..1] )
#foreach ( $i in $arr )$i
#end

Fourth example:
[1..3]

上面四个例子的输出结果为:
First example:
1 2 3 4 5

Second example:
2 1 0 -1 -2

Third example:
0 1

Fourth example:
[1..3]

注意:range operator只在#set和#foreach中有效。

Advanced Issue:Escaping and!

当一个reference被“!”分隔时,并且在它之前有逃逸符时,reference将以特殊的方式处理。注意这种方式与标准的逃逸方式时不同的。对照如下:
#set ( $foo = “bar” )

特殊形式  标准格式
Render前        Render后        Render前        Render后
$\!foo               $!foo               \$foo             \$foo
$\!{foo}            $!{foo}            \$!foo            \$!foo
$\\!foo              $\!foo              \$!{foo}        \$!{foo}
$\\\!foo            $\\!foo             \\$!{foo}        \bar

Velocimacro杂记
  • Can I user a directive or another VM as an argument to a VM? For example, #center ( #bold( “hello” ) )
不可以。 一个directive的参数使用另外一个directive是不合法的
但是,还是有些事情你可以作的。最简单的方式就是使用双引号:
#set ( $stuff = "#bold( 'hello' )" )
#center ( $stuff )

上面的格式也可以缩写为一行:
#center ("#bold('hello')")


请注意在下面的例子中参数被evaluated在Velocimacro内部,而不是在calling level。例子:
#macro ( inner $foo )inner : $foo
#end#macro ( outer $foo )#set ( $bar = "outerlala" )outer : $foo
#end#set ( $bar = 'calltimelala' )
#outer( "#inner($bar)" )

输出结果为:
outer : inner : outerlala
记住Veloctiy的特性:参数的传递是By Name的。例如:
#macro ( foo $color )<tr bgcolor = $color ><td>Hi</td></tr><tr bgcolor = $color ><td>There</td></tr>
#end#foo ( $bar.rowColor() )

以上代码将导致rowColor()方法两次调用,而不是一次。为了避免这种现象的出现,我们可以按照下面的方式执行:
#set ( $color = $bar.rowColor() )
#foo ( $color )

  • can I register velocimacros via #parse()?
目前,Velocimacros必须在第一次被模板调用前被定义。这就意味着 你的#macro()声明应该出现在使用Velocimacros之前。如果你试图#parse()一个包含#macro() directive的模板,这一点是需要牢记的:因为#parse()发生在运行期,但是解析器在parsetiem决定一个看似VM元素的元素是否是一个VM元素,这样#parse()-ing一组VM声明将不按照预期的样子工作。为了得到预期的结果,只需要你简单的使用velocimacro.library使得Velocity在启动时加载你的VMs。
  • What is velocimacro autoreloading?
velocimacro.library.autoreload是专门为开发而非产品使用的一个属性。此属性的默认值是false。

String concatenation
开发人员最常问的问题是我如何作字符拼接?在java中是使用“+”号来完成的。
在VTL里要想实现同样的功能你只需要将需要联合的reference放到一起就行了。例如:
#set ( $size = “Big” )
#set ( $name = “Ben” )
The clock is $size$name.

输出结果将是:The clock is BigBen.。更有趣的情况是:
#set ( $size = “Big” )
#set ( $name = “Ben” )
#set ( $clokc = “$size$name” )
The clock is $clock.

上例也会得到同样的结果。最后一个例子,当你希望混合固定字段到你的reference时,你需要使用标准格式:
#set ( $size = "Big" )
#set ( $name = "Ben" )
#set ( $clock = "${size}Tall$name" )
The clock is $clock.

输出结果是:The clock is BigTallBen.。使用这种格式主要是为了使得$size不被解释为$sizeTall。

转载于:https://my.oschina.net/aiguozhe/blog/59321

相关文章:

Java 24岁!Google加持的Kotlin真能取代它?

作者 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;1995 年 5 月 23 日&#xff0c;Sun 公司在 Sun world 会议上正式宣布了 Java 的到来&#xff0c;从此一代编程语言界的翘楚就此诞生。而在不断地迭代与适配中&#xff0c;今时今日&#xff0c;Java 以需…

三,ES6中需要注意的特性(重要)

-----书接上文&#xff0c;前文中我们总结了关于JS的组成部分以及如何快速开展学习JS&#xff0c;相信已经有很多朋友掌握到这些方法。接下来就从更深的ECMAScript开始说起。 1.什么是ES6? ECMAScript(European Computer Manufacturers Association) 6: 是JavaScript语言的下一…

【SVN】在阿里云上创建svn服务器

1、创建用户及相关设置 阿里云搭建ubuntu18.04工作台&#xff0c;默认只有root超级用户。为了安全起见&#xff0c;我们使用普通用户来创建svn&#xff1a; useradd hello // 创建用户hello mkdir -p /home/hello // 在hello用户的根目录 cd /home/hello chown hello . // 设…

【转】on delete cascade

关系表的级联更新&#xff1a; on update cascade on delete cascade 是级联删除的意思 意思是 当你更新或删除主键表时&#xff0c;那么外键表也会跟随一起更新或删除 CREATE TABLE Countries(CountryId INT PRIMARY KEY) INSERT INTO Countries (CountryId) VALUES (1) INSER…

倒计时1天!CTA核心技术及应用峰会报名通道即将关闭(附参会攻略)

全球智能化趋势当前&#xff0c;人工智能技术正蓬勃发展。为了直击开发者在机器学习与人工智能技术研究与落地过程中的痛点与瓶颈&#xff0c;深入解析机器学习和知识图谱技术在行业中的实践和落地。2019 年 5 月 26 - 27 日&#xff0c;由中国 IT 社区 CSDN 与数字经济人才发展…

【Qt】在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效的解决方法

1、问题描述 Win10操作系统环境下,在QtCreator中使用Ctrl+Shift+f快捷键打开高级查找窗口失效。 2、原因分析 Ctrl+Shift+f快捷键在各种输入法中,常用来做中文简体和繁体输入的切换。QtCreator中该快捷键失效的的原因,多半是因为和输入法的快捷键冲突。可以在输入法的快捷…

Python修行之字符串(一):连接、切割、大小写、排版

字符串:1.是由一个个字符组成有序的序列&#xff0c;是字符的集合2.字符串是不可变对象3.使用单引号、双引号、三引号引住的字符序列4.python3中、字符串就是unicode类型、在2中分两种一种unicode一种非unicode字符串元素访问--下标:1.字符串支持使用索引访问2.有序的字符集合&…

UI自动化测试随笔

昨天给开发的同事讲我们正在做的自动化测试&#xff0c;同事问了句&#xff1a;为什么API的测试不需要写代码了&#xff0c;而UI的测试还需要写那么多代码呢&#xff1f; 能不写代码么&#xff1f; 目前我们的自动化测试的现状&#xff1a; 目前主要覆盖两个部分&#xff1a;A…

【跃迁之路】【554天】程序员高效学习方法论探索系列(实验阶段311-2018.08.13)...

(跃迁之路)专栏 【跃迁之路】奖励金计划正式开始 从2018.7.1起&#xff0c;【跃迁之路】奖励金计划正式起航&#xff0c;从今以后&#xff0c;&#xff0c; 每月1日&#xff0c;我会将自己个人上月收入的1%计入【跃迁之路】奖励金池&#xff0c;积累到足够金额后&#xff0c;将…

TensorFlow 2.0来了,为什么他却说“深度学习框架之争,现在谈结果为时尚早”?...

记者 | 琥珀出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;半个多世纪前&#xff0c;浙江大学老校长竺可桢曾有两个非常经典的教育问题&#xff1a;“诸位在校&#xff0c;有两个问题应该自己问问&#xff0c;第一&#xff0c;到浙大来做什么&#xff1f;第二&#…

【FFmpeg】ffmpeg工具源码分析(一):main函数

ffmpeg工具经常用来转换、生成媒体文件,下面是它的源码分析(一):main函数 ffmpeg版本:4.2.1 int main(int argc, char **argv) {int i, ret;BenchmarkTimeStamps ti; # 用于基准测试init_dynload(); # 初始化动态库加载路径,只在win3

Android之传感器(一)

传感器的种类&#xff1a;1. 动作传感器加速度传感器、重力传感器和陀螺仪&#xff08;判断手机姿态&#xff09;等2. 位置传感器方向传感器和磁力传感器3. 环境传感器温度传感器 、压力传感器和亮度传感器 使用传感器的方法&#xff1a;1. 获取SensorManager对象SensorManage…

【Qt】Qt单例模式三种实现

1、饿汉式 在头文件中:将构造函数私有化,并创建静态函数instance来获取实例 class A : public QObject {Q_OBJECT public:static A* instance(QObject *parent = nullptr);private:explicit A(QObject *parent = nullptr); }

程序员敲代码时,戴着耳机究竟在听什么?

今天&#xff0c;某妹子突然凑到我的耳边轻声说&#xff1a;“我们公司的程序员&#xff0c;清一色的戴着耳机&#xff0c;你说他们是不是故意不想听我们提的需求&#xff1f;”我很方&#xff0c;因为我也喜欢戴耳机。&#xff08;思考ing&#xff09;思考了一秒钟后&#xff…

关于Oracle.ManagedDataAccess数据库表加字段后,必须重启的问题

关于Oracle.ManagedDataAccess数据库表加字段后&#xff0c;必须重启的问题&#xff0c;解决方法如下&#xff1a;在数据库连接字串中&#xff0c;增加一个参数&#xff1a;Metadata Poolingfalse如“Data Source(DESCRIPTION(ADDRESS_LIST(ADDRESS(PROTOCOLTCP)(HOST1.1.6.200…

配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据

第一章 简介 场景描述 根据最近客户的需求&#xff0c;他们需要自动维护MOSS2010列表数据导出到Excel的数据实时同步&#xff0c;就是列表添加记录后&#xff0c;导出的Excel列表自动同步数据过来。 第二章 配置方法 1. 打开MOSS2010站点http://moss:8001的要导出的列表 2. 点【…

一个让Python代码运行更快的最佳方式!

作者 | Serdar Yegulalp译者 | 姜松浩&#xff0c;责编 | 屠敏转载自 CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;Python因其强大、灵活且易于使用等特性&#xff0c;而赢得了声誉。这些优点使其在各种各样的应用程序、工作流程和领域中得到了广泛应用。但是就语言的设…

《Python基础教程第二版》第五章-条件、循环和其他语句(一)

print和import print打印多个表达式&#xff0c;用逗号,隔开 print abc:, 42, nonono #输出在每个参数之间添加空格 print在结尾处加上逗号,,接下来的语句会与前一条语句打印在同一行 print hello, print word! #hello word! import从模块中导入函数 import module from module…

【Qt】QStackedWidget:将多个窗口控件放入堆中,每次只显示一个窗口控件

1、简介 QStackedWidget可以容纳多个窗口控件,每次只显示其中一个。例如:登录页面、各种功能页面等不同时显示的窗口,可以放入QStackedWidget中。 2、demo // 创建三个页面 QWidget *firstPageWidget = new QWidget; QWidget *secondPageWidget = new QWidget; QWidget *…

Android模仿iPhone View旋转刷新数据动画详解

因为小马很喜欢在不同的页面之间跳转时加点好玩的动画&#xff0c;今天无意间看到一个动画效果感觉不错&#xff0c;几种效果图如下&#xff0c;既然好玩就写在博客中&#xff0c;直接说就是&#xff1a;该效果类似于iPhone中View的切换动画效果&#xff0c;今天就只介绍上面展…

【SQL】sql语句LEFT JOIN(拼接表)详解

1、语法 SELECT column_name(s) FROM table1 LEFT JOIN table2 ON table1.column_nametable2.column_name;2、说明 按照一定规则&#xff0c;将表table1和表table12拼接起来。下面以学生管理系统为例&#xff0c;学生管理系统数据库各表如下 课程表&#xff1a; 学生表 成绩…

找啊找啊找木偶,图灵奖得主G. Hinton第一篇论文曝光!

作者 | Geoffrey Hinton 译者 | 李倩编辑 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;摘要针对在具有重叠结构的透明矩形中寻找木偶这一问题&#xff0c;Hinton大神想到使用松弛算法&#xff0c;通过从冲突局部解释网络中提取全局最佳图形的方式找木偶。介…

终于,「最近邻搜索」有通用方法了

作者&#xff1a;Kevin Hartnett 编译&#xff1a;Bing 如果你打算开一家咖啡馆&#xff0c;你一定想知道&#xff1a;“附近最近的一家咖啡馆在哪&#xff1f;”了解这些信息有助于应对商业竞争。 这种现象是计算机科学中广泛研究的问题&#xff0c;称为“最近邻搜索”。它的问…

tar自动打包指定文件夹中的文件到指定目录

这是我离开上一家公司&#xff0c;到XX人寿保险公司的第一个工作内容&#xff0c;很简单&#xff0c;可以减少每天重复的工作量。写一个脚本&#xff0c;将指定文件夹下的所有文件打包成以日期命名的格式并存放到其父目录中&#xff0c;自动检测该压缩包&#xff0c;保留时间为…

【SQL】sql语句GROUP BY

1、语法 SELECT column_name, aggregate_function(column_name) FROM table_name GROUP BY column_name;2、说明 先对数据集分组&#xff0c;再根据规则批量处理每组数据。 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组&#xff0c;所谓的分组就是将…

色情低俗、暴力恐怖内容...如何用AI“一网打尽”?

作者 | Rachel、Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;移动互联网时代催生了大量的多媒体数据&#xff0c;每天在社交平台、长短视频、直播平台、新闻资讯等内容平台产生了数以亿计的图片和视频&#xff0c;这些数据的内容审核面临严峻的挑战。人工审核…

想要学好Go语言的必须知道的一个小技巧

2019独角兽企业重金招聘Python工程师标准>>> 由于我转Go语言比较早&#xff0c;很多认识我的&#xff0c;转Go或学习Go的同学遇到问题&#xff0c;经常会过来问我&#xff0c;然后&#xff0c;我发现。 除了学习Go语言可以看那些资料&#xff0c;这个问题以外&#…

【CSS3教程】CSS3基础常用技巧实例集合

为什么80%的码农都做不了架构师&#xff1f;>>> CSS3常用技巧 CSS3下条纹&方格斜纹背景的实现 一、效果抢先&#xff1a;CSS3下的条纹背景demo 这些美丽的纹饰全部都是由CSS实现的&#xff0c;没有一点点的图片。 二、原理简述 主要是应用了两个CSS3的属性&…

【FFmpeg】ffmpeg工具源码分析(二):转码核心函数 transcode

1、转码流程 1)转码前初始化:打开输入输出文件,初始化编码器、解码器、过滤器,创建多线程,设置串口终端等; 2)while循环处理每一包数据,核心函数 transcode_step(稍后分析); 3)转码结束前收尾工作:关闭多线程,刷新编解码缓冲区,恢复串口终端设置,向输出文件写…

在CentOS7上部署Apache Mesos

概述 Apache Mesos是一款基于多资源&#xff08;内存、磁盘、CPU、端口等&#xff09;调度的开源集群管理套件&#xff0c;能使容错和分布式系统更加容易。 工作原理 Apache Mesos采用了Master/Slave结构来简化设计&#xff0c;将Master做得尽可能轻量级&#xff0c;仅保存了各…