Velocity初探小结--velocity使用语法详解
做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章
Velocity初探小结--velocity使用语法详解的更多相关文章
- Velocity初探小结--Velocity在spring中的配置和使用
最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...
- Velocity快速入门教程-脚本语法详解(转)
1.变量 (1)变量的定义: #set($name = "hello") 说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引号中的字面字符串将解析 ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Hive笔记--sql语法详解及JavaAPI
Hive SQL 语法详解:http://blog.csdn.net/hguisu/article/details/7256833Hive SQL 学习笔记(常用):http://blog.sina. ...
- Hadoop Hive sql语法详解
Hadoop Hive sql语法详解 Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件 ...
- Thymeleaf3语法详解和实战
Thymeleaf3语法详解 Thymeleaf是Spring boot推荐使用的模版引擎,除此之外常见的还有Freemarker和Jsp.Jsp应该是我们最早接触的模版引擎.而Freemarker工 ...
- Xpath语法详解
1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...
- mysql用户授权、数据库权限管理、sql语法详解
mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...
- Java8的Stream语法详解(转载)
1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel agg ...
随机推荐
- ASP.NET Core 之 Identity 入门(一)
前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里面的 Identity 组件库,负责对用户的身份进行认证,总体来说的话,没有MVC 5 里面那么复杂,因为在MVC 5里面引入了OW ...
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
Jexus 是一款运行于 Linux 平台,以支持 ASP.NET.PHP 为特色的集高安全性和高性能为一体的 WEB 服务器和反向代理服务器.最新版 5.8.2 已经发布,有如下更新: 1,现在大 ...
- 让姑姑不再划拳 码农也要有原则 : SOLID via C#
“姑娘,别这样.我们是有原则的.” “一个有原则的程序猿是不会写出 “摧毁地球” 这样的程序的,他们会写一个函数叫 “摧毁行星”而把地球当一个参数传进去.” “对,是时候和那些只会滚键盘的麻瓜不同了, ...
- ES6的一些常用特性
由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性.原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门(水好深,ES6没学好ES7又来了...) ...
- 设计模式之创建类模式大PK
创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...
- linux拷贝命令,移动命令
http://blog.sina.com.cn/s/blog_7479f7990101089d.html
- jmeter之线程组的使用
线程组 在使用jmeter性能测试时,我们都得先添加个线程组,右键testplan-->添加-->Threads-->线程组.在线程组下执行. 问题:为了能够让jmeter在做性能测 ...
- Dancing Links and Exact Cover
1. Exact Cover Problem DLX是用来解决精确覆盖问题行之有效的算法. 在讲解DLX之前,我们先了解一下什么是精确覆盖问题(Exact Cover Problem)? 1.1 Po ...
- Vue.js——基于$.ajax实现数据的跨域增删查改
概述 之前我们学习了Vue.js的一些基础知识,以及如何开发一个组件,然而那些示例的数据都是local的.在实际的应用中,几乎90%的数据是来源于服务端的,前端和服务端之间的数据交互一般是通过ajax ...
- 数据库设计中的Soft Delete模式
最近几天有点忙,所以我们今天来一篇短的,简单地介绍一下数据库设计中的一种模式——Soft Delete. 可以说,该模式毁誉参半,甚至有非常多的人认为该模式是一个Anti-Pattern.因此在本篇文 ...