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 ...
随机推荐
- hdu 4801模拟题
/* 模拟: 注意:实质上一次魔方的一半要变化 用c++超内存 用g++过了 */ #include<stdio.h> #include<string.h> #include& ...
- LCA 在线倍增法 求最近公共祖先
第一步:建树 这个就不说了 第二部:分为两步 分别是深度预处理和祖先DP预处理 DP预处理: int i,j; ;(<<j)<n;j++) ;i<n;++i) ) fa[i ...
- 快速让你明白Objective-C的语法(和Java、C++对比)
很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有 ...
- c++ 高性能日志库(muduo_AsyncLogging)
c++ 高性能日志库(muduo_AsyncLogging) 实现一个高效的网络日志库要解决那些问题? 首先明确一下问题的模型,这是一个典型的多生产者 单消费者问题,对于前端的日志库使用者来说,应该做 ...
- Drainage Ditches--hdu1532(网络流 模板)
http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/Other ...
- zookeeper原理浅析(一)
参考:https://www.cnblogs.com/leocook/p/zk_0.html 代码:https://github.com/littlecarzz/zookeeper 1. 什么是Zoo ...
- C# 9.0新特性
CandidateFeaturesForCSharp9 看到标题,是不是认为我把标题写错了?是的,C# 8.0还未正式发布,在官网它的最新版本还是Preview 5,通往C#9的漫长道路却已经开始.前 ...
- HDOJ 5384 Danganronpa AC自己主动机
AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java ...
- HadoopMapReduce运行机制
1.map方法读取一个文件的一行记录进行分析, 输入:LongWritable(当前读取的文件位置), Text(内容) 2.map将读取到的信息进行分类,输入Context (键值对) ;作为 ...
- Codeforces div.2 B. The Child and Set
题目例如以下: B. The Child and Set time limit per test 1 second memory limit per test 256 megabytes input ...