做java开发的朋友一般对JSP是比较熟悉的,大部分人第一次学习开发View层都是使用JSP来进行页面渲染的,我们都知道JSP是可以嵌入java代码的,在远古时代,java程序员甚至在一个jsp页面上就完成了所有的业务逻辑代码,能够实用平台的API,这是jsp的一个优点,所谓物极必反,这一点在某些方面也成了它的一个缺点,内容和表示的界限变得很模糊,使得mvc分层不够彻底.

Velocity的写法比较接近java的语法,语法非常简单,对于java开发人员来说,从一窍不通到上手使用velocity几乎不需要花很多时间,还有很重要的一点,我觉得是velocity没有很多的标签,自由度比较高.

Velocity渲染模板时,先把模板解析成一颗语法树,然后去遍历这棵树,分别渲染每一个节点.

我对velocity也属于刚刚入门的阶段,所以只是简单的总结一下一些常用的语法和基础知识.

#set 语法

#set可以创建一个Velocity的变量,一般用于向一个变量或属性赋值,下面的第一个例子,大概和java中的String name=user.getName();是一个意思.

在Velocity语法树中,#set表达式对应的是一个ASTSetDirective类,"="两边的表达式值,分别对应该类的两个子节点,LHS和RHS.

#set($user.name="zhangsan")   可以理解为     user.setName("zhangsan")

#set($name=$user.name)         可以理解为     user.getName();

像上述例子中的第一个:不仅可以表示 user.setName("zhangsan"),还可以表示user.setname("zhangsan"),或者user.put("name","zhangsan"),这是动态语言的特点,不想java语法那样严格的定义.

注意:#set表达式,结尾不需要#end跟随,其他表达式基本都需要加#end.

#foreach语法

这是Velocity中唯一一种循环的语法,类似于java的增强for循环

#foreach($user in $userList)

.....

#end--------------------------------基本和java中的for循环是一个意思--------------------------------

for(User user:userList){

.....

}

$userList变量的内容是一个数组, Hashtable 或者 Array. 分配给$user 变量的值是Java的对象和一个变量的引用.

这里userList是一个List,可以使用$foreach.count来进行简单的循环计数.

#if( $foreach.hasNext ),可以用来判断是否是最后一次迭代.

如果你想从零开始进行#foreach循环, 你可以使用 $foreach.index 代替$foreach.count..

同样的, $foreach.first和$foreach.last也提供了$foreach.hasNext方式.如果你想访问#foreach外面的这些属性, 你能够引用它们通过 $foreach.parent或 $foreach.topmost 属性 ( $foreach.parent.index 或者 $foreach.topmost.hasNext)

如果你的userList中有很多数据,但你只想遍历前3条,那么可以这么写:

#foreach( $user in $userList )

#if( $foreach.count > 3 )

#break

#else

.....

#end

#end

注意:在#foreach中产生的变量只在foreach的作用范围内有效

#if,#elseif,#else语法

条件判断语句,语法规则和java也是基本一致的,但是在判断语句的处理上却有很大不同.

例如#if($user),这里只要$user变量的值不是null,或者不是false,那么就为true.

表达式中支持很多条件判断,如">","

#parse语法

#parse语法的作用是引用其他模块,比如你可以把多个vm文件中重复的代码抽取出来,放到一个单独的"common.vm"文件中,然后再在每一个模块的对应位置使用#parse('common.vm')把公共模块引入到当前模块.

需要特别注意的一点是,common.vm中的变量的值都可以由#paser()所在的vm文件模板的上下文中取得,也就是说,你只是把一段公共的vm代码放在一个单独的模板文件中,除此之外,和两者在一个模板文件中没有任何其他区别.

另外#parse()中不仅能引入其他模板文件,也可以引入一个变量.同时需要记得一点,#parse引入的模板文件中,也可以包含#parse.

说到了#parse就要提到另一个引入的指令#include,也是引入外部文件的意思,他们的区别总结如下:

#include()可以同时引入多个文件, #parse()只能一次引入一个文件(或变量).

#include引入的内容不会被Velocity的emplate engine即模板引擎处理, #parse引入的内容会被处理,也就是说#include引入的内容不能包含velocity语法,而后者,当然是可以的.

(转)Velocity和jsp的区别:

执行方式不一样: JSP是编译执行,Velocity是解释执行.如果JSP文件被修改了,对应的java类就会重新编译,而Velocity却不需要,只是会重新生成一棵语法树.

执行效率不同:理论上来说,编译执行的效率明显好于解释执行,在JSP中方法调用是直接执行的,而在velocity中使用反射执行的,从这方面来讲JSP效率会明显好于Velocity.如果JSP中有大量的jstl或者其他标签的话,就不一定了.

需要的环境支持不同:JSP的执行依赖Servlet环境,他需要ServletContext,request,response这些类.而渲染Velocity不需要其他环境的支持,所以说velocity的应用环境更广.

