升级到NVelocity1.1版本

由于NVelocity项目太久没有升级了,虽然看到Velocity经常发布一些新的功能,但.net版本的修改似乎比较迟。以至于很少关注升级情况。由于前期使用这个模板引擎的时候发现对DataTable支持不太好,原先想自己修改一下源代码,但分析了一下源代码发现改不动,也没有精力去研究。(最近越来越懒了^_^

  开源代码及最新下载:http://sourceforge.net/projects/castleproject/files/

 

今天看到Richie写的关于1.1的两篇文章发现新版本已经解决了我想要的支持。真是太高兴了,随即结合《Castle NVelocity - 1.1整理了一下相关的代码供大家参考。

   

原先使用0.4X版本的时候其实也可以使用DataTable,但就是有些麻烦,我也是经过反复的测试后终于想到一个办法来处理,作法如下:需要循环行记录的情况下再循环列,然后根据列号把值写到变量里,相当的麻烦。

#foreach($Item in $dtSubSortList.Rows)

#set ($rownum = 0)

#foreach($value in $Item.ItemArray)

#set ($rownum = $rownum+1)

#if($rownum == 1)

#set($CATEGORY_ID = "$value")

#end

#if($rownum == 2)

#set($CATEGORY_NAME = "$value")

#end

   

#end

<tr> <td class="daoh_1"><div class="wenz_2"><a href="$!{WebRoot}cms/listPage.aspx?categoryId=$!{CATEGORY_ID}&parent=$!{categoryid}">$CATEGORY_NAME</a></div></td></tr>

#end

新版本的写法就非常的简单了:

#foreach($Item in $dtSubSortList.Rows)

<tr> <td class="daoh_1"><div class="wenz_2"><a href="$!{WebRoot}cms/listPage.aspx?categoryId=$Item.CATEGORY_ID">$Item.CATEGORY_NAME</a></div></td></tr>

#end

但现在不足的之处就是还不支持索引的写法,如$Item[0] 或者 $Item["字段名"]

   

我整理的部分代码里封装了NVelocityHelper,并写一下模板页的基类PageBaseTemplate等内容,仅供大家参考。

PageBase.cs

这个属性可以通过一些扩展实现多级子站的模板定制功能(大家可以自己思考一下,我只是使用了目录的方式进行处理,应该还有其它更好的方法)。

   

   

1.1版本的使用说明在《Castle NVelocity - 1.1 》有详细的说明,非常感谢。

   

原代码及最新的组件都在这里: /Files/liubiqu/NVelocity1.1Demo.rar

   

代码内容:

由于时间关系还没有详细的研究,下列问题有待进一步测试:

1、velocity.GetTemplate是否有提供一些缓存与优化的处理

2、velocity.Evaluate的时候log的参数有什么用处及整合到其它日志方法

3、在性能方面有没有更好的处理方式。

   

posted @ 2010-04-14 20:16 小草 阅读(2297) 评论(20) 编辑 收藏

 回复 引用 查看   
#1楼2010-04-14 20:32 | wingoo      
真巧,最近在用nvelocity做一个小项目
发现不支持索引读取真是麻烦啊
对于在一个foreach中想根据当前的索引调用另外一个list中的数据,该怎么实现呢?我现在都在后台生成完太绑定,太麻烦

 回复 引用 查看   
#2楼2010-04-14 21:27 | koumi      
Nvelocity的确不错。我用它做过几个成功的项目。
也用的比较熟练。相比Template来说是要强大点!

 回复 引用 查看   
#3楼[楼主]2010-04-14 21:42 | 小草      
@wingoo
看来和我的问题一样,我现在的解决办法就是数据的处理都放在存储过程里加工好了再用游标的方式输出到前台。这样子就是一个一个的datatable了。

 回复 引用 查看   
#4楼2010-04-14 21:52 | riccc      
@wingoo
如果只是要读取当前列表的循环索引,可以通过ExtendedProperties设置一下循环的变量名,在vm中使用这个变量名就可以引用到循环的索引了
prop.AddProperty(RuntimeConstants.COUNTER_NAME, "index");
vm里面用$index就可以了

 回复 引用 查看   
#5楼[楼主]2010-04-14 22:07 | 小草      
@riccc
学习了。谢谢

 回复 引用 查看   
#6楼2010-04-15 07:08 | inhesoft      
@小草
与3楼的作法类似

 回复 引用 查看   
#7楼[楼主]2010-04-15 08:46 | 小草      
http://www.castleproject.org/主页上找到源代码了
March 2010: Our main source code repository has moved to Git.
原来刚刚移到新的代码平台了。想要NVelocity1.1的源代码可以从以下这个地方来获取:http://github.com/castleproject/NVelocity

但是在主页上的下载指向的还是旧的代码库,所以差点被误导了。呵呵^_^

 回复 引用 查看   
#8楼2010-04-15 09:27 | 马陈灵      
我记得NVelocity在并发比较大的时候好像会崩溃,不知道新版本会不会有这个问题
 回复 引用 查看   
#9楼2010-04-15 09:45 | 踏云风      
引用http://www.castleproject.org/主页上找到源代码了
March 2010: Our main source code repository has moved to Git.
原来刚刚移到新的代码平台了。想要NVelocity1.1的源代码可以从以下这个地方来获取:http://github.com/castleproject/NVelocity

但是在主页上的下载指向的还是旧的代码库,所以差点被误导了。呵呵^_^

原来源码在这里下载,之前我找了很久。
现在的NVelocity 好像有两个分支,除了这个,还有另外一个。好像是跟着Velocity 的版本走的。
另外的一个分支的:http://www.codeplex.com/NVelocity
目前最新是1.6.1 beta,
我也是用了跟楼主一样的版本,也没时间去研究另外的分支是怎样的。
用的时候也碰到这个对DataTable 或者 List<T>这种的索引的问题。每次都要用foreach去处理。

不过感觉用NVelocity还是挺好的。特别是对生成静态页面。处理起来很舒畅。呵呵

 回复 引用 查看   
#10楼2010-04-15 11:38 | henry      
@wingoo
是支持,索引器通过过[""]是访问不到,但有可以通过调用get_Item(xx)方法代码.

 回复 引用 查看   
#11楼2010-04-15 12:56 | wingoo      
引用henry:
@wingoo
是支持,索引器通过过[""]是访问不到,但有可以通过调用get_Item(xx)方法代码.


恩,试了下,确实可以

 回复 引用 查看   
#12楼[楼主]2010-04-15 13:18 | 小草      
http://www.codeplex.com/NVelocity 这个还是新发现呀,谢谢共享。

@马陈灵
我觉得具体要看一下是什么原因,如果是IO的问题,倒是有一种比较土的办法就是把所有的模板都先缓存到内存里,这样就会大大减少对IO的要求。

至少目前我还没有碰到过这样子的问题,有碰到再跟大家汇报一下。另外http://www.cnblogs.com/RicCC/archive/2010/04/03/nvelocity-vs-stringtemplate-performance.html 这篇文章给我了挺大的信心。虽然我还没有亲自试验过,但相信应该是不错的。

 回复 引用 查看   
#13楼2010-06-30 22:30 | jww      
props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true); //是否缓存 props.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)30); //缓存时间(秒)
 回复 引用 查看   
