一个用于动态生成静态页面的类——TextTemplate
2008-09-03 13:07
330 查看
动态生成静态页面有许多好处,比如生成html网页有利于被搜索引擎收录。同时,由于减少了数据访问,减轻对数据库访问的压力,提高了网页打开速度。于是自己编写了一个用于动态生成静态页面的类——TextTemplate(名称似乎和静态页面没有关系,这是因为它还有其他功能,这些功能将在下文提及)
笔者之前发布的.net文档生成工具中的页面和编译CHM所需的工程文件(HHP)和内容文件(HHC)都是用这个类生成的。
基本思路:
使用一个字符串作为页面模板,再页面中包含用若干标志(用 {标志名} 表示),生成页面时,将标志替换为对应的值。
实现方法:
在初始化TextTemplate实例时读入模板,以标志为分割点将模板分割成几部分,生成页面时只需简单的将模板内容和标志的值连接起来。例如:
假如有一个模板 ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN
初始化时将模板分割成 "ABCD","EFG","HIJ","KMUN"四个字符串,
假设TAG1=“123”,TAG2=“456”,TAG3=“789”
则生成是相当于执行"ABCD"+"123"+"EFG"+"456"+"HIJ"+"789"+"KMUN"
代码:
完整代码下载
实例代码:
输出为:
<img src='pic.bmp' alt='Image' />
<img src='pic.bmp' alt='image' />
其他应用:
TextTemplate还可以用来在安装网站时生成Web.Config文件,只需定义以下模板:
在设置标志 CONNECTIONSTRING 的值即可,这种方法比用XMLDocument类要方便得多。
总结:
TextTemplate的优点有:
1、模板只在初始化时就分析并分割存储,当使用同一模板生成多个页面时,只是简单的件模板内容和标志的值连接起来,不需要每次都去分析模板,如果使用string的Replace方法则每一次都要去分析字符串,而且如果标志值中含有标志,会影响生成的页面。
2、模板可以从文件读入,因此模板文件可以使用各种网页制作工具编辑。
TextTemplate虽然简单,但是功能很多...
笔者之前发布的.net文档生成工具中的页面和编译CHM所需的工程文件(HHP)和内容文件(HHC)都是用这个类生成的。
基本思路:
使用一个字符串作为页面模板,再页面中包含用若干标志(用 {标志名} 表示),生成页面时,将标志替换为对应的值。
实现方法:
在初始化TextTemplate实例时读入模板,以标志为分割点将模板分割成几部分,生成页面时只需简单的将模板内容和标志的值连接起来。例如:
假如有一个模板 ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN
初始化时将模板分割成 "ABCD","EFG","HIJ","KMUN"四个字符串,
假设TAG1=“123”,TAG2=“456”,TAG3=“789”
则生成是相当于执行"ABCD"+"123"+"EFG"+"456"+"HIJ"+"789"+"KMUN"
代码:
完整代码下载
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.Collections; using System.IO; /// <summary> /// 表示一个文本模板,该类使用一个字符串作为模板, /// 通过将模板中的标志替换为对应的值(模板中的标志用{标志名} 表示)生成新的文本 /// </summary> public class TextTemplate { TextTemplateTag[] _tags; String[] _contentParts; int _tagCount; private TextTemplate() { _tagCount = 0; _tags = null; _contentParts = null; } /// <summary> /// 用指定的模板初始化TextTemplate /// </summary> /// <param name="content">模板内容</param> public TextTemplate(String content); /// <summary> /// 用指定的模板初始化TextTemplate,模板内容重文件读入 /// </summary> /// <param name="file">模板文件位置</param> /// <param name="encoding">文件使用的编码</param> public TextTemplate(string file, Encoding encoding); /// <summary> /// 读入模板并以标志为分割点分割模板 /// </summary> /// <param name="content"></param> private void FromString(String content); /// <summary> /// 用指定的值生成文本 /// </summary> /// <param name="values">各标志对应的值(用标志名作为key)</param> /// <returns>生成的文本</returns> public string Render(Hashtable values); /// <summary> /// 用指定的值生成文本 /// </summary> /// <param name="args">各标志对应的值(忽略标志名,第一个标志对应第一个参数,以此类推)</param> /// <returns>生成的文本</returns> public string Render(params object[] args); /// <summary> /// 用指定的值生成文本,并保存到文件中 /// </summary> /// <param name="file">要保存的文件路径</param> /// <param name="encoding">文件的编码</param> /// <param name="values">各标志对应的值(用标志名作为key)</param> public void SaveAs(string file, Encoding encoding, Hashtable values); /// <summary> /// 用指定的值生成文本,并保存到文件中 /// </summary> /// <param name="file">要保存的文件路径</param> /// <param name="encoding">文件的编码</param> /// <param name="args">各标志对应的值(忽略标志名,第一个标志对应第一个参数,以此类推)</param> public void SaveAs(string file, Encoding encoding, params object[] args); /// <summary> /// 将模板以指定的分隔标志分隔成小模板 /// </summary> /// 假如有一个模板ABCD{TAG1}EFG{TAG2}HIJ{TAG3}KMUN /// 调用Split("Tag2")后生成两个模板: /// ABCD{TAG1}EFG /// HIJ{TAG3}KMUN /// <param name="splitTag"></param> /// <returns></returns> public TextTemplate[] Split(string splitTag); } internal class TextTemplateTag { int _position, _length; string _name; public TextTemplateTag(string name, int pos, int len) { _name = name; _position = pos; _length = len; } public string Name { get { return _name; } } public int Position { get { return _position; } } public int Length { get { return _length; } } }
实例代码:
static class Program { [STAThread] static void Main() { TextTemplate temp = new TextTemplate("<img src='{src}' alt='{alt}' />"); Console.WriteLine(temp.Render("pic.bmp","Image")); Hashtable values = new Hashtable(); values.Add("src", "pic.bmp"); values.Add("alt", "image"); Console.WriteLine(temp.Render(values)); } }
输出为:
<img src='pic.bmp' alt='Image' />
<img src='pic.bmp' alt='image' />
其他应用:
TextTemplate还可以用来在安装网站时生成Web.Config文件,只需定义以下模板:
<?xml version="1.0"?> <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"> <appSettings></appSettings> <connectionStrings> <add name="DJDB.LocalSqlServer" connectionString="{CONNECTIONSTRING}" providerName="System.Data.SqlClient" /> </connectionStrings> 其他配置 </configuration>
在设置标志 CONNECTIONSTRING 的值即可,这种方法比用XMLDocument类要方便得多。
总结:
TextTemplate的优点有:
1、模板只在初始化时就分析并分割存储,当使用同一模板生成多个页面时,只是简单的件模板内容和标志的值连接起来,不需要每次都去分析模板,如果使用string的Replace方法则每一次都要去分析字符串,而且如果标志值中含有标志,会影响生成的页面。
2、模板可以从文件读入,因此模板文件可以使用各种网页制作工具编辑。
TextTemplate虽然简单,但是功能很多...
相关文章推荐
- C#写的一个用于动态生成静态页面的类
- 下拉列表,选中某个值通过js动态生成一个文本框,javascript,text
- 动态生成一个textview,设置padding不起作用的解决办法。
- 关于动态生成WML文件的一个Java实例(2)
- C#动态生成静态页面
- GridView中动态生成ItemTemplate模板列
- 一个动态生成静态页的示例程序
- Linux下安装pyinstaller用于将py文件打包生成一个可执行文件
- 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式
- 动态生成与编译(五)----用CodeDOM生成一个完整的类(下)
- 结构型模式02-装饰者模式(动态为一个对象添加职责,就增加功能而言,装饰模式比生成子类更加灵活)
- 一个迷宫游戏的开始-动态迷宫生成
- [转]在网页中动态的生成一个gif图片
- 从JSP,ASP等动态页面生成静态页面的实现方式
- 使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例(6)
- 源代码:使用Antlr+Stringtemplate生成method chaining,一个不太简单的案例
- 在网页中动态的生成一个gif图片
- java中如何使用asm动态的生成或修改一个class文件以及asm的架构思想
- 输入一个数组长度,动态创建数组,所有元素随机生成,输出元素中的最大值
- .net将动态页面(aspx)生成静态页面htm | html