数据字典生成工具之旅(6):NVelocity语法介绍及实例

时间:2023-01-05 11:38:53

本章开始将会为大家讲解NVelocity的用法,并带领大家实现一个简单的代码生成器。

  NVelocity是一个基于.NET的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由.NET代码定义的对象。从而使得界面设计人员与.NET程序开发人员基本分离。

NVelocity的常用功能简介

1、 在页面中定义变量,并进行简单的运算。

2、 在页面中获得对后台程序实体对象的引用。

3、 在页面中迭代实体对象集合。

4、 在页面中获得实体对象的属性,及其方法。

5、 对逻辑判断语句的支持。

基本语法

    1、特殊字符介绍

A、“#”:表示开始做什么事情。

B、“$”:表示用于获得什么。(以$开头的表示“引用”意思是取得一些东东.可引用变量,属性,方法)

C、“##“:单行注释。

D、 “#*… …*#”:多行注释。

   2、关键字

A、 Set:开始做什么事情,比如定义变量,给变量重新赋值等。(注意:如果右边的操作数是一个属性或命令的引用而返回null,那么赋值将不会成功,且在随后的VTL中也不能再取出使用,如果要用做if条件,一个解决办法是,先给变量赋一个值,然后再将一个属性或命令的引用赋给该变量)

B、 Foreach:迭代语句

C、 If:条件判断语句

D、 Elseif

E、 Else

F、  Even:双数执行

G、  Odd :单数执行

K、 Each:每次都执行

(备注:所有变量在未定义之前不能使用(因为我们习惯了有全局变量的习惯),一个合法的VTL标示符是以一个字母开头的。.NET后台定义的对象除外。模板语言区分大小写,所有的关键字必须为小写,默认情况下,NVelocity解析是不分大小写的,当然可以通过设置runtime.strict.math=true,采用严格解析模式。)

  3.使用示例

1、  在页面中使用变量

定义变量:#set($a = “CNF”)

引用变量:欢迎光临:$a

定义变量:#set($a = 1)

运算:#set($a = $a + 1)

输出:$a   ##得:2

运算:#set($a = $a*5)

输出:$a   ##得:10

#set( $criteria = ["name", "address"] )

#foreach( $criterion in $criteria )

#set( $result = false )  //先设置默认值

#set( $result = $query.criteria($criterion) )

#if( $result )

Query was successful

#end

#end

(备注:从以上可以看出nVelocity的替换顺序与.NET程序代码的执行基本一致,如果放在Foreach语句块中可以实现累加。并用If语句获得行号,对特殊行号的内容特殊处理。所有变量在未定义之前不能使用,.NET后台对象除外,最好采用正规引用格式,${a},正规引用格式一般用于在模板中直接调整字符串内容;静态引用输出:NVelocity遇到一个不能处理的引用时,一般他会直接输出这个引用$email的写法,页面上会看到的是$email,我们可以在$后面加上一个!号,那么就会输出空白.$!{email}如果不能处理会输出空白。如果email己定义了 (比如它的值是 foo),而这里你却想输出 $email. 这样一个字符串,就需要使用转义字符”\”,如:\$email)

2、  在页面中使用条件判断语句

#if ($p.StrSex == "女")

#set($Sex = "女士")

#elseif ($p.StrSex == "男")

#set($Sex = "先生")

#elseif ($p.StrSex == "无")

#set($Sex = "人妖")

#else

#set($Sex = "怪物")

#end

(备注:可以嵌套在Foreach语句块中,用于对每个列表对象进行特殊显示处理。)

4、使用对象方法

定义变量:#set($str = “CNF”)

调用方法:$str.SubString(0,1)

输出:C

定义变量:#set($a = 123)

调用方法:$a.GetType()

输出:System.Int32

(备注:不管是.NET代码定义的对象,还是设计人员在页面中定义的变量,都可以使用对象的方法及属性,这一点非常强大。)

5、使用even与odd简化代码,each辅助

