[velocity] velocity详解
(1)为什么要使用模版语言?
在服务器端可以使用 Velocity 处理模板和生成的动态内容(HTML、XML等)。这和 JSP 技术的目标非常接近。但是,JSP 模型可以毫无阻碍地访问底层的 Servlet API 和 Java 编程语言。它基本上是一种在很大程度上开放的访问模型。而作为一种完全自包含的模板引擎和脚本解释器,Velocity 拥有完全封闭的模型。任何针对系统和/或 Java 编程语言的访问都必须明确地启用。默认情况,Velocity 模板中不能访问 Java 编程语言的任何方面。这种封闭的模型使 Velocity 能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开。从而保证了web site 的长期可维护性.
第一次解释jsp需要经过转换成java代码,再编译成class文件等步骤,而velocity则在速度上更快,因为它不需要经过像解释jsp页面那么多的步骤,其次velocity也可以用作其它实现的模板技术,像我在项目中就遇到过使用velocity来作为邮件的模板,而jsp显然做不到这样的功能。
拓展:在java领域,表现层技术主要有三种:jsp、freemarker、velocity。
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多
综合对比:
1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、freemarker宏定义比jsp tag方便,内置大量常用功能,比如html过滤,日期金额格式化等等,支持jsp标签。且freemarker和velovity一样,作为模版语言,都可以实现严格的mvc分离。
(2)Velocity模版语言(VTL)使用详解
① VTL变量声明
所有的VTL statement 都是以#开头,且包含一个指示符,当客户访问你的页面时, the Velocity Templating Engine 将搜索页面中的所有# 符号,如果确定这是一个VTL 声明时就按一定规则处理动态内容, 符号#仅仅只是表明这可能是一个VTL 声明.记住以下的规则:
使用$字符开始的references用于得到什么;使用 #字符开始的directives用于作些什么。
在下面的例子中,一个值被分配给$foo变量,并在其后被引用。
<html>
<body>
#set ( $foo = “Velocity” )
Hello $foo World!
</body>
</html>
上面的实现结果是在页面上打印“Hello Velocity World!”
② 注释语法
单行注释:## 内容
多行注释:#* 内容 *#
文档格式:#** 内容 *#
③ 正式引用标记
${mudSlinger} 变量
${customer.Address} 属性
${purchase.getTotal()} 方法
如果写成如下的语法格式,当值为null的时候会原样输出字符串
$mudSlinger 变量
$customer.Address 属性
$purchase.getTotal() 方法
所以尽量使用正式的标记或者可以写成如下的方式:
$!mudSlinger 变量
$!customer.Address 属性
$!purchase.getTotal() 方法
也可以一同使用
$!{mudSlinger} 变量
$!{customer.Address} 属性
$!{purchase.getTotal()} 方法
拓展:$customer.address 引用时,查找顺序是:
1.getaddress() 2. getAddress() 3. get(“address”) 4. isAddress()
④ 如何在velocity中使用特殊字符?
$字符:货币字符
在VTL中使用$2.5这样的货币标识是没有问题得的,VTL不会将它错认为是一个reference,因为VTL中的reference总是以一个大写或者小写的字母开始。但还是要明白,VTL中使用“\”作为逃逸符。如:\$name将会输出$name字符串。
⑤ 常用基础语法
1)条件语句
#if ( $foo ) 1 #else 2 #end
上例中的条件语句将在以下两种条件下成立:
1.$foo是一个boolean型的变量,且它的值为true
2.$foo变量的值不为null
#if( $foo < 60 ) 完蛋了 #elseif( $foo == 60 ) 万幸 #else 浪费 #end
2)循环语句
#foreach ( $product in $allProducts )
这是第$velocityCount次循环,值为: $product
#end
每次循环$allProducts中的一个值都会赋给$product变量。
$velocityCount 变量的名字是Velocity默认的名字,你也可以通过修改velocity.properties文件来改变它。默认情况下,计数从“1”开始,但是你 可以在velocity.properties设置它是从“1”还是从“0”开始。下面就是文件中的配置:
directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 1
现在我们假设$allProducts是一个Hashtable,如果你希望得到它的key应该像下面这样:
<ul>
#foreach ( $key in $allProducts.keySet() )
<li>Key: $key -> Value: $allProducts.get($key) </li>
#end
</ul>
3) 关系、逻辑运算符
相等 == 不等 != 且 && 或|| 非 !
4) include
#include script element允许模板设计者引入本地文件。被引入文件的内容将不会通过模板引擎被render。为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
#inclued ( “one.txt” )
如果您需要引入多个文件,可以用逗号分隔就行:
#include ( “one.gif”, “two.txt”, “three.htm” )
在括号内可以是文件名,但是更多的时候是使用变量的:
#inclue ( “greetings.txt”, $seasonalstock )
5) 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是可以递归调用的
6) 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
7) 内置对象
velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
$request、$response、$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
8) 四则运算
直接进行四则运算将会默认为字符串连接,因此运算应该是如下的方式解决。
如果$foo=2.则$foo + 1 结果是21,而不是3.
需要先#set ( $value = $foo + 1 ) ,然后$value 结果才是3
9) 解析步骤
当Velocity应用在应用程序时,一般分一下几步:
初始化Velocity==>创建context对象==>添加数据到context==>选择模板==>合并模板和数据,产生输出页面
10) velocity.properties文件详解(在spring集成的时候主要是配置在prop标签中)
1. tools.view.servlet.error.template = error.vmzd
处理错误信息的模板路径
2. tools.view.servlet.layout.directory = /WEB-INF/layout/ 所有布局文件的默认路径
3. tools.view.servlet.layout.default.template = defauzlt.vm
默认的布局文件
4. #模板编码:
input.encoding=ISO-8859-1 //模板输入编码
output.encoding=ISO-8859-1 //模板输出编码
5. 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能够知道我们的模板文件是放在哪里的
<bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/WEB-INF/views"/> </bean>
在dispatcher-servlet里配置VelocityViewResolver
下面的配置则是针对一个模板文件使用的是什么后缀。
<bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="suffix" value=".vm"/> </bean>
本项目例子:
格式化时间:
$date.format('yyyy-MM-dd HH:mm:ss',$element.createTime)
[velocity] velocity详解的更多相关文章
- jsp、freemarker、velocity区别详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt172 在java领域,表现层技术主要有三种:jsp.freemarker.v ...
- Velocity 语法详解
Velocity是基于Java的模板引擎,它允许页面设计者引用Java中定义的方法.页面设计者和Java开发者能够同时使用MVC的模式开发网站,这样网页设计者能够把精力放在页面的设计上,程序员也可以把 ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- EasyPR--中文开源车牌识别系统 开发详解(1)
在上篇文档中作者已经简单的介绍了EasyPR,现在在本文档中详细的介绍EasyPR的开发过程. 正如淘宝诞生于一个购买来的LAMP系统,EasyPR也有它诞生的原型,起源于CSDN的taotao123 ...
- Log4J 配置文件全属性详解
第一步:加入log4j-1.2.8.jar到lib下. 第二步:在CLASSPATH下建立log4j.properties.内容如下: 1 log4j.rootCategory=INFO, stdou ...
- Spring 3.x jar 包详解 与 依赖关系
以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...
- Struts2中 Result类型配置详解
一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...
- spring mvc 框架搭建及详解
现 在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不 ...
- Javascript 异步加载详解
Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...
随机推荐
- JAVA中split对空串的影响。
public class SplitEmptyString { /** * @param args */ public static void main(String[] args) { // 空串的 ...
- 【转】阻塞与非阻塞socket的优缺点
转自:http://wenku.baidu.com/link?url=V-TghOmERC0eq0aoXEyhpTw3W5OlqbItwTJE_csI29ysi9vKkCG1lDxq0wWdpImvg ...
- SpringMVC请求参数和响应结果全局加密和解密
前提 前段时间在做一个对外的网关项目,涉及到加密和解密模块,这里详细分析解决方案和适用的场景.为了模拟真实的交互场景,先定制一下整个交互流程.第三方传输(包括请求和响应)数据报文包括三个部分: 1.t ...
- 让Sql Server 2008 可以远程连接的方法
1.先开防火墙TCP:1433 2.设置外围端口为:1433 注意一定不要忘记“启用”和IPALL的端口设置 3.重启SQL完成 如果要查看1433端口有没有启用并被监听,只要在cmd里使用netst ...
- Java泛型中extends和super的理解
作者:zhang siege链接:https://www.zhihu.com/question/20400700/answer/91106397来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- 一致Hash算法
一致性哈希算法是分布式系统中经常使用的算法.比方,一个分布式的存储系统,要将数据存储到详细的节点上.假设採用普通的hash方法.将数据映射到详细的节点上,如key%N.key是数据的key.N是机器节 ...
- SuperMap iObjects for Spark使用
本文档环境基于ubuntu16.04版本,(转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢) 1. 基础环境搭建 基础环境搭建 ...
- Android开发之定位系统
2013-07-04 定位系统 全球定位系统(Global Positioning System, GPS), 又称全球卫星定位系统. 最少只需其中3颗卫星,就能迅速确定用户组地球所处的位置及海拔高度 ...
- mysql的rand函数
项目中需要动态随机生成一些固定位数的随机数,如8位,5位等. 之前看到的写法是这样 ROUND(ROUND(RAND(),5)*100000) 这样写不太准确,有几率出现4位的情况,Rand() 函数 ...
- machine_learning-knn算法具体解释(近邻算法)
近邻算法是机器学习算法中的入门算法,该算法用于针对已有数据集对未知数据进行分类. 该算法核心思想是通过计算预測数据与已有数据的相似度猜測结果. 举例: 如果有例如以下一组数据(在下面我们统一把该数据作 ...