`

用Velocity进行配置文件信息的集中管理

阅读更多

Apache从他诞生的那天起就改变着我们的生活方式。而Velocity的出现也不是个例外。Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP之外又提供了一种可选的方案。

曾几何时,还记得自己每次对JSP页面做一点小小的改动,就需要痛苦的几秒钟等待时间,好让JSP容器按部就班的把JSP页面先生成为Java文件,然后又将该Java文件编译成class文件,最后再将结果返回。然后又可能由于是自己的一时疏忽导致的一个小bug,使得你不得不再次去重复同样的工作。现在,当我们有了 Velocity 之后,页面的修改不再变成一件让人痛苦的事情。它可以让你彻底体验页面改动带来的飞速回报。这也是 Velocity 值得称道的地方之一:他拯救了我们的WEB程序员们。于是,你Google一下,随便就可以在网上找到成千上万的关于 Velocity 如何进行Web开发的相关文章。

Velocity之所以如此famous、如此优秀,是因为Velocity的能力远不止web表现层开发这个领域,Velocity的诞生也为开发界带出了另一个话题——模板化(至少是使得模板化更加简单易行),而web表现层的应用仅仅只是“模板化”话题中的一个分支而已,我今天想聊一聊关于 Velocity 为大多数程序员所不够关注但是又非常重要的应用——配置文件模板化。
今天的软件开发界是一个开源插件满天飞的世界。什么Hibernate.cfg.xml、Hibernate.hbm.xml、struts-config.xml、spring.xml、web.xml甚至是tomcat、JBoss的一些配置都需要我们在发布产品的时候一并进行配置。其实,一个通常的工程其配置文件远远不止这些,在工程应用中,我们为了提高系统的灵活性,在开发阶段会引入大量的配置文件,而这些配置文件都会由于客户需求的变化、工程运行环境的不同出现不同的差异。同时又与操作系统(windows、Linux)、数据库、网络环境的参数有密切的关系。常态下,需要正确配置这些信息必须首先是一个对系统非常熟悉的Senior Engneer。但是,事实上是我们不可能为了解决这些系统配置的信息去每次找几个Senior Engneer去处理这些得不偿失的事情。那么问题就来了,既然不是由Senior Engneer来处理这些事情,那么那些其他的Junior Engneer有没有足够的能力去处理这些事情。有什么办法可以在这两者之间做出权衡呢。

一种可行的解决方案就是将这些配置成可替换的参数,然后找一个文件对这些需要配置的数据进行集中管理,这样当我们需要修改某些配置信息时,我们只需要在该文件中集中处理然后执行一个简单的替换操作所有的事情就全部OK了。于是我们想到了Velocity,这个看起来处理模板数据本该是天性使然的家伙,能否给我们一个预料之中的惊喜呢。其实我们的问题就转移到了,Velocity是否有能力将我们的参数一一进行提换的问题了。

小实验马上展开:
根据提供的接口我们很快写出了上面的这段代码,其中createFile() 方法是参数替换的具体实施者。
其中用到的两个配置文件内容分别如下:

java 代码
  1. package org.danlley.util.samples;   
  2.   
  3. import java.io.BufferedWriter;   
  4. import java.io.FileInputStream;   
  5. import java.io.FileWriter;   
  6. import java.util.Enumeration;   
  7. import java.util.Properties;   
  8.   
  9. import org.apache.velocity.Template;   
  10. import org.apache.velocity.VelocityContext;   
  11. import org.apache.velocity.app.Velocity;   
  12.   
  13. public class VelocityFirstStep{   
  14.     public static void main(String[] args){   
  15.         String resourceFileName="first_step.properties";   
  16.         String destPath="./target/classes/";   
  17.         String destFileName="generator.properties";   
  18.         try{   
  19.             createFile(resourceFileName,destPath,destFileName);   
  20.         }catch(Exception e){   
  21.             e.printStackTrace();   
  22.         }   
  23.     }   
  24.   
  25.     /**  
  26.      * <p>comments : danlley 【伏羲狂徒】  
  27.      *              mailto: danlley@126.com  
  28.      *              Blog: http://danlley.iteye.com  
  29.      *                    http://danlley.cublog.cn  
  30.      *          </p>  
  31.      * author  danlley 【伏羲狂徒】  
  32.      * coding date  2007-7-24  
  33.      * @param resourceFileName  
  34.      * @param path  
  35.      * @param destFileName  
  36.      * @throws Exception  
  37.      */  
  38.     public static void createFile(String resourceFileName,String path,String destFileName) throws Exception{   
  39.         Properties p=new Properties();   
  40.         p.setProperty(Velocity.INPUT_ENCODING,"GBK");   
  41.         p.setProperty(Velocity.OUTPUT_ENCODING,"GBK");   
  42.         Velocity.init(p);   
  43.         Template template=Velocity.getTemplate(path+destFileName);   
  44.         VelocityContext context=new VelocityContext();   
  45.         p.load(new FileInputStream(path+resourceFileName));   
  46.         Enumeration enu=p.keys();   
  47.         String key,value;   
  48.         while(enu.hasMoreElements()){   
  49.             key=enu.nextElement().toString();   
  50.             value=p.get(key).toString();   
  51.             context.put(key,new String(value.getBytes("ISO-8859-1"),"GBK"));   
  52.         }   
  53.         BufferedWriter writer=new BufferedWriter(new FileWriter(path+destFileName+".txt"));   
  54.         template.merge(context,writer);   
  55.         writer.flush();   
  56.         writer.close();   
  57.     }   
  58. }   


 

first_step.properties内容如下:

username=伏羲狂徒
passport=welcome to danlley's home page
messages=hello velocity

generator.properties中我们暂时只配置一条模板数据:

第三方第三方第三个大股东范甘迪说个======$username======改动热管热个人股热管热管大商股份第三个
passport=$passport
messages=$messages

运行程序得到生成文件generator.properties.txt

 

永远都不要忘了,老外的东西对我们中国的汉字从来都是照顾不周的。因此,我们在写程序的时候永远都应该对我们的汉字怀着悲天悯人之心,多加照顾(谁让我们不争气呢)。Velocity也理当如此,打开Velocity的源码,看看他在处理模板时是怎样设置编码格式的,当然程序员都是比较“懒惰”的,所以你也可以下面的代码仅仅是看看就行了:

java 代码
  1. System.out.println(template.getEncoding());//--默认是ISO-8859-1  


但是如果你真的对Velocity的编码设置感兴趣org.apache.velocity.runtime.resource包下的Resource类可能会对你有一定的参考价值。


运行程序后得到的generator.properties.txt内容如下:


第三方第三方第三个大股东范甘迪说个======伏羲狂徒======改动热管热个人股热管热管大商股份第三个
passport=welcome to danlley's home page
messages=hello velocity


这样,一个简单的模板管理的雏形就已经呈现在我们的面前了。其中first_step.properties在这里可以作为一个集中管理者,而generator.properties则是代替换的参数模板文件,最后generator.properties.txt则是我们需要的“熊掌、鱼翅”。思路已经有了,实现的可行性也已经验证了。那要想把他真正用在工程中,剩下的就只是对其进行扩充了。

看似好像没什么问题了,但是好像又不是很完美。为什么!用起来不方便,如果是在Ant和Maven中,我可以把整个参数替换过程放置在某个测试类中,然后运行一下,但是保证这个测试类的运行要先于其他测试类的运行就是一个令人头疼的事情,而且,参数替换过程本来就不属于工程代码的一部分,他应该是一个独立的组件才对。所以我们就把它开发成一个组件。不要拖动滚动条,因为下面没了,呵呵呵呵。我打算在下一个专题中来专门阐述一下基于Velocity的Ant和Maven插件开发过程。关注我的博客吧,^_^

 

参考资料:
http://ahuaxuan.iteye.com/blog/71430
http://www.open-open.com/open2821.htm

分享到:
评论
1 楼 galaxystar 2007-07-27  
楼主正解, velocity做配置文件的动态渲染是再好不过了!

相关推荐

    node-v7.2.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.14.2-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    rbac权限控制框架:1.支持角色继承,数据组,行为组.zip

    rbac权限控制框架:1.支持角色继承,数据组,行为组.zip abac,rbac权限控制框架 支持角色继承,数据组,行为组 支持动态角色和静态角色 usage 用户与角色需要额外维护 权限控制规则默认驻留内存, 可自定义RuleRepository实现 角色继承关系默认驻留内存, 可自定义RoleHierarchyRepository实现 数据组关系默认驻留内存, 可自定义DataGroupRepository实现 行为组关系默认驻留内存, 可自定义ActionGroupRepository实现 若使用动态角色需要实现DynamicRoleDefiner

    utlog.sqlite

    utlog.sqlite

    node-v0.12.8-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.2.1-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.6.0-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v7.7.4-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    xia0FridaScript-master.zip

    xia0FridaScript-master.zip

    煤炭地质勘查钻孔质量标准MTT1042-2007.pdf

    煤炭地质勘查钻孔质量标准MTT1042-2007.pdf

    149煤矿生产安全事故现场处置方案.pdf

    149煤矿生产安全事故现场处置方案.pdf

    信息办公个人求职管理系统-jobgljsp.rar

    javaweb登录注册页面,[信息办公]个人求职管理系统,jsp开发源码。

    煤矿重要用途钢丝绳.PDF

    煤矿重要用途钢丝绳.PDF

    2023-06-30-东方财富证券-华电重工-深度研究:乘氢能之风,新能源巨轮远航.pdf

    2023-06-30-东方财富证券-华电重工-深度研究:乘氢能之风,新能源巨轮远航

    node-v5.4.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    超详细Python教程,适合零基础小白学习

    超详细Python教程,包含Python数据结构、对象、模块、迭代器等等超多内容 Django框架教程

    node-v7.9.0-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    微信小程序考试系统.zip

    微信小程序考试系统.zip 微信小程序考试系统 1.安装微信web开发工具 2.运行微信web开发工具,点击小程序项目,选择新建(+),选择压缩包下的examSystem-exam1.0文件夹, 填写AppID(AppID:wx2fd6fcc3d4a9a059),定义项目名称,导入项目 3.文件目录说明 app.json 当前小程序的全局配置,包含了小程序所有页面路径 .wxml wxml文件定义小程序页面布局 .js js文件定义用户相关操作事件(交互逻辑) .wxss wxss文件定义当前小程序页面的局部页面样式 具体页面路径 pages/index/index:系统登录页面 pages/grid/index:登录成功后系统菜单页 pages/answer/answer:考试中心答题页面 pages/wrongQuestion/wrongQuestion:错题集页面 pages/logs/logs:日志文件 image:系统需用到图片 dist:UI框架需要icon、js 4.登录账号 姓名:admin 部门:001

    node-v7.10.0-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于AMDavaScript模块加载器迄今为止对AMD理解最好的实现

    功能概述 100% 支持 AMD 规格。支持模块化开发。定义模块后,无需维护依赖模块即可使用模块,只需编写一个依赖,lodJS 会自动负责依赖注入。 特性 模块化开发支持 异步加载 依赖注入 灵活的自定义功能 兼容性 Safari 浏览器 6+ (Mac) iOS 5+ Safari浏览器 Chrome 23+(Windows、Mac、Android、iOS、Linux、Chrome 操作系统) Firefox 4+(Windows、Mac、Android、Linux、Firefox 操作系统) Internet Explorer 6+(Windows、Windows Phone) Opera 10+(Windows、Linux、Android

Global site tag (gtag.js) - Google Analytics