#14楼2010-07-01 14:37 | jomoleo      
不知道使用这些模板技术有什么好处。可以提高开发效率,还是提高运行效率?
 回复 引用 查看   
#15楼[楼主]2010-07-01 22:29 | 小草      
@jomoleo
使用模板技术可以适应客户对界面的调整需求,定制多级站点的界面效果等,好处挺多的,主要看如何应用了。

 回复 引用 查看   
#16楼[楼主]2010-07-01 22:29 | 小草      
@jww
谢谢,学习了

 回复 引用 查看   
#17楼2010-12-14 03:33 | Richwong      
引用jww:props.AddProperty(RuntimeConstants.FILE_RESOURCE_LOADER_CACHE, true); //是否缓存 props.AddProperty("file.resource.loader.modificationCheckInterval", (Int64)30); //缓存时间(秒)



测试了1.1.1版本,这样设置缓存无效.

 回复 引用 查看   
#18楼[楼主]2010-12-15 12:11 | 小草      
@Richwong这个没有具体的测试过,不过我感觉自己做缓存来直观一些,可以把模板内容先加载到内存中,然后就不需要通过IO读取模板文件,这样子可能更快一些,不过更新模板的时候需要清空一下缓存到内存中的模板就可以了。
 回复 引用 查看   
#19楼2011-12-18 15:50 | cyberspace      
下载只有个dll啊,没有源代码?不是开源的吗?
 回复 引用 查看   
#20楼2011-12-18 16:11 | cyberspace      
没有支持framework2.0的版本吗?