java velocity 语法_Velocity语法
1.变量
(1)变量的定义:
#set($name = "hello")说明:velocity中变量是弱类型的。
当使用#set指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:
#set($directoryRoot = "www" )
#set($templateName = "index.vm" )
#set($template = "$directoryRoot/$templateName" )
$template
输出将会是:www/index.vm
注:在velocity中使用$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以一个大写或者小写的字母开始的。
(2)变量规范的写法
${name} ,也可以写成:$name。提倡用前面的写法。
例如:你希望通过一个变量$vice来动态的组织一个字符串。
Jack is a $vicemaniac.
本来变量是$vice现在却变成了$vicemaniac,这样Veloctiy就不知道您到底要什么了。所以,应该使用规范的格式书写 : Jack is a ${vice}maniac
现在Velocity知道变量是$vice而不是$vicemaniac。
注意:当引用属性的时候不能加{}
(3)变量的赋值:
$name="hello"
赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种类型之一:
变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表。
下面的例子演示了上述的每种类型:
#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
注意:①如果上述例子中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。
②velocity模板中未被定义的变量将被认为是一个字符串。例如:
#set($foo = "gibbous")
$moon = $foo
输出结果为:
$moon = gibbous
③velocity模板中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。例如:
$foo.getBar()等同于$foo.Bar;
$data.getUser("jon")等同于$data.User("jon");
data.getRequest().getServerName()等同于
$data.Request.ServerName等同于${data.Request.ServerName}
2.循环
#foreach ($element in $list)
This is $element.
$velocityCount
#end
例子:
#set( $list = ["pine", "oak", "maple"])
#foreach ($element in$list)
$velocityCount
This is$element.
#end
输出的结果为:
1 This is pine.
2 This is oak.
3 This is maple.
每次循环$list中的一个值都会赋给$element变量。$list可以是一个Vector、Hashtable或者Array。分配给$element的值是一个java对象,并且可以通过变量被引用。例如:如果$elementt是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key)
#end
提示:velocity中大小写敏感。
Velocity还特别提供了得到循环次数的方法,$velocityCount变量的名字是Velocity默认的名字。
例子:
First example:#foreach ( $foo in [1..5] )
$foo
#end
Second example:
#foreach ( $bar in [2..-2] )
$bar
#end
Third example:
#set ( $arr = [0..1] )
#foreach ( $i in $arr )
$i
#end上面三个例子的输出结果为:First example:1 2 3 4 5
Second example:2 10 -1 -2Third example:0 1
3.条件语句
#if (condition)
#elseif (condition)
#else
#end
4.语句的嵌套
#foreach ($element in $list)
## inner foreach内循环
#foreach ($element in $list)
This is $element. $velocityCount
inner
#end
## inner foreach内循环结束
## outer foreach
This is $element.
$velocityCount
outer
#end
语句中也可以嵌套其他的语句,如#if…#else…#end等。
5.注释(1)单行注释:
## This is a single line comment.
(2)多行注释:
#*
Thus begins a multi-line comment. Online visitors won’t
see this text because the Velocity Templating Engine will
ignore it.
*#
(3)文档格式:
#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@version 1.1
@authorxiao
*#
Velocity 也具有逻辑AND, OR 和 NOT 操作符。
如
## example for AND
#if($foo && $bar)
This AND that
#end
例子中#if()指令仅在$foo 和$bar 斗为真的时候才为真。如果$foo 为假,则表达式也为假;并且 $bar 将不被求值。如果 $foo 为真,Velocity 模板引擎将继续检查$bar的值,如果 $bar 为真,则整个表达式为真。并且输出This AND that 。如果 $bar 为假,将没有输出因为整个表达式为假。
Velocity中的宏我们可以理解为函数。
①宏的定义
#macro(宏的名称 $参数1 $参数2 …)
语句体(即函数体)
#end
②宏的调用
#宏的名称($参数1 $参数2 …)
说明:参数之间用空格隔开。
8.#stop
停止执行模板引擎并返回,把它应用于debug是很有帮助的。
9.#include与#parse
#include和#parse的作用都是引入本地文件, 为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
区别:
(1)与#include不同的是,#parse只能指定单个对象。而#include可以有多个
如果您需要引入多个文件,可以用逗号分隔就行:#include ("one.gif","two.txt","three.htm")
在括号内可以是文件名,但是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )
(2)#include被引入文件的内容将不会通过模板引擎解析;
而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。
#parse是可以递归调用的,例如:如果dofoo.vm包含如下行:
Count down.
#set ($count = 8)
#parse ("parsefoo.vm")
All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTL:
$count
#set($count = $count - 1)
#if ( $count > 0 )
#parse( "parsefoo.vm" )
#else
All done with parsefoo.vm!
#end的显示结果为:
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
注意:在vm中使用#parse来嵌套另外一个vm时的变量共享问题。如:
->a.vm 里嵌套 b.vm;
->a.vm 里定义了变量 $param;
->b.vm 里可以直接使用$param,无任何限制。
但需要特别注意的是,如果b.vm里同时定义有变量$param,则b.vm里将使用b.vm里定义的值。
10.转义字符'\'的使用
如果reference被定义,两个’\’意味着输出一个’\’,如果未被定义,刚按原样输出。如:
#set($email = "foo" )
输出:
foo
\foo
如果$email未定义
输出:
11.内置对象Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
$request、$response、$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
12.数组访问
对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组又是一个特殊的Array,所以虽然数组可以进行循环列举,但却不能定位访问特定位置的元素,如 strs[2],数组对固定位置元素的访问调用了Array的反射方法get(Object array, int index),而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式来包装,要么就通过公用Util类的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的。
示例部分
1.Hello world的示例代码:
(1)Velocity模板(hello.html)
New Document
hello,$name!(注意:这里的name与VelocityTest.java中的名称要一致)
(2)将velocity模板的内容转换的类(VelocityTest.java)
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.Writer;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
/**
* Velocity转换
* @author
*/
public class VelocityTest
{
/**
* 主函数
* @param args
*/
public static void main(String[] args)
{
//获取模板引擎
VelocityEngine ve = new VelocityEngine();
//模板文件所在的路径
String path = "D:/java/jproject/regedit/webroot";
//设置参数
ve.setProperty(Velocity.FILE_RESOURCE_LOADER_PATH, path);
//处理中文问题
ve.setProperty(Velocity.INPUT_ENCODING,"GBK");
ve.setProperty(Velocity.OUTPUT_ENCODING,"GBK");
try
{
//初始化模板
ve.init();
//获取模板(hello.html)
Velocity模板的名称Template template = ve.getTemplate("hello.html");
//获取上下文
VelocityContext root = new VelocityContext();
//把数据填入上下文
root.put("name","world");(注意:与上面的对应)
//输出路径
Strint outpath = "e:/helloworld.html";
//输出
Writer mywriter = new PrintWriter(new FileOutputStream(
new File(outpath)));
template.merge(root, mywriter);
mywriter.flush();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
(3)环境的搭建
在lib目录内分别copy进:velocity-1.4.jar,velocity-dept.jar;
下载地址:http://jakarta.apache.org/velocity/
(4)运行后的结果如下:
New Document
hello,world!
2.Servlet和Velocity结合示例
(1)example.html
Velocity
Welcom to Velocity!
Here's the list of people
Names: |
#foreach ($name in $theList)
$name
#end
(2)servlet
package com.koal.velocity;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Vector;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.servlet.VelocityServlet;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.apache.velocity.exception.ParseErrorException;
public class SampleServlet extends VelocityServlet
{
/**
*由VelocityServlet.init()调用,
*在此找出模版的路径
*/
protected Properties loadConfiguration(ServletConfig config )
throws IOException, FileNotFoundException {
Properties p = new Properties();
//取得路径
String path = config.getServletContext().getRealPath("/");
if (path == null)
{
System.out.println(" SampleServlet.loadConfiguration() : unable to "
+ "get the current webapp root.Using '/'. Please fix.");
path = "/";
}
//设置路径
p.setProperty( Velocity.FILE_RESOURCE_LOADER_PATH, path);
return p;
}
/**
*Velocity主要的商业逻辑处理方法,由VelocityServlet自动调用
*@param ctx 模板上下文
*@return Template 模板信息
*/
public Template handleRequest( HttpServletRequest request,
HttpServletResponse response, Context ctx )
{
//主要在此设置演示用的数据,开发中在此调用相应的业务处理流程,
//并设置返回到页面的数据
//待展示的列表数据
String p1 = "第一位:LiuDong";
String p2 = "第二位:Liang.xf";
Vector personList = new Vector();
//中文需要转换
try {
personList.addElement(new String(p1.getBytes(), "ISO-8859-1") );
personList.addElement(new String(p2.getBytes(), "ISO-8859-1") );
} catch (Exception e) {
System.out.println("数据转换异常:"+e);
}
//设置数据,供页面模版替换成显示的数据
ctx.put("theList", personList );
//定义模板
Template outty = null;
try
{
//取模板
outty =getTemplate("example.html");
}
catch( ParseErrorException pee )
{
System.out.println("SampleServlet: parse error for template " + pee);
}
catch( ResourceNotFoundException rnfe )
{
System.out.println("SampleServlet: template not found " + rnfe);
}
catch( Exception e )
{
System.out.println("Error " + e);
}
return outty;
}
(3)在web.xml中的配置:
SampleServlet
com.koal.velocity.SampleServlet
SampleServlet
/SampleServlet
(4)环境的搭建
在lib目录内分别copy进:commons-collections.jar,velocity-1.4.jar,velocity-dept.jar;
Tomcat运行环境正常。
启动Tomcat,在IE上输入:http://localhost:8080/example,页面显示数据列表:
Here's the list of people
Names:
第一位:LiuDong
第二位:Liang.xf
Let life be beautiful like summer flowers and death like autumn leaves.
posted on 2008-06-07 10:18 Alexwan 阅读(47239) 评论(10) 编辑 收藏 所属分类: J2EE 、小笔记
java velocity 语法_Velocity语法相关推荐
- velocity模板的语法简要汇总
velocity模板的语法简要汇总 What's velocity Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template ...
- Java的12个语法糖【转】
本文转载自公众号 Hollis 原创: 会反编译的 Hollis 侵权删 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学 ...
- java基础知识——基础语法
java的基本语法格式 [修饰符] class 类名{程序代码 } 方法的定义 一般情况下,定义一个方法包含以下语法: 修饰符 返回值类型 方法名(参数类型 参数名){...方法体...return ...
- Java高级语法笔记-语法支持的异常
语法支持的异常 Java对异常支持得很彻底,举例来说: (java.lang.*下面,语法自带的异常类) 数组越界 ArrayIndexOutOfBoundsException 除0异常 Arithm ...
- Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...
Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...
- 二-Java基础-作业-基础语法
文章目录 前言 二-Java基础-环境搭建-Eclipse下载步骤和安装步骤2 二-Java基础-环境搭建-创建工程3 Java-环境搭建 总结 前言 # 二-Java基础-环境搭建-JDK-11.0 ...
- 【ssl认证、证书】java中的ssl语法API说明(SSLContext)、与keytool 工具的联系
文章目录 1. 前言 java中的ssl语法与keytool 工具的联系 2. SSLContext的体系 2.1 KeyStore 2.1.1 通过证书库文件创建: 2.1.2 随机生成自签名证书库 ...
- 编译原理实验:Java实现SLR(1)语法分析器
首先如果有熟悉Python的童鞋也可以看一看Python实现SLR(1)语法分析器,编译原理yyds!__FF_Y的博客-CSDN博客_python语法分析器,是我一个特别好的学长写的,这波属于传承了 ...
- (Java零基础学习笔记)第二章 Java中的基本语法
前言: 大家好! 我是BA unravel .如果你想和我一起学习JAVA,欢迎大家一起来学习这个世界上最好的语言! 学习目标: 一周掌握 Java 入门知识 学习内容: 1. 搭建 Java 开发环 ...
- Python同Java同Js语言语法区别之四判断字符串列表字典是否相等
字符串列表字典是否相等 前言 Python 字符串or数字 列表 字典 总结 Java 字符串 数组 Map 总结 JS 字符串 数组 对象 总结 前言 作为一枚测开工程师,需要的技能是全栈的,项目中 ...
最新文章
- java虚拟机学习(四)类的加载过程
- 一些长时间GC停顿问题的排查及解决办法
- http keep-alive
- lesson from kong fu
- python编辑时怎样换行_python怎么换行输入
- linux 怎么配置apache,在Linux下配置Apache Web服务
- Linux起不来,如何修复
- ubuntn开发php教程,Ubuntu16.04的PHP开发环境配置
- windows 查看网络中断事件_等保测评2.0:Windows安全审计
- 王校长撩妹不成反被锤爆?再有钱的舔狗也只是舔狗【Python爬虫实战:微博评论采取】
- MyCAT实现MySQL的读写分离
- PHP--数据库访问(增、删、改、查)
- xp系统打开计算机配置文件,XP系统启动Windows零配置(WZC)服务教程(图文)
- 微信小程序 转发功能实例讲解
- 进制的概念与转换(二进制、十进制、八进制、十六进制)
- 均匀分布、正态分布、二项分布、泊松分布、指数分布
- 计算机更新配置卡住了,win10更新设置卡死怎么办|win10更新设置卡死的完美解决方法...
- 大学计算机基础教程实验答案,大学计算机基础试验教程习题参考答案
- net-java-php-python-班级信息管理系统计算机毕业设计程序
- 华为MA5626 ONU配置成交换机及开启POE指令教程