Velocity入门系列
Velocity介绍
Velocity是一个java模板引擎,通过简洁的语法可以返回动态内容给浏览器使用,本系类是基于velocity官方文档(就是照着翻译,同时对不清楚的地方进行详细讲解),其实技术文档我一直推崇看官方文档,官方文档更新及时同时讲解也很详细,但是主要是需要英语基础哈哈,下面我们就开始velocity的学习了。
简单的环境搭建
在学习之前我们先下载jar包,由于官方文档是先进行语法学习(蛋蛋的忧桑~~~~),所以这里我先进行简单的velocity搭建, 使用的是servlet,贴代码!
Properties p = new Properties();
p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init( p );
VelocityContext context = new VelocityContext();
context.put( "name", new String("Velocity") );
Template template = null;
StringWriter sw = new StringWriter();
PrintWriter out = response.getWriter();
try
{
//template = Velocity.getTemplate("cn/dota/mytemplate.vm");
Velocity.mergeTemplate("cn/dota/mytemplate.vm", context, out);
}
catch( ResourceNotFoundException rnfe )
{
// couldn't find the template
}
catch( ParseErrorException pee )
{
// syntax error: problem parsing the template
}
catch( MethodInvocationException mie )
{
// something invoked in the template
// threw an exception
}
catch( Exception e )
{}
这里核心的就是 1-11行,这里简单的说下velocity加载模板只有文件路径和类路径(使用velocity-tool可以增加web上下文路劲配置),第二行就是指定使用类路径, context其实就是传递参数,好了简单的环境配置好了,我们就开始来学习le !!!!!!!!
目录
- velocity template language(VTL):介绍
- Hello velocity world!
- 注释
References
- 格式参考标记
- 替代案例
- 指令
- 得到常量($符号问题)
- VTL:格式化问题
- 其他特点和事项
- 反馈
velocity template language(VTL):介绍
VTL可以提供容易最简单最干净的方式讲动态内容放入web应用,甚至一个没有编程经验的网页开发者也能很快的使用VTL。
VTL使用references将动态内容嵌入到网页里面。变量是references的一种类型可以关联到java代码中定义的变量,他也可以在网页中自己定义的参数
Hello velocity world!
我们开始运行第一个程序
<html>
<body>
#set( $foo = "Velocity" )
Hello $foo World!
</body>
<html>
由于这个代码没有使用java传入的参数所以可以直接运行,后台模板配置好直接访问吧 修改 $foo 等于的值那么我们就可以看到不一样的结果
注释
单行注释 #
多行注释 #* 内容*#
当然也可以使用#**内容*#
<html>
<body>
看到我1</br>##看不到我1
看到我2</br>#*看不到我1 *#
看到我3
#**
你看不到我3
*#
</body>
<html>
看下效果吧 这个比较简单
References
在vtl中有三种类型的references:变量、属性和方法
变量(Variables )
可以使用字符a-z A-Z 数字0-9 中划线 下划线组成如下
$foo $mudSlinger $mud-slinger $mud_slinger $mudSlinger1
变量的值可以是使用$set指令也可以从java代码获取 如 #set( $foo = "bar" ) 那么foo的值就被设置为 bar
属性(Properties )
属性的使用格式是$后面加变量 加 . 比如 $foo.bar
方法(Method)
比如$foo.getBar() $foo.setBar("哈哈");
简单点讲velocity的后两种类型其实就是可以对应到java 的一个类, 此处有补充
我们使用变量的时候可以增加一个大括号{} 为了防止我们的变量和web中的字母混合在一起 比如 ${foo}good 就会把foo翻译 如果不加 velocity就会把整个翻译 那就会有问题了(注意 在使用指令的时候不能加{}符号 否则是会报错的)
我们在使用的时候最好还可以加上! 如 $!{foo} 或者 $!foo , 在使用的时候我们知道如果没有定义的东西velocity会直接显示或者有些为null 加上!用来强制把不存在的变量显示为空白
下面两个代码各位可以看看效果
<html>
<body>
Hello $!foo World!
</body>
<html>
<html>
<body>
Hello $foo World!
</body>
<html>
严格模式
velocity从1.6开始推出了严格模式, 从字面理解就是要求更严啦~比如上面出现的 未定义而使用的话就会直接泡出异常(配置属性runtime.references.strict 设置为true为严格模式)
$foo ## Exception
#set($bar = $foo) ## Exception
#if($foo == $bar)#end ## Exception
#foreach($item in $foo)#end ## Exception
替代案例
现在你已经熟悉了三种使用方式那么你就可以快速的进行开发。同时velocity利用了java标准从而可以更快的进行开发
$foo $foo.getBar()
## 也可以是这样
$foo.Bar $data.setUser("jon")
## 也可以是这样
#set( $data.User = "jon" ) $data.getRequest().getServerName()
## 也可以是这样
$data.Request.ServerName
## 也可以是这样
${data.Request.ServerName}
其实相当于velocity自己后台进行了一次转化类似的javabean模式 实际上我觉得一般般看个人咯
指令
指令前面都是加上#符号
#set
#set( $primate = "monkey" )
#set( $customer.Behavior = $primate )
左边可以是变量或者对象属性 而右边只能是 变量,String,对象属性,对象方法,数字,ArrayList,Map
下面是例子
#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string literal
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number literal
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
#set( $monkey.Map = {"banana" : "good", "roast beef" : "bad"}) ## Map
#set( $foo = "bar" )
$foo
#set( $blargh = '$foo' )
$blargh #**
bar
$foo
**#
#if/#elseif/#else
<html>
<body>
#if( $foo )
<strong>Velocity!</strong>
#end
</body>
<html>
这里执行的要求是1.foo是为true的boolean 2.foo是一个不为null,空的string或者集合 3.foo是一个不为null的对象
看一下三种类型的简单使用
#if( $foo < 10 )
<strong>Go North</strong>
#elseif( $foo == 10 )
<strong>Go East</strong>
#elseif( $bar == 6 )
<strong>Go South</strong>
#else
<strong>Go West</strong>
#end
#foreach
例子
<ul>
#foreach( $product in $allProducts )
<li>$product</li>
#end
</ul>
allProducts 可以是vector,hashtable,array
如果是hashtable那么我们还可以获取键值
<ul>
#foreach( $key in $allProducts.keySet() )
<li>Key: $key -> Value: $allProducts.get($key)</li>
#end
</ul>
veloctiy还提供了简单的方法来获取循环的个数
<table>
#foreach( $customer in $customerList )
<tr><td>$foreach.count</td><td>$customer.Name</td></tr>
#end
</table>
同时,velocity还有 $foreach.hasNext,$foreach.last,$foreach.first, 同时 你还可以在循环的时候使用#break中断
## list first 5 customers only
#foreach( $customer in $customerList )
#if( $foreach.count > 5 )
#break
#end
$customer.Name
#end
#include
通过该指令可以导入自己的文件(只能是静态文件,就算导入了 .vm文件也是没用的) 多个文件可以用逗号隔开
#include("cn/dota/me.txt")
#parse
可以导入动态模板,但是只能传递一个参数用法和include一样
#evaluate
可以动态执行一个语句 类似于js中的eval
#define
可以定义一个类似宏的指令
#define( $block )Hello $who#end
#set( $who = 'World!' )
$block
Velocity入门系列的更多相关文章
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- ABP入门系列(2)——通过模板创建MAP版本项目
一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...
- Web大前端时代之:HTML5+CSS3入门系列
准备来一波新技术,待续.... Old: 联系源码:https://github.com/dunitian/LoTHTML5 文档下载:https://github.com/dunitian/LoTD ...
- 07. Web大前端时代之:HTML5+CSS3入门系列~H5 地理位置
Web大前端时代之:HTML5+CSS3入门系列:http://www.cnblogs.com/dunitian/p/5121725.html 源码:https://github.com/duniti ...
随机推荐
- Delphi 函数指针(三大好处:灵活,委托的本质,回调机制),还可把函数指针当参数传入
首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...
- C语言入门(8)——形参与实参
对于带参数的函数,我们需要在函数定义中指明参数的个数和每个参数的类型,定义参数就像定义变量一样,需要为每个参数指明类型,并起一个符合标识符命名规则的名字.例如: #include <stdio. ...
- 代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性
做人事档案的系统考虑到数据的安全性与一致性,毕竟是要对外上线.真正投入使用的项目,数据库的可靠性与安全性上我们开发人员要考虑的就很多了,记得做机房收费系统时注册新卡是自己为了简单,写成了一个存储过程( ...
- 假设说这个世界不是真实存在的,仅仅是一段代码,迄今为止你发现了哪些bug?
给这个世界写代码的不是一个人,而是一个团队(这么大的项目,一个人开发不了).并且严重怀疑这个一个开源项目.开发人员被我们觉得是神,所以一神论是不正确的,众神论才是真理,且凡人是有机会成为神的(參悟神道 ...
- ORACLE 查找字段在哪些表里存在
查找不是主键的字段在哪些表里存在: select owner, table_namefrom dba_tab_columnswhere lower(column_name)='firstname'; ...
- hive 学习笔记精简
创建表: drop table t create table if not exists t (t string) partitioned by (log_date string) row forma ...
- dedecms导入编辑器
<?php GetEditor("info","",450,"Diy"); ?>
- Unity StrangeIoc框架 (三)signal信号方式
先创建TestRoot using UnityEngine; using System.Collections; using strange.extensions.context.impl; publ ...
- nginx args
$args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie ...
- IE7.JS解决IE兼容性问题方法
转自:http://code.google.com/p/ie7-js/ 使IE5,IE6兼容到IE7模式(推荐) <!--[if lt IE 7]> <script src=&quo ...