Velocity魔法堂系列一:入门示例

一、前言                          

Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力。而且Velocity被移植到不同的平台上,如.Net的NVelocity和js的Velocity.js,虽然各平台在使用和实现上略有差别,但大部分语法和引擎核心的实现是一致的,因此学习成本降低不少哦。

最好的学习资源——官网:http://velocity.apache.org/

本系列打算采用如下结构对Velocity进行较为全面的学习,若有不妥或欠缺望大家提出,谢谢。

  1. 入门示例

  2. VTL语法详解

 3. 模板与宿主环境通信

  4. 基础配置项

  5. 深入模板引擎及调优配置

二、入门示例                        

示例结果是生成如下的html表单:

  1. <form action="./submit">
  2. <div>
  3. <label for="title">标题:</label>
  4. <input type="text" id="title" name="title"/>
  5. </div>
  6. <div>
  7. <label for="brief">摘要:</label>
  8. <input type="text" id="brief" name="brief"/>
  9. </div>
  10. <div>
  11. <label for="sex">性别:</label>
  12. <select id="sex" name="sex">
  13. <option value="0"></option>
  14. <option value="1"></option>
  15. </select>
  16. </div>
  17. <div>
  18. <label for="job">职业:</label>
  19. <select id="job" name="job">
  20. <option value="0">Java工程师</option>
  21. <option value="1">Net工程师</option>
  22. </select>
  23. </div>
  24. </form>

  引入依赖项——velocity-1.7-dep.jar

   模板文件frm.vm

  1. ##表单模板
  2. ##@author fsjohnhuang
  3. ##@version 1.0
  4. ## 引入外部模板文件
  5. #parse('macro.vm')
  6. ## 主逻辑
  7. <form action="$action">
  8. #foreach($input in $inputs)
  9. #input($input.title $input.id)
  10. #end
  11. #foreach($select in $selects)
  12. #select($select.title $select.id $select.items)
  13. #end
  14. </form>

   模板文件macro.vm

  1. ## 生成input表单元素区域的宏
  2. #macro(input $title $id)
  3. <div>
  4. <label for="$id">$title</label>
  5. <input type="text" id="$id" name="$id"/>
  6. </div>
  7. #end
  8. ## 生成select表单元素区域的宏
  9. #macro(select $title $id $items)
  10. <div>
  11. <label for="$id">$title</label>
  12. <select id="$id" name="$id">
  13. ## VTL指令紧贴左侧才能确保结果的排版正常(不会有多余空格)
  14. #foreach($key in $items.keySet())
  15. <option value="$key">$items.get($key)</option>
  16. #end
  17. </select>
  18. </div>
  19. #end

   Java代码:

  1. public static void main(String[] args) {
  2. // 初始化模板引擎
  3. Properties props = new Properties();
  4. props.put("file.resource.loader.path", ".\\vm");
  5. VelocityEngine ve = new VelocityEngine(props);
  6. // 配置引擎上下文对象
  7. VelocityContext ctx = new VelocityContext();
  8. ctx.put("action", "./submit");
  9. ArrayList<HashMap<String, String>> inputs = new ArrayList<HashMap<String,String>>();
  10. HashMap<String, String> input1 = new HashMap<String, String>();
  11. input1.put("id", "title");
  12. input1.put("title", "标题:");
  13. inputs.add(input1);
  14. HashMap<String, String> input2 = new HashMap<String, String>();
  15. input2.put("id", "brief");
  16. input2.put("title", "摘要:");
  17. inputs.add(input2);
  18. ctx.put("inputs", inputs);
  19. ArrayList<HashMap<String, Object>> selects = new ArrayList<HashMap<String,Object>>();
  20. HashMap<String, Object> select1 = new HashMap<String, Object>();
  21. selects.add(select1);
  22. select1.put("id", "sex");
  23. select1.put("title", "性别:");
  24. HashMap<Integer, String> kv1 = new HashMap<Integer, String>();
  25. kv1.put(0, "男");
  26. kv1.put(1, "女");
  27. select1.put("items", kv1);
  28. HashMap<String, Object> select2 = new HashMap<String, Object>();
  29. selects.add(select2);
  30. select2.put("id", "job");
  31. select2.put("title", "职业:");
  32. HashMap<Integer, String> kv2 = new HashMap<Integer, String>();
  33. kv2.put(0, "Java工程师");
  34. kv2.put(1, "Net工程师");
  35. select2.put("items", kv2);
  36. ctx.put("selects", selects);
  37. // 加载模板文件
  38. Template t = ve.getTemplate("test.vm");
  39. StringWriter sw = new StringWriter();
  40. // 渲染模板
  41. t.merge(ctx, sw);
  42. System.out.print(sw.toString());
  43. }

