什么是velocity?

velocity是一个基于Java的模板引擎。你可以使用它来预定义模板,并且对模板进行数据渲染,从而动态生成相应的文本。它如同JSP一样经常被使用在MVC分层架构当中,充当View的责任。为什么说它是基于Java的呢?你可以简单地这样理解:我们可以用Java对象来存放数据,通过Java对象与模板关联,从而把数据渲染到模板当中。

所以,使用velocity你需要做三件事:

1、创建预定义模板

2、定义好数据结构

3、使用模板引擎,将数据渲染到模板当中

使用示例

我们使用maven新建一个简单的Java项目

需要引入依赖:

<dependencies>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>

创建一个预定义模板template.vm,在resources的template/velocity目录下

<!DOCTYPE html>
<html>
<head>
<title>velocity</title>
</head>
<body>
<table>
#foreach($key in $person.keySet())
<tr>
<td>$key:</td>
<td>$person.get($key)</td>
</tr>
#end
</table>
</body>
</html>

我们看到模板当中有一些有点像EL表达式的语法,这是velocity的模板语言简称VTL。

VTL详细内容可以参考官网:http://velocity.apache.org/engine/devel/user-guide.html#velocity-template-language-vtl-an-introduction

这里的模板采用了一个foreach循环,将数据循环遍历出来

写一个测试类VelocityTest

package cn.lay.demo.velocity;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.junit.Test; import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties; /**
* 非单例velocity engine示例
* @author lay
* @date 2018/10/19 00:35
*/
public class VelocityTest { @Test
public void velocityTest() {
// create engine
VelocityEngine engine = new VelocityEngine();
// get template
// get absolute file path without filename
String relativePath = "template/velocity";
String absolutePath = this.getClass().getClassLoader().getResource(relativePath).getPath();
Properties properties = new Properties();
properties.setProperty(engine.FILE_RESOURCE_LOADER_PATH, absolutePath);
// init properties
engine.init(properties);
Template template = engine.getTemplate("template.vm");
// get data
VelocityContext context = new VelocityContext();
Map<String, Object> person = new HashMap<>();
person.put("name", "lay");
person.put("age", 25);
context.put("person", person);
// render
StringWriter writer = new StringWriter();
template.merge(context, writer);
// output
System.out.println(writer.toString());
}
}

测试类中做了几件事,我们先创建了一个engine,然后获取了这个文件的绝对路径(因为是一个Java项目,直接放在了resource下的目录中)。然后将属性文件初始化到engine当中,再读取模板。我们将数据放置到context当中,并定义了一个输出流,使用模板的merge方法进行数据渲染。最后从输出流当中拿到生成的字符串,并输出到控制台。

输出结果为

<!DOCTYPE html>
<html>
<head>
<title>velocity</title>
</head>
<body>
<table>
<tr>
<td>name:</td>
<td>lay</td>
</tr>
<tr>
<td>age:</td>
<td>25</td>
</tr>
</table>
</body>
</html>

velocity可以很方便地动态生成字符串等,经常被用于如:MVC分层、SQL生成、脚本生成等。而通过VTL语言也非常轻易地做到预定义模板,并且快速地渲染数据。

参考:http://velocity.apache.org/engine/devel/index.html

veloctiy入门的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  3. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  4. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  5. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  6. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  7. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  8. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

  9. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

随机推荐

  1. c++ 多态总结

    C++的多态性用一句话概括就是: 在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数. 如果对象类型是派生类,就调用派生类的函数:如果对象类型是 ...

  2. IT男装逼利器:如何像黑客一样聊天 Mojo-Webqq

    电影里的黑客们聊天不想我们生活中的一样,用QQ.微信的客户端,都是通过命令行来进行聊天交流的,大概是为了提升逼格吧.(文末有福利~) 本文作者:KevinSVIP 今天发现一个有趣的项目:使用mojo ...

  3. Python3 操作系统与路径 模块(os / os.path / pathlib)

    #!/usr/bin/env python # coding=utf-8 __author__ = 'Luzhuo' __date__ = '2017/5/7' import os def os_de ...

  4. dwz+ssh Http status: 200 OK

    问题描述,用超链接跳转页面的时候报这个错,原因是超链接的target没有设置对, 跳转页面应该用 target="navTab", 我原先用 target="navTab ...

  5. dede发布内容限制违规词

    DEDE限制违规词代码 //词汇过滤检查 if( $cfg_notallowstr != '' ) { if(preg_match("#".$cfg_notallowstr.&qu ...

  6. 认识CSS中标题引入icon图标

    前端之HTML,CSS(十一) icon图标 icon图标的使用 获取网站的中标题icon图标,以京东为例:在域名后添加/favicon.ico Enter打开 鼠标右键,图标另存为下载icon图标, ...

  7. header请求头信息详细介绍

    https://www.byvoid.com/zhs/blog/http-keep-alive-header HTTP协议头部与Keep-Alive模式详解 1.什么是Keep-Alive模式? 我们 ...

  8. 连接Git@OSC操作步骤

    一.准备工作 软件下载 Git:地址 TortoiseGit:地址 二.安装与配置 1.Git安装 Git配置 设置客户端的用户名和email 然后,到Git@OSC 上面注册一个帐号. 这个帐号就是 ...

  9. service worker --- offline APP

    相关介绍: https://developer.mozilla.org/zh-CN/docs/Web/API/Service_Worker_API/Using_Service_Workers

  10. spring中redistemplate不能用通配符keys查出相应Key的问题

    有个业务中需要删除某个前缀的所有Redis缓存,于是用RedisTemplate的keys方法先查出所有合适的key,再遍历删除.但是在keys(patten+"*")时每次取出的 ...