基于NVelocity的几种内容生成方法综述
NVelocity已经用了好几年了,主要用在我的代码生成工具Database2Sharp中生成相关代码。但是,NVelocity是一个非常好的模板引擎,可以用来生成文件、页面等相关处理,非常高效方便。
它最初是在http://nvelocity.sourceforge.net/,网站上维护的,但从0.41开始,该网站将不再使用NVelocity进行更新。现在,你可以在http://nvelocity.codeplex.com/.网站上获得最新的版本更新,在版本更新操作之后,我们将介绍NVelocity的几个文件生成操作,让大家有更深入的了解。
1.基于NVelocity的几种内容生成方法
从上图可以看出,NVelocity的模板生成包括三种方式,一种是从文件到文件或字符串,另一种是从字符串到字符串。它们各自的处理方法不同,但都能正确解析里面的内容。
为了更好地利用NVelocity的特性,我们用一个初步的辅助类对其进行封装。
///summary////基于nvlocity////summary公共类nvlocityhelper { protected velocity上下文上下文}的模板文件生成辅助类;受保护的模板模板;受保护的字符串模板文件;///summary////存储键值的字典内容////summary私有字典字符串,object keyobjICT=new字典字符串,object();///summary////添加键值对象////summary//param name=' key ' key,不能重复。/param///param name=' value ' value/param///returns/returns public nvelocityhelper addkey value(字符串键,对象值){if(。KeyObjDict。ContainsKey(key)){KeyObjDict。添加(键、值);}退回这个;}上面的AddKeyValue方法..主要用于为模板引擎添加一些需要绑定到页面的变量对象,使页面变量参数的内容能够正确解析。
为了利用NVelocity的各种特性,我们需要构造模板的相关信息,并在辅助类中设置相关参数。
///summary///initialize template engine////summary protected virtual void init engine(){ try {//velocity . init(nvelocity _ property);velocity engine template engine=new velocity engine();templateEngine。SetProperty(RuntimeConstants。RESOURCE_LOADER,' file ');templateEngine。SetProperty(RuntimeConstants。INPUT_ENCODING,' utf-8 ');templateEngine。SetProperty(RuntimeConstants。OUTPUT_ENCODING,' utf-8 ');//如果设置了FILE_RESOURCE_LOADER_PATH属性,模板文件的基本路径就是基于此设置的目录;否则,默认的当前运行目录为template engine . set property(runtimeconstants . file _ resource _ loader _ path,appdomain . current domain . base directory);templateEngine。init();template=templateEngine。GetTemplate(TemplateFile);} catch(resourcenotfundexception re){ string error=string。格式(“找不到模板”模板文件);LogTextHelper。错误(错误);抛出新的异常(错误,重新);} catch(parsererrexception pee){ string error=string。格式('模板文件' : '中的模板语法错误。stack trace);LogTextHelper。错误(错误);抛出新的异常(错误,撒尿);}}在生成内容之前,您需要将相关的对象属性绑定到模板引擎的上下文对象。
///Summary////初始化上下文的内容////Summary Private void init context(){ context=new Velocity context();foreach(KeyObjdict中的字符串键。key){ context。Put(key,KeyObjDict[key]);}}1)根据模板文件构造相应的文件内容
///摘要///根据模板创建输出的文件,并返回生成的文件路径////summarypublic虚拟字符串ExecuteFile(){字符串FIlename=如果(模板!=null){ string filePath=checkendbylash(directoryOfOutput);文件名=文件路径文件名输出文件扩展名;if(!字符串IsNullOrEmpty(文件路径)!目录。存在(文件路径)){目录创建目录(文件路径);}//LogTextHelper .调试(字符串。格式('类文件输出路径:{0} ',文件名));init上下文();使用(流编写器编写器=新流编写器(fileName,false)){模板.合并(上下文、作者);} }返回文件名}2)根据模板文件构造字符串内容
///摘要///根据模板输出字符串内容////summary////param name=' TemplateFile '/param////返回公共字符串execute string(){ init context();系统。字符串写入器=新系统IO。StringWriter();模板。合并(上下文、作者);回归作家GetStringBuilder().ToString();}3)根据字符串内容构造字符串输出
///摘要///合并字符串的内容////summary////返回公共字符串ExecuteMergeString(字符串inputString){ velocity engine模板引擎=new velocity engine();模板引擎.init();init上下文();系统。字符串写入器=新系统IO。StringWriter();模板引擎.求值(上下文,编写器,' mystring ',inputString);回归作家GetStringBuilder().ToString();}上面几种操作模板输出的方式,其调用代码如下所示。
私有void btnGenerateFile _ Click(对象发送者,EventArgs e){ string tempalte=' Template/Template。htm ';//相对目录TestInfo info=new TestInfo();信息标题='测试标题;信息。内容='测试内容,这是测试内容;信息Datetime=DateTime .现在;nvlocityhelper适配器=new nvlocityhelper(tempalte);适配器。添加键值("标题","这是标题")。添加键值("内容","这是一个内容")。AddKeyValue('datetime ',系统。日期时间。现在)。AddKeyValue('TestInfo ',info);适配器FileNameOfOutput=' TestTemplate ';字符串文件路径=适配器ExecuteFile();if(!字符串IsNullOrEmpty(文件路径)){流程.开始(文件路径);} }私人作废btnGenerate _ Click(对象发送者,EventArgs e){ string tempalte=' Template/Template。htm ';//相对目录TestInfo info=new TestInfo();信息标题='测试标题;信息。内容='测试内容,这是测试内容;信息Datetime=DateTime .现在;nvlocityhelper适配器=new nvlocityhelper(tempalte);适配器。添加键值("标题","这是标题")。添加键值("内容","这是一个内容")。AddKeyValue('datetime ',系统。日期时间。现在)。AddKeyValue('TestInfo ',info);this.txtCode.Text=适配器ExecuteString();}私有void btnMergeString_Click(对象发送者,事件参数{系统.字符串生成器=新系统文本。StringBuilder();建筑商。追加(' $ { Title } \ r \ n ' ' $ Content \ r \ n ' ' $ Digest \ r \ n ' ' $ Author \ r \ n ' ' $ Keyword \ r \ n ' ' $ DateTime \ r \ n ');nvlocityhelper适配器=new nvlocityhelper();适配器。添加键值('标题','标题').添加键值('内容','内容').' AddKeyValue('摘要','摘要').' AddKeyValue('作者','作者').添加关键字值('关键字','关键词').AddKeyValue('DateTime ',DateTime .现在);this.txtCode.Text=适配器. ExecuteMergeString(生成器. ToString());}2、模板引擎城市的几种应用场景
上面的几种操作模板内容的方式,能够在绝大多数情况下满足我们的应用要求,如可以在代码生成工具里面,定义一些自定义的内容模板,然后结合数据库的元数据信息,实现丰富逻辑的代码生成操作。
也可以在一些内容管理的应用上(如文章管理方面),根据输入的内容,实现文章内容的文件生成操作,这个生成后,我们就直接使用文章的文件链接地址就可以了。
或者根据数据信息生成具体的页面,用于套打操作,如下是Winform里面的套打处理。
以上是边肖介绍的几种基于NVelocity的内容生成方法的总结,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!
版权声明:基于NVelocity的几种内容生成方法综述是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。