Velocity模板引擎使用时的关注点分别为以外部文件形式存在的Velocity模板Java代码调用

Velocity模板由VTL(Velocity Template Language)引擎上下文对象构成;Java代码调用部分则负责初始Velocity引擎构建引擎上下文对象加载Velocity模板启动模版渲染。而Velocity模板与Java代码调用部分通信的纽带就是引擎上下文对象了。

三、总结                              

现在我们对Velocity引擎应该有个大概的了解,后续内容将对上述内容逐一深入。

尊重原创,转载请注明来自:http://www.cnblogs.com/fsjohnhuang/p/4112328.html  ^_^肥仔John

吐槽:倘若对文本的排版有强烈的要求,那么Velocity就不是最佳选择了。

如上述示例,若想改成如下格式就要重新设计模板形式了:

  1. <form action="./submit">
  2. <div>
  3. .................
  4. </div>
  5. <div>
  6. .................
  7. </div>
  8. <div>
  9. .................
  10. </div>
  11. <div>
  12. .................
  13. </div>
  14. </form>

如果您觉得本文的内容有趣就扫一下吧!捐赠互勉!

Velocity魔法堂系列一:入门示例(转)的更多相关文章

  1. Velocity魔法堂系列一:入门示例

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  2. Velocity魔法堂系列三:模板与宿主环境通信

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  3. Velocity魔法堂系列二:VTL语法详解

    一.前言 Velocity作为历史悠久的模板引擎不单单可以替代JSP作为Java Web的服务端网页模板引擎,而且可以作为普通文本的模板引擎来增强服务端程序文本处理能力.而且Velocity被移植到不 ...

  4. 【java开发系列】—— spring简单入门示例

    1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...

  5. 1.【转】spring MVC入门示例(hello world demo)

    1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于 ...

  6. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  7. Python系列之入门篇——MYSQL

    Python系列之入门篇--MYSQL 简介 python提供了两种mysql api, 一是MySQL-python(不支持python3),二是PyMYSQL(支持python2和python3) ...

  8. 【转】spring MVC入门示例(hello world demo)

    部分内容来自网络:<第二章 Spring MVC入门 —— 跟开涛学SpringMVC > 1. Spring MVC介绍 Spring Web MVC是一种基于Java的实现了Web M ...

  9. [WCF编程]1.WCF入门示例

    一.WCF是什么? Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,整合了原有的windows通讯的 .net Remotin ...

随机推荐

  1. hdu 4801模拟题

    /* 模拟: 注意:实质上一次魔方的一半要变化 用c++超内存 用g++过了 */ #include<stdio.h> #include<string.h> #include& ...

  2. LCA 在线倍增法 求最近公共祖先

    第一步:建树  这个就不说了 第二部:分为两步  分别是深度预处理和祖先DP预处理 DP预处理: int i,j; ;(<<j)<n;j++) ;i<n;++i) ) fa[i ...

  3. 快速让你明白Objective-C的语法(和Java、C++对比)

    很多想开发iOS,或者正在开发iOS的程序员以前都做过Java或者C++,当第一次看到Objective-C的代码时都会头疼,Objective-C的代码在语法上和Java, C++有着很大的区别,有 ...

  4. c++ 高性能日志库(muduo_AsyncLogging)

    c++ 高性能日志库(muduo_AsyncLogging) 实现一个高效的网络日志库要解决那些问题? 首先明确一下问题的模型,这是一个典型的多生产者 单消费者问题,对于前端的日志库使用者来说,应该做 ...

  5. Drainage Ditches--hdu1532(网络流 模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/Other ...

  6. zookeeper原理浅析(一)

    参考:https://www.cnblogs.com/leocook/p/zk_0.html 代码:https://github.com/littlecarzz/zookeeper 1. 什么是Zoo ...

  7. C# 9.0新特性

    CandidateFeaturesForCSharp9 看到标题,是不是认为我把标题写错了?是的,C# 8.0还未正式发布,在官网它的最新版本还是Preview 5,通往C#9的漫长道路却已经开始.前 ...

  8. HDOJ 5384 Danganronpa AC自己主动机

     AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java ...

  9. HadoopMapReduce运行机制

    1.map方法读取一个文件的一行记录进行分析,  输入:LongWritable(当前读取的文件位置), Text(内容) 2.map将读取到的信息进行分类,输入Context  (键值对)  ;作为 ...

  10. 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 ...