Velocity魔法堂系列一:入门示例(转)
Velocity魔法堂系列一:入门示例
一、前言
Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦。
最好的学习资源——官网:http://velocity.apache.org/
本系列打算采用如下结构对Velocity进行较为全面的学习,若有不妥或欠缺望大家提出,谢谢。
1. 入门示例
4. 基础配置项
5. 深入模板引擎及调优配置
二、入门示例
示例结果是生成如下的html表单:

<form action="./submit">
<div>
<label for="title">标题:</label>
<input type="text" id="title" name="title"/>
</div>
<div>
<label for="brief">摘要:</label>
<input type="text" id="brief" name="brief"/>
</div>
<div>
<label for="sex">性别:</label>
<select id="sex" name="sex">
<option value="0">男</option>
<option value="1">女</option>
</select>
</div>
<div>
<label for="job">职业:</label>
<select id="job" name="job">
<option value="0">Java工程师</option>
<option value="1">Net工程师</option>
</select>
</div>
</form>

引入依赖项——velocity-1.7-dep.jar
模板文件frm.vm

##表单模板
##@author fsjohnhuang
##@version 1.0
## 引入外部模板文件
#parse('macro.vm')
## 主逻辑
<form action="$action">
#foreach($input in $inputs)
#input($input.title $input.id)
#end
#foreach($select in $selects)
#select($select.title $select.id $select.items)
#end
</form>

模板文件macro.vm

## 生成input表单元素区域的宏
#macro(input $title $id)
<div>
<label for="$id">$title</label>
<input type="text" id="$id" name="$id"/>
</div>
#end
## 生成select表单元素区域的宏
#macro(select $title $id $items)
<div>
<label for="$id">$title</label>
<select id="$id" name="$id">
## VTL指令紧贴左侧才能确保结果的排版正常(不会有多余空格)
#foreach($key in $items.keySet())
<option value="$key">$items.get($key)</option>
#end
</select>
</div>
#end

Java代码:

public static void main(String[] args) {
// 初始化模板引擎
Properties props = new Properties();
props.put("file.resource.loader.path", ".\\vm");
VelocityEngine ve = new VelocityEngine(props);
// 配置引擎上下文对象
VelocityContext ctx = new VelocityContext();
ctx.put("action", "./submit");
ArrayList<HashMap<String, String>> inputs = new ArrayList<HashMap<String,String>>();
HashMap<String, String> input1 = new HashMap<String, String>();
input1.put("id", "title");
input1.put("title", "标题:");
inputs.add(input1);
HashMap<String, String> input2 = new HashMap<String, String>();
input2.put("id", "brief");
input2.put("title", "摘要:");
inputs.add(input2);
ctx.put("inputs", inputs);
ArrayList<HashMap<String, Object>> selects = new ArrayList<HashMap<String,Object>>();
HashMap<String, Object> select1 = new HashMap<String, Object>();
selects.add(select1);
select1.put("id", "sex");
select1.put("title", "性别:");
HashMap<Integer, String> kv1 = new HashMap<Integer, String>();
kv1.put(0, "男");
kv1.put(1, "女");
select1.put("items", kv1);
HashMap<String, Object> select2 = new HashMap<String, Object>();
selects.add(select2);
select2.put("id", "job");
select2.put("title", "职业:");
HashMap<Integer, String> kv2 = new HashMap<Integer, String>();
kv2.put(0, "Java工程师");
kv2.put(1, "Net工程师");
select2.put("items", kv2);
ctx.put("selects", selects);
// 加载模板文件
Template t = ve.getTemplate("test.vm");
StringWriter sw = new StringWriter();
// 渲染模板
t.merge(ctx, sw);
System.out.print(sw.toString());
}

Velocity模板引擎使用时的关注点分别为以外部文件形式存在的Velocity模板和Java代码调用。
Velocity模板由VTL(Velocity Template Language)和引擎上下文对象构成;Java代码调用部分则负责初始Velocity引擎、构建引擎上下文对象、加载Velocity模板和启动模版渲染。而Velocity模板与Java代码调用部分通信的纽带就是引擎上下文对象了。
三、总结
现在我们对Velocity引擎应该有个大概的了解,后续内容将对上述内容逐一深入。
尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4112328.html ^_^肥仔John
吐槽:倘若对文本的排版有强烈的要求,那么Velocity就不是最佳选择了。
如上述示例,若想改成如下格式就要重新设计模板形式了:

<form action="./submit">
<div>
.................
</div>
<div>
.................
</div>
<div>
.................
</div>
<div>
.................
</div>
</form>

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!
Velocity魔法堂系列一:入门示例(转)的更多相关文章
- Velocity魔法堂系列一:入门示例
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Velocity魔法堂系列三:模板与宿主环境通信
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- Velocity魔法堂系列二:VTL语法详解
一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- 1.【转】spring MVC入门示例(hello world demo)
1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于 ...
- Python系列之入门篇——HDFS
Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...
- Python系列之入门篇——MYSQL
Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...
- 【转】spring MVC入门示例(hello world demo)
部分内容来自网络:<第二章 Spring MVC入门 —— 跟开涛学SpringMVC > 1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web M ...
- [WCF编程]1.WCF入门示例
一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...
随机推荐
- SkyWalking 分布式追踪系统
随着微服务架构的流行,一些微服务架构下的问题也会越来越突出,比如一个请求会涉及多个服务,而服务本身可能也会依赖其他服务,整个请求路径就构成了一个网状的调用链,而在整个调用链中一旦某个节点发生异常,整个 ...
- 学.net必学的东西 10项【不知道我能不能学这么多,!- -,光程序编辑我都累死了】
原文发布时间为:2008-10-30 -- 来源于本人的百度文章 [由搬家工具导入] 10项.NET必学的技术2007年08月28日 星期二 14:58 1、WCF (Windows Communic ...
- Android Notification通知简介
Android Notification通知简介 根据activity的生命周期,在activity不显示时,会执行onStop函数(比如按下home键),所以你在onStop函数(按退出键除外)里面 ...
- P3366 最小生成树【模板】 洛谷
https://www.luogu.org/problem/show?pid=3366 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包 ...
- Java面试题总结之OOA/D,UML,和XML
全文字数: 2732 阅读时间: 大约9 分钟 1.UML 是什么?常用的几种UML图? 统一建模语言(Unified Modeling Language,UML)又称标准建模语言:常用图包括 ...
- 查看MySQL系统变量的命令
用了好长时间mysql,却没有用心记住一些有用的东西,加油! mysql> SHOW VARIABLES; +---------------------------------+-------- ...
- Oracle 10g 升级至10.2.0.4
http://weihaoluo.blog.163.com/blog/static/224418832010112102355652/ 单实例环境 Vmware Server 1.0.6 +Cen ...
- 分析PMT changed for the ROM:it must be downloaded.升级失败。
应用场景描写叙述: 同样项目不同版本号(不同分支),使用Smart Phone Flash Tool工具交叉升级,出现PMT changed for the ROM;it must be downlo ...
- 微信小程序 常见问题 小结
1.微信小程序 尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则 ...
- 在CentOS上把Nginx从1.2.4升级到1.6.0
在CentOS上升级把Nginx从1.2.4升级到1.6.0 摘要:本文记录了在CentOS 6.3上,把Nginx从1.2.4升级到1.6.0的过程. 1. 概述 在我做的一个项目中,最近我对生产服 ...