参考资料

深入分析javaWeb技术内幕-第16章

java velocity 语法_Velocity初探小结--velocity使用语法详解相关推荐

  1. java调用javascript函数_[Java教程]JavaScript函数的4种调用方法详解

    [Java教程]JavaScript函数的4种调用方法详解 0 2016-08-09 00:00:12 在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C# ...

  2. Java Web中的EL(表达式语言)详解

     Java Web中的EL(表达式语言)详解 表达式语言(Expression Language)简称EL,它是JSP2.0中引入的一个新内容.通过EL可以简化在JSP开发中对对象的引用,从而规范页面 ...

  3. Java中print、printf、println的区别 详解

    Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和pr ...

  4. java 三种将list转换为map的方法详解

    这篇文章主要介绍了java 三种将list转换为map的方法详解的相关资料,需要的朋友可以参考下 java 三种将list转换为map的方法详解 在本文中,介绍三种将list转换为map的方法: 1) ...

  5. java io类库,Java利用io类库对各种文件的操作详解

    Java中文网 - Java利用io类库对各种文件的操作详解 java中提供了io类库,可以轻松的用java实现对文件的各种操作.下面就来说一下如何用java来实现这些操作. 新建目录 //Strin ...

  6. Java生产环境下性能监控与调优详解 大纲 学习感悟

    Java生产环境下性能监控与调优详解 生产环境发生了内存溢出如何处理? 生产环境应该给服务器分配多少内存合适? 如何对垃圾收集器的性能进行调优? 4.生产环境CPU负载飙高该如何处理? 5.生产环境应 ...

  7. Java生产环境下性能监控与调优详解 第2章 基于JDK命令行工具的监控

    Java生产环境下性能监控与调优详解 第2章 基于JDK命令行工具的监控 2-1 JVM的参数类型 标准参数 x参数 XX参数 2-2 查看JVM运行时参数 2-3 jstat查看JVM统计信息 2- ...

  8. java list 元素去重_小猿圈Java开发之list按照元素某个字段去重详解

    小猿圈Java老师给大家分享一篇关于如何实现Java8中list按照元素的某个字段去重的详细介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们一起来看一下吧. ...

  9. 农夫过河算法java,Java农夫过河问题的继承与多态实现详解

    Java农夫过河问题的继承与多态实现详解 发布时间:2020-08-22 06:04:29 来源:脚本之家 阅读:61 作者:小任性嘛 题目描述: 一个农夫带着一匹狼.一只羊.一颗白菜要过河,只有一条 ...

  10. java的markword_【转帖】Java工具结构与锁实现原理及MarkWord详解

    Java工具结构与锁实现原理及MarkWord详解 https://www.pianshen.com/article/2382167638/ 我们都知道,Java工具存储在堆(Heap)内存.那么一个 ...

最新文章

  1. nylon尼龙的来历
  2. 可以结束一个循环的关键字是python_第33 p,for遍历,循环取值最方便
  3. 看动画轻松理解「链表」实现「 LRU 缓存淘汰算法」
  4. 谨慎试之:libopencv_core.so.3.4, needed by //usr/local/lib/libopencv_imgcodecs.so
  5. 第十三届第一场蓝桥杯嵌入式主观题讲解
  6. 青春日志html,关于青春日记模板锦集四篇
  7. 文件删除如何恢复?电脑数据恢复,4个详细方法
  8. 《烈烈先秦》8、独撑大厦的真勇者——半残战神李牧
  9. 基于IBM Tivoli TSM系统构建某局备份系统实施方案
  10. linux grub error17,Ubuntu Grub 问题:提示 error17 修复方法
  11. 数字转换 LibreOJ - 10155
  12. 网易滑块识别-通用滑块识别
  13. 【北京】No317| 在京在读研究生,可静可动,乐观,脾气好,很佛系的女孩,喜欢运动,旅游,读书,小吃货一枚,谈恋爱比较粘人...
  14. java StringUtil之String工具类
  15. 我作为大学生刚出校园实习的感受
  16. 【BBED】BBED模拟并修复ORA-08102错误
  17. varchar2与varchar2(char)
  18. proteus中仿真51单片系列之--2位数码管程序
  19. 微信和支付宝是金融基础设施,而数字人民币是支付工具
  20. vue综合项目--悦听播放器

热门文章

  1. MacBook安装telnet工具和使用
  2. CAD学习笔记中级课【参数化】
  3. 《Java高并发编程详解:多线程与架构设计》笔记(一)
  4. dda算法c语言,Python使用DDA算法和中点Bresenham算法画直线
  5. Installing third-party firmware on x3-55 letv (by quqi99)
  6. 用HFFS实例讲解多频天线设计
  7. 图片存储解决方案--阿里云OSS
  8. 机械臂动力学建模(2)- Kane凯恩算法
  9. 《自然语言处理简明教程》读书笔记:前言
  10. PE启动盘安装操作系统