如上面所说用IF语句可以在列表中为每行创建不同的样式,但如果只需要区分单行与双行的话,可以使用even与odd简化代码。如下:

#foreach($p in $ps)

#even

<p>双行:$p.StrName</p>

#odd

<p>单行:$p.StrName</p>

#end

(备注:在使用这两个关键字时,出现了与创建宏一样的问题,即在初始化模板引引擎的时候,如果是用模板文件内容初始化的,会出现问题)

实例介绍

  1.生成前台html

  数据字典生成工具之旅(6):NVelocity语法介绍及实例

怎么通过NVelocity生成上图的表格呢,请看下面的例子,先看模版文件

  

<table id="appMenu" style="background-color: rgb(114, 136, 172); border: solid 1px #00377a;
height: 23px; color: White; font-size: 12px; font-family: 宋体; width: 100%; cursor: default;"
cellspacing="0" cellpadding="0">
<tr>
<td style="padding-left: 5px" nowrap="">
<b>学生信息列表</b>
</td>
<td style="padding-right: 5px; text-align: right;" nowrap="">
<span><span onclick="alert(1)">新增</span> <span class="mnuBtn" onclick="alert(2)">删除</span>
</span>
</td>
</tr>
</table>
<table border="1" style="width: 100%; border: solid 1px #dbdac9; border-collapse: collapse;
table-layout: fixed; cursor: default; font-size: 12px; font-family: 宋体;" cellspacing="0"
cellpadding="0">
<colgroup>
<col width="40">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col width="12%">
<col />
</colgroup>
<tr height="22" style="background-color: rgb(233, 231, 215);">
<th align="center">
序号
</th>
<th>
学生姓名
</th>
<th>
年级
</th>
<th>
专业
</th>
<th>
性别
</th>
<th>
考试成绩
</th>
<th>
级别
</th>
<th>
申请时间
</th>
<th>
申请状态
</th>
</tr>
#foreach( $s in $ListStudent )
<tr height="22">
<td>
$s.Num
</td>
<td>
$s.Name
</td>
<td>
$s.Grade
</td>
<td>
$s.Major
</td>
<td>
$s.Sex
</td>
<td align="right">
#if($s.Status=="已审核") $s.Score #else
<input style="border:solid 1px black;width:95%;" value="$s.Score" />
#end
</td>
<td align="right">
#if($s.Status=="已审核") $s.Level #else
<input style="border:solid 1px black;width:95%;" value="$s.Level" />
#end
</td>
<td align="center">
$s.GetAppoveDate($s.Status)
</td>
<td align="center">
$s.Status
</td>
</tr>
#end
</table>

用到了foreach循环和调用类的方法,这里特别强调一下,其实NVelocity和直接写后台代码类似,通过.方法名就可以调用变量有的方法

后台代码文件

  

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Hashtable ht = new Hashtable();
List<Student> list = new List<Student>();
for (int i = ; i < ; i++)
{
Student s = new Student();
s.Num = i;
s.Name = "Test"+i.ToString();
s.Score = i.ToString();
s.Status = i % == ? "未审核" : "已审核";
s.Sex = i % == ? "男" : "女";
s.Level = i.ToString ();
s.Major = "测试";
s.Grade = "大一";
list.Add(s);
}
ht["ListStudent"] = list;
divTemplate.InnerHtml = FileGen.GetFileText(Server.MapPath(@"模版文件\列表模版.vm"), ht).ToString();
}
}

为了更方面的使用NVelocity,封装了一个帮助类即上面的FileGen类

  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NVelocity.App;
