随笔 - 48, 文章 - 4, 评论 - 332, 引用 - 20
数据加载中……

强大的模板引擎开源软件NVelocity

强大的模板引擎开源软件NVelocity

背景知识
NVelocity(http://sourceforge.net/projects/nvelocity )是从java编写的Velocity移植的.net版本,是java界超强的模版系统,.net版本的NVelocity目前版本为0.42。
NVelocity拥有完善的、丰富的模板语言(VTL,Velocity Template Language) ,几乎所有高级语言的特性都可以在模板引擎语言中找到。(如流程控制语句、数学运算、关系和逻辑操作符、函数定义、注释等等)

NVelocity可以做什么?
能够快速生成所需的代码、SQL脚本、页面文件等基于文本内容的文件
生成速度快、模板语言完善、灵活性好
容易学习、开源,免费使用
前身为Velocity(Java),使用者多,资料全

用途
在编写代码的时候,我们可以发现很多内容都是不需要变化的,变化的只是一小部分内容,对不同的对象,这些内容不同。
如果我们需要生成一个变化的文档,是否需要在代码拷贝这些不变化的内容么,或者把它剥离开放到其他的文件去么?还有我们是否能对这些内容有一些简单的控制和引用么?

简单例子(主要规则:引用以$开头用于取得什么东西,而指令以# 开始用于做什么事情)

#set($foo = false)
#if ($foo)

    this is true
#elseif ($bar)
    this is false
#elseif (true)
    this should be followed by two blank lines
#end

## this is a single line comment

#*

this is a multi line comment
#if (
*#


#set($user = "jason")
#set($login = false)
#set($count = 5)

#if ($user == "jason")

    the user $user is logged in!
#end

#if ($count == 5)

    the count is 5!
#end

#if ($login == false)

    the user isn't logged in.
#end

#if ($count != 3)
    \$count is not equal to 3
#end



变量说明
在VTL中,所有变量标识符的开头要加上$字符,如$Name,也可以用一种更加明确的方法表示,例如${name}。
变量标识符被映射到稍后即将介绍的VelocityContext对象。在模板引擎处理模板时,变量名称(如name)被替换成VelocityContext中提供的值

C#代码

 

Velocity.Init("nvelocity.properties");

VelocityContext context 
= new VelocityContext();
context.Put(
"list", Names);

Template template 
= null;
try
{
   template 
= Velocity.GetTemplate("test.cs.vm");
}

catch (ParseErrorException pee)
{
   System.Console.Out.WriteLine(
"Syntax error: " +  pee);
}

if (template != null)
{
   template.Merge(context, System.Console.Out);
}


 

注释
单行注释
## This is a single line comment


多行注释
#*
 Thus begins a multi-line comment. Online visitors won't
 see this text because the Velocity Templating Engine will
 ignore it.
*#


属性或方法
$customer.Address
$purchase.Total

$page.SetTitle( "My Home Page" )
$person.SetAttributes( ["Strange", "Weird", "Excited"] )


指令
#set( $primate = "monkey" )
#set( $monkey.Friend = "monica" )

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

    #set( $result = $query.criteria($criterion) )
    #if( $result )
        Query was successful
    #end
#end


If / ElseIf / Else
Foreach 循环

#if( $foo < 10 )
    <strong>Go North</strong>
#elseif( $foo == 10 )
    <strong>Go East</strong>
#elseif( $bar == 6 )
    <strong>Go South</strong>
#else
    <strong>Go West</strong>
#end        


<ul>
#foreach( $product in $allProducts )
    <li>$product</li>
#end
</ul>

宏 (称为函数更合适)
#macro 脚本元素允许模板设计者在VTL 模板中定义重复的段。 Velocimacros 不管是在复杂还是简单的场合都非常有用。下面这个Velocimacro,仅用来节省击键和减少排版错误,介绍了一些NVelocity宏的概念。
可以带参数,参数放在宏名称的后面,空格隔开

#macro( d )
<tr><td></td></tr>
#end

#d()


#macro( callme $a )
         $a $a $a
#end
 
#callme( $foo.bar() )

包含
#include 脚本元素允许模板设计人员包含(导入)本地文件, 这个文件将插入到#include 指令被定义的地方。文件的内容并不通过模板引擎来渲染。
#include( "one.txt" )

解析
#parse 脚本元素允许页面设计员导入包含VTL的本地文件。 Velocity将解析和渲染指定的模板。
#parse( "me.vm" )


在根目录NVelocity-***\test\templates下有各种模板语言语法的实例,在NVelocity-***\ examples目录下有如何在C#中使用模板引擎的简单例子。
在.NET中使用时候,需要应用两个程序集,NVelocity.dll 和 Commons.dll,这些文件在NVelocity-***\Build目录下。
可以加入nvelocity.properties对模板引擎的一些参数进行配置。

主要研究技术:代码生成工具、Visio二次开发
    
    转载请注明出处:
撰写人:伍华聪  http:
//www.iqidi.com 
    

posted on 2007-11-17 00:01 伍华聪 阅读(3453) 评论(28)  编辑 收藏

评论

#1楼    回复  引用  查看    

MonoRail一直推荐这个
2007-11-17 00:58 | 武眉博<活靶子.Net>      

#2楼    回复  引用  查看    

以前的nvelocity已经停止开发了。新的nvelocity是由castle小组接手在做的。
2007-11-17 07:31 | kiler      

#3楼    回复  引用  查看    

博主有没有试过marco递归?好象有问题。
2007-11-17 08:32 | 橘子&猪      

#4楼    回复  引用  查看    

@橘子&amp;猪
递归的时候哦注意对象名就可以了

用于准备json数据很好
#set($sql = "select Name from user where userid='$request.UID'")
#set($dt = $dataSource.ExecuteQuery($sql))
$vh.Include($ctx, "obj2json.htm")
{Rows:[{Name:'lisq1'},{Name:'lisq2'}]}

#foreach($r in $dt.Rows)
$r.Name<br>
#end
很好玩,很简单用于数据格式转换,提供数据片段等等
2007-11-17 09:00 | 布尔      

#5楼    回复  引用  查看    

就是很久没有继续开发了,我发现用它比较两个时间类型的对象会不好使。
2007-11-17 09:01 | 布尔      

#6楼    回复  引用  查看    

能否与StringTemplate比较一二?
2007-11-17 09:53 | Anders Cui      

#7楼    回复  引用    

关注一下,不知道和StringTemplate比较怎么样呢..
2007-11-17 10:49 | oxsoft.cn [未注册用户]

#8楼    回复  引用  查看    

需要学习新的模板语言,麻烦
2007-11-17 11:20 | 无常      

#9楼    回复  引用  查看    

感觉和asp之类的类似。
2007-11-17 11:37 | 暗香浮动      

#10楼    回复  引用    

和asp之类一样

#11楼    回复  引用  查看    

--引用--------------------------------------------------
暗香浮动: 感觉和asp之类的类似。
--------------------------------------------------------
第一眼看到就有这感觉
2007-11-17 13:41 | Enzo      

#12楼    回复  引用  查看    

StringTemplate比较弱,不支持方法调用,用原话说是严格的MVC
2007-11-17 16:38 | 布尔      

#13楼    回复  引用  查看    

Velocity没有循环中的跳出、返回等语法
#foreach($r in $dt.Rows)
这里没有返回语法 continue break return 等
#end
2007-11-17 16:39 | 布尔      

#14楼    回复  引用  查看    

喜欢 CodeSmith , 一直用了几年了。
2007-11-17 19:54 | craboYang      

#15楼    回复  引用  查看    

@craboYang

NVelocity和CodeSmith用途不同吧
2007-11-17 20:05 | Elden      

#16楼    回复  引用    

.net 2.0下使用NVelocity有问题啊,现在还在使用StringTemplate
2007-11-17 22:41 | richard_zhu [未注册用户]

#17楼    回复  引用    

借宝地一用.
首先声明,我并不认识下面提到的楼主.
之前在《大话设计模式》第29章-OOTV杯超级模式大赛—模式总结(二)url:

http://www.cnblogs.com/cj723/archive/2007/11/16/961524.html
随意发了一下评论,想不到楼主马上删除了.
我认为,在cnblogs这种技术传播自由的地方,你不同意,应该是用辩论的方式.而不是删除.
之前的回复大概如下

1.
《大话设计模式》,99.98%的抄袭,从知识传播角度,我们不禁止抄袭,但作为一本书,就该让读者让看到除抄袭的旧东西之外的作者的新的东西.
2.
由于1的存在,看不到书有什么属于是作者自己的思想,至少从楼主发布的这几篇文章来看,是这样.除了请几个所谓的小姐出来搞场.
3.
如果www.dofactory.com的
http://www.dofactory.com/Patterns/Patterns.aspx 不是楼主的创作,那你非常应该在抄袭(或叫翻译)别人作品时,征求一下原作者的同意.
2007-11-17 23:02 | matt [未注册用户]

#18楼    回复  引用  查看    

一直不明白为什么不直接用ASP.NET来生成
2007-11-18 09:47 | wu.qiliang      

#19楼    回复  引用    

几年前用过,现在看后还是挺熟悉的~

#20楼    回复  引用    

http://www.agilesource.org/content_46_1.html
这是java版本的介绍

#21楼    回复  引用  查看    

用NVelocity做的代码生成工具
http://www.nclay.cn/downcodefactory.aspx
2007-11-18 20:09 | henry      

#22楼 [楼主]   回复  引用  查看    

本人的代码自动生成工具Database2Sharp就是使用这个东西来做的,很强大,具体请看: www.iqidi.com
2007-11-18 23:52 | 伍华聪      

#23楼    回复  引用    

@伍华聪
你这个跟NVelocity没什么联系啊。
2008-02-23 11:29 | BenFeng [未注册用户]

#24楼 [楼主]   回复  引用  查看    

NVelocity是模板引擎,做代码生成需要一个模板引擎
2008-02-23 16:28 | 伍华聪      

#25楼    回复  引用    

和codesmith有啥区别?
2008-02-29 16:26 | bing314 [未注册用户]

#26楼    回复  引用    

楼主有没有做过 Nvelocity的性能测试.强烈肯求楼主发篇 Nvelocity视图引擎的性能报告~
2008-03-11 16:00 | dfsfsdfsdff [未注册用户]

#27楼    回复  引用  查看    

怎么使用Velocity中的$esc.xml ?
2008-08-14 11:43 | 山东响马      

#28楼 [楼主]   回复  引用  查看    

$esc.xml ?
这个不是很清楚,可否具体说一下?
2008-08-15 08:54 | 伍华聪      

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-11 13:05 编辑过


相关链接: