Velocity模板学习
(本篇文章学习自https://www.cnblogs.com/avivaye/p/4418878.html)
)
表现层的三种主要技术
jsp、freemarker、velocity。其中velocity性能最好,其次是jsp。
在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTML、XML等)。这和 JSP 技术的目标非常接近。但是,JSP 模型可以毫无阻碍地访问底层的 Servlet API 和 Java 编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完全自包含的模板引擎和脚本解释器,Velocity 拥有完全封闭的模型。任何针对系统和/或 Java 编程语言的访问都必须明确地启用。默认情况,Velocity 模板中不能访问 Java 编程语言的任何方面。这种封闭的模型使 Velocity 能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开。从而保证了web site 的长期可维护性.
第一次解释jsp需要经过转换成java代码,再编译成class文件等步骤,而velocity则在速度上更快,因为它不需要经过像解释jsp页面那么多的步骤。
jsp是大家最熟悉的技术
优点:
1、功能强大,可以写java代码
2、支持jsp标签(jsp tag)
3、支持表达式语言(el)
4、官方标准,用户群广,丰富的第三方jsp标签库
5、性能良好。jsp编译成class文件执行,有很好的性能表现
缺点:没有明显缺点,非要挑点骨头就是,由于可编写java代码,如使用不当容易破坏mvc结构。
velocity是较早出现的用于代替jsp的模板语言
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能良好,据说比jsp性能还要好些
3、使用表达式语言,据说jsp的表达式语言就是学velocity的
缺点:
1、不是官方标准 2、用户群体和第三方标签库没有jsp多 3、对jsp标签支持不够好
freemarker 也是一种模版引擎语言
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准 2、用户群体和第三方标签库没有jsp多
Velocity模版语言(VTL)详细学习
-
定义变量 :语法符号用为两类,一类用#开头,代表控制符号,#set表示定义变量,另一类用美元符开头,通常用于显示输出变量;
#set($a='100') ,#set ( $str= “Velocity” )$a ,$str值分别为100和Velocity -
注释用法 :
单行注释:## 内容
多行注释:#* 内容 * #
文档格式:#** 内容 *# -
引用标记
${mudSlinger} 变量
${customer.Address} 属性
${purchase.getTotal()} 方法入代码片
- 基础语法 :
- 条件语句
#if ( $foo ) 1 #else 2 #end
上例中的条件语句将在以下两种条件下成立:
1.$foo是一个boolean型的变量,且它的值为true
2.$foo变量的值不为null
#if( $foo < 60 ) 完蛋了 #elseif( $foo == 60 ) 万幸 #else 浪费 #end
- 循环语句
#foreach ( $product in velocityCount次循环,值为: $product
#end
每次循环product变量。
$velocityCount 变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它。默认情况下,计数从“1”开始,但是你 可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置:
directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 1
遍历数组:
#set($list = ["hello", "velocity", "world"])
#foreach ($item in $list)
$velocityCount . $item <br/>
#end
其中velocityCount为索引变量
- 关系、逻辑运算符
相等 == 不等 != 且 && 或|| 非 !
- include
#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
#inclued ( “one.txt” )
如果您需要引入多个文件,可以用逗号分隔就行:
#include ( “one.gif”, “two.txt”, “three.htm” )
在括号内可以是文件名,但是更多的时候是使用变量的:
#inclue ( “greetings.txt”, $seasonalstock )
-
parse
#parse script element允许模板设计者一个包含VTL的本地文件。Velocity将解析其中的VTL并render模板。
#parse( “me.vm” )
就像#include,#parse接受一个变量而不是一个模板。任何由#parse指向的模板都必须包含在TEMPLATE_ROOT目录下。与#include不同的是,#parse只能指定单个对象。
你可以通过修改velocity.properties文件的parse_direcive.maxdepth的值来控制一个template可以包含的最多#parse的个数――默认值是10。#parse是可以递归调用的 -
Range Operator
#foreach ( $bar in [2…-2] ) $bar #end
结果:2 1 0 -1 -2
#set ( $arr = [0…1] )
#foreach ( $i in $arr ) $i #end
结果:0 1
- 内置对象
velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
response、$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
- 四则运算
直接进行四则运算将会默认为字符串连接,因此运算应该是如下的方式解决。
如果foo + 1 结果是21,而不是3.
需要先#set ( $value = value 结果才是3
- 解析步骤
当Velocity应用在应用程序时,一般分一下几步:
初始化Velocity==>创建context对象==>添加数据到context==>选择模板==>合并模板和数据,产生输出页面
- velocity.properties文件详解(在spring集成的时候主要是配置在prop标签中)
- tools.view.servlet.error.template = error.vmzd
处理错误信息的模板路径
-
tools.view.servlet.layout.directory = /WEB-INF/layout/ 所有布局文件的默认路径
-
tools.view.servlet.layout.default.template = defauzlt.vm
默认的布局文件
- #模板编码:
input.encoding=ISO-8859-1 //模板输入编码
output.encoding=ISO-8859-1 //模板输出编码
- velocimacro.library=/WEB-INF/vm/macro.vm,/WEB-INF/vm/tuanmacro.vm
是一个逗号分隔的所有Velocimacro 模板库的列表
(3)如何把VTL集成到spring的项目框架中?
① 需要的jar包
commons-collections.jar
velocity-1.5.jar
velocity-dept.jar
velocity-tool-view1.4.jar
下载地址:http://jakarta.apache.org/velocity/
② 引入Velocity包
在application-context.xml配置文件里配置VelocityConfigurer,当然也可以在dispatcher-servlet(application-springmvc.xml)里面配置,这完全取决于你自己的想法。
下面的配置使Spring能够知道我们的模板文件是放在哪里的
在dispatcher-servlet里配置VelocityViewResolver
下面的配置则是针对一个模板文件使用的是什么后缀。
本项目例子:
格式化时间:
element.createTime)
记此前面试中被面试老师吐槽我的学习笔记记录方式太过落伍,特此注册了一个CSDN的博客发表了此篇文章,内容基本来自于在前辈的博客中看到的东西和自己的一些见解,第一篇博客,希望自己越走越远。