using Commons.Collections;
using NVelocity.Runtime;
using NVelocity;
using NVelocity.Context;
using System.IO;
using System.Collections; namespace NVelocityDemo
{
/// <summary>
/// SQL文件生成
/// </summary>
public class FileGen
{
/// <summary>
/// 通过模版文件路径读取文件内容
/// </summary>
/// <param name="path">模版文件路径</param>
/// <param name="ht">模版文件的参数</param>
/// <returns>StringWriter对象</returns>
public static StringWriter GetFileText(string path, Hashtable ht)
{
if (String.IsNullOrEmpty(path))
{
throw new ArgumentNullException("模版文件路径为空!");
}
try
{
string tmpPath = path.Substring(,path.LastIndexOf(@"\"));
string filePath = path.Substring(path.LastIndexOf(@"\")+);
//创建NVelocity引擎的实例对象
VelocityEngine velocity = new VelocityEngine();
ExtendedProperties props = new ExtendedProperties();
props.AddProperty(RuntimeConstants.RESOURCE_LOADER, "file");
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, tmpPath);
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true);
props.AddProperty(RuntimeConstants.INPUT_ENCODING, "utf-8");
props.AddProperty(RuntimeConstants.OUTPUT_ENCODING, "utf-8");
velocity.Init(props);
//从文件中读取模板
Template temp = velocity.GetTemplate(filePath);
IContext context = new VelocityContext();
foreach (string key in ht.Keys)
{
context.Put(key, ht[key]);
}
//合并模板
StringWriter writer = new StringWriter();
temp.Merge(context, writer);
return writer;
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 通过模版文件路径读取文件内容
/// </summary>
/// <param name="path">模版文件路径</param>
/// <param name="ht">模版文件的参数</param>
/// <param name="strOutputPath">生成文件的输出路径,如c:\1.txt</param>
/// <returns>TextWriter对象</returns>
public static void GetFile(string path, Hashtable ht,string strOutputPath)
{
if (String.IsNullOrEmpty(strOutputPath))
{
throw new ArgumentNullException("模版文件输出路径为空!");
}
try
{
StringWriter stringW=GetFileText(path, ht);
StreamWriter sw = new StreamWriter(strOutputPath,false,Encoding.UTF8);
sw.Write(stringW.ToString());
sw.Close();
}
catch (Exception ex)
{
throw ex;
}
}
}
}

上面的例子差不多将NVelocity语法都使用到了,没使用过NVelocity的可以通过上述例子学习语法,下一章将利用本章的语法写出一个简单的代码生成器,敬请期待!

    本章例子下载

工具源代码下载

目前总共有经过了七个版本的升级,现在提供最新版本的下载地址

数据字典生成工具V2.0安装程序 最新安装程序
数据字典生成工具源代码 最新源代码
http://code.taobao.org/svn/DataDicPub SVN最新源码共享地址

学习使用

如果你使用了该工具,或者想学习该工具,欢迎加入这个小组,一起讨论数据字典生成工具、把该工具做的更强,更方便使用,一起加入147425783 QQ群

      更多数据字典生成工具资料请点击数据字典生成工具专题

如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

如果,想给予我更多的鼓励,求打

因为,我的写作热情也离不开您的肯定支持。

感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是焰尾迭 。

数据字典生成工具之旅(6):NVelocity语法介绍及实例的更多相关文章

  1. 数据字典生成工具之旅&lpar;7&rpar;:NVelocity实现代码生成器

    这个系统好久没有更新了,人也慢慢变懒了,从现在开始每个月至少写三篇文章,欢迎大家监督.对了预告一下,该系列完成以后将为大家带来WebApp开发系列篇,敬请期待.先上几张图,放在文章最后面欢迎预览! 本 ...

  2. 数据字典生成工具之旅&lpar;5&rpar;:DocX组件读取与写入Word

    由于上周工作比较繁忙,所以这篇文章等了这么久才写(预告一下,下一个章节正式进入NVelocity篇,到时会讲解怎么使用NVelocity做一款简易的代码生成器,敬请期待!),好了正式进入本篇内容. 这 ...

  3. 数据字典生成工具之旅&lpar;3&rpar;:PowerDesign文件组成结构介绍及操作

    从这篇开始将正式讲解整个重要部分的实现细节,本篇讲解Pdm文件的解析.其实PDM文件就是XML文件,可以用Editplus或者VS打开查看.了解到这一点之后大家就能猜到,可以用解析XML的方式读取PD ...

  4. 数据字典生成工具之旅&lpar;4&rpar;:NPOI操作EXECL

    这篇会介绍NPOI读写EXECL,读写EXECL的组件很多,可以使用微软自己的COM组件EXECL.exe读写,不过这种方式限制很大. 1:客户环境必须装Office(虽然现在机子上不装Office的 ...

  5. 数据字典生成工具之旅&lpar;8&rpar;:SQL查询表的约束默认值等信息

    上一篇代码生成工具里面已经用到了读取表结构的SQL,这篇将更加详细的介绍SQL SERVER常用的几张系统表和视图! 阅读目录 系统表视图介绍 实际应用 本章总结 工具源代码下载 学习使用 回到顶部 ...

  6. 数据字典生成工具(生成Excel&comma; Word&comma;PDF&comma;html)

    转自:http://www.cnblogs.com/yanweidie/p/3838765.html 数据字典生成工具之旅系列文章导航 数据字典生成工具之旅系列文章导航 宣传语 数据字典生成工具.数据 ...

  7. &period;NET平台开源项目速览&lpar;4&rpar;&period;NET文档生成工具ADB及使用

    很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习一些开源项目的过程中,官方没有提供CHM帮助文档,所以为了快速的了解项目结构和注释.就生成文档来自己看,非常好用.这也是一个学习方法吧 ...

  8. 微软开源全新的文档生成工具DocFX

    微软放弃Sandcastle有些年头了,微软最近开源了全新的文档生成工具DocFX,目前支持C#和VB,类似JSDoc或Sphinx,可以从源代码中提取注释生成文档之外,而且还有语法支持你加入其他的文 ...

  9. (转)Doxygen文档生成工具

    http://blog.csdn.net/lostaway/article/details/6446786 Doxygen 是一个支持 C/C++,以及其它多种语言的跨平台文档生成工具.如同 Java ...

随机推荐

  1. out

    //练习1 class Program { static void Main(string[] args) { //写一个方法 求一个数组中的最大值.最小值.总和.平均值 int[] numbers ...

  2. MFC编程入门之十一(对话框:模态对话框及其弹出过程)

    加法计算器对话框程序大家照着做一遍后,相信对基于对话框的程序有了些解了,有个好的开始对于以后的学习大有裨益.趁热打铁,这一节讲讲什么是对话框和非模态对话框,以及模态对话框怎样弹出. 一.模态对话框和非 ...

  3. addClass的用法和is函数的用法

    <html> <head> <meta charset="utf-8"> <script type="text/javascri ...

  4. 在Cubieboard上关闭irqbalance服务避免内存泄漏

    十一一个假期回来,顺手看了看自己的cubieboard运行状态怎么样 aria2正常: btsync正常: samba正常: 很好, 顺手htop一下,已经开机了13天了,CPU使用率4%,内存使用率 ...

  5. python自动开发之第十八天

    一.JS正则 test - 判断字符串是否符合规定的正则 rep = /\d+/; rep.test("asdfoiklfasdf89asdfasdf") # true rep = ...

  6. 实战Google深度学习框架-C3-TensorFlow入门

    第三章:TensorFlow入门 TensorFlow存在计算模型,数据模型和运算模型(本文用TF代表TensorFlow) 3.1 计算模型-计算图 3.1.1 计算图的概念 TensorFlow这 ...

  7. C&num; 获取变量或对象的栈与堆地址

    C# 获取变量或对象的栈与堆地址 来源 https://www.cnblogs.com/xiaoyaodijun/p/6605070.html using System; using System.C ...

  8. 1、代理服务器及haproxy基础

    1.web站点架构 前端一台主机提供app server,当用户请求到达时,如果要存储结构化数据,就需要找一台主机做database server.当业务达到一定程度时,要把web server.存储 ...

  9. 【python中单链表的实现】——包括初始化、创建、逆序、遍历等

    # coding=utf-8 class mynode(object): def __init__(self, data, nextnode = None): self.data = data sel ...

  10. Git管理工具对比(GitBash、EGit、SourceTree)&lpar;转载&rpar;

    Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...