一、前言
Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦。
最好的学习资源——官网:http://velocity.apache.org/
本系列打算采用如下结构对Velocity进行较为全面的学习,若有不妥或欠缺望大家提出,谢谢。
1. 入门示例
2. VTL语法详解
3. 模板与宿主环境通信
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>
模板文件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>