更新模板类,和一些使用经验
下载 /Files/vitality2007/TemplateWeb.rar
不管用什么样的服务器端技术。客户端接受的都是html字符串。在接受的项目中,于是我就使用了一种比较极端的方式。完全抛弃服务器端控件。自己写函数一个table一个td的拼出最终显示页。有点类似与以前asp的开发方式。不使用服务器端控件。可以加快页面生成速度,节省了服务器资源。连微软都提倡尽量避免使用服务器端控件。用ajax实现服务器端控件的回送,可以得到更好的用户体验。
为了方便开发,于是借用php模板类的一些思路。开发出一个完全适合asp.net的模板类。模板类作的就是辅助你完成最终的页面html字符串拼接。程序员只要完成关键的逻辑。数据处理。烦琐的html字符串拼接,合成全部是由模板类来完成。标签不只是和一个字段结合。使用net里的委托。方便的和一个函数调用结合。既增加了标签输出结果的灵活性。有完全避免了使用反射带来的性能损耗。个人觉得,开发asp.net的模板类,是应该要使用委托的。
直接修改模板内标签的参数,控制命令。可以在不重新编译的情况下。动态控制页面程序的编译后输出结果。带来的结果是网站修改页面时,原先很多必须要重新修改代码,重新编译后才可以实现的结果,现在只要维护人员改改标签参数,就可以实现。当然要增加功能,必须要加新的标签了。用w3c的思想。把样式类的名字做为标签的参数数值,直接把样式传到标签解析函数内,生成解析结果。可以做到只改变标签参数,使用不同的样式。就可以让相同的页面有两种截然不同的表现形式。改版太方便了。
在得到美工的静态页面以后。一般使用模板类的做法是首先页面把可以分离出来的部分切出来。做成专门的页面模板碎片。程序员在把模板碎片内的表示数据逻辑的部分用一个标签代替。写出对应的标签解析函数。当模板类解析碎片完毕以后得到的解析结果可以写到shtml文件内,让动态或静态页包含。也可以直接在动态页上输出解析结果。当然还可以直接写到一个静态页上。更新静态页。甚至我门可以让用户自己修改模板碎片,用户自己定植页面显示方式。
我的例子是读模板产生一个新的静态页或直接显示,但是模板类内部的算法表示,他更大的作用是读模板碎片。并把解析的字符串直接在动态页上显示。
我个人比较懒,也没有很多时间。除了对模板类做一些性能优化以外。使用方法的例子几乎没有更新过。大家就看 这个地址的站点 www.93913.com 这个站点完全使用模板类一个表一个表的拼出来的,绝大部分页面。都是有对应的模板页的。其中的blog部分,完全是模板来实现的。熟练使用模板类,开发这种拼页面的项目。开发速度一点也不比用控件慢。并且这个站点是用一种正则模板类来开发的。除了标签的使用方法一样。不支持命令块部分,不支持loop循环。不缓存模板和一些分析数据。个人测试,正则模板类标签定位速度比指针模板类定位速度要慢上9倍以上。这个站点说明,用模板开发,完全拼页面输出的站点是可行的。
介绍:
此模板类是为三层架构大型web站点开发而编写的。StringTempletReplet.dll组件内包含模板类。
StringTempletReplet命名空间内的模板类可以使用在UI层,也可以使用在逻辑层。
************************************************************************************************
运行方法:
建立一个名叫 TemplateWeb 的虚拟目录指象 TemplateWeb 文件夹
运行内部的 Default.aspx 页面。在页面cs文件上有对应说明。
第一次打开页面应为要保留委托对象和模板文件,标签解析数据到缓存中,所以真正的速度要看第一 次以后的。当然现在的开发趋势是尽量使用内存内的数据,应为现在的服务器的内存一般都很大。瓶 径多发生在和数据库的连接上,很少是内存的使用上。当然如果你的服务器内存小,可以尽量使用小 的模板页面。
************************************************************************************************
原理介绍:
一种标签替换的模板。使用了c#中的指针运算查找标签位置。
用委托对象指象标签对应的解析函数,并用静态对象缓存全部委托对象。
在不改变模板正文的情况下,缓存全部模板内容。缓存模板解析数据。改变配置,可以动态更换模板
也可以非动态更换模板。达到更快的速度。
************************************************************************************************
标签介绍:
在成对特殊符号{$ 和 $} 之间的内容为标签
如
{$标签名:参数1:参数2:参数3::字符10$}
{$标签名:参数1:参数2::字节10$}
在标签内部通过 :: 符号把标签分为 标签参数部分 和 命令控制部分 两块
{$标签名:参数1:参数2:参数3::字节10$}
标签参数部分 :: 命令控制部分
在这两部分内以:号分割标签参数部分和命令控制部分
标签参数部分: 第一个为标签名,就是标签解析函数的对应名称,以后的为函数的参数, 标签解析函数接受全部参数类型为string类型的,参数个数为0--20个的函数,返回类 型为string类型
命令控制部分: 现在只有两个命令符号 字符 和 字节 ,后带一个数字参数,表示截取标签解析结果 的长度。我以后会在扩展其他的命令控制符号
标签和函数对应请看Business.cs 文件内说明
标签具体使用规则请看templet/aa1.htm 模板内说明
具体调用规则请看项目中的这三个aspx页面
WriteArticon.aspx : 读模板 解析 写入文件 用于产生静态页面的新闻系统
ReturnText.aspx : 读模板 解析 返回字符串 用与写经常要改变外观的动态页面,换皮肤的页 面。
************************************************************************************************
标签动态取值:
标签解析函数除可以接受标签内传来的固定参数数值外。可以有三种方式接受动态参数
象模板类传递 Datatable 和 Hashtable 对象以后
(Datatable 从数据层获取 ,Hashtable 一般是页面内变量集合和其他要传近来的变量)
1。 dt[5][name] : 表示取Datatable内5行name列上的数值,第一个为数字,第二个是列名
2。 dt[name] : 在loop循环外表示取Datatable内0行name列上的数值,一个参数表示列名
在loop循环内表示取Datatable内name列上的数值,取那些行通过loop标签的参 数决定
3。 page[PageId] :表示取Hashtable对象内PageId键上的数值,返回string类型
如 {$二个参数书签:dt[3][word]:page[UserId]::字符10$}
{$dt[5][name]$} {$dt[name]$} {$page[PageId]$} 或
{$dt[5][name]::字符10$} {$dt[name]::字符10$} {$page[PageId]::字符10$}
这样的标签表示直接在页面上显示对象内的数值
************************************************************************************************
页面或类内调用模板类方法:
可在页面或类内调用
产生对象,关联对应标签函数解析类
//Templet/aa1.htm 模板内标签的解析函数在Business.cs类内 。
//那么我门只要让Business.cs 类继承 FunctionList 类
//在这里我门只要在这一行后面 new Business() 一个Business类对象就可以了
//用接口实现多态,代码看起来有点麻烦。 自己用的时候只要修改最后一个"new Business()" 为自 //己的包含标签解析函数的类对象就可以了
ILabelAnalyStart objILabel=(ILabelAnalyStart) new TempletReplet(new Business());
//读模板路径属性
objILabel.ReadFilePath=this.Server.MapPath("templet/aa1.htm");
//获取数据表对象
objILabel.LabelDatatable=ds.Tables[0];
//把这个页面上的变量用Hashtable对象传近模板类
objILabel.LabelHashtable=ht;
//返回解析结果
string aa=objILabel.LaberRepletText();
详细可看这三个文件的cs文件
WriteArticon.aspx -- 读模板 解析 写入文件 用于产生静态页面的新闻系统
ReturnText.aspx -- 读模板 解析 返回字符串 用与写经常要改变外观的页面,换皮肤的页 面。
************************************************************************************************
标签函数关联:
具体详细请看 Business.cs 文件
在逻辑层对应的类的静态构造器内,加如下代码。
//调用静态构造器,把标签体和执行函数委托做影射
//必须执行静态构造器
static Business()
{
Business _this=new Business();
//先临时产生一个这个类的对象为的是可以使用_this. 来点出所有的函数 :)
Business.AddLabel("无参书签", new Run_0(_this.show));
Business.AddLabel("一个参数书签",new Run_1(_this.tag));
Business.AddLabel("二个参数书签",new Run_2(_this.tag_two));
//书签和执行函数关联。放到书签解析类的静态构造函数内。
//是为了可以完全使用内存中的对象,不每次都执行
// "一个参数书签" 字符对应 public string tag(string aa) 函数
// ("一个参数书签",new Run_1(_this.tag)));
// 标签名 | |
// 一个参数就用Run_1委托。 |
// 对应的标签执行函数
// 0 个或多个上面有对应例子
}
具体详细请看 Business.cs 文件
************************************************************************************************
标签内loop循环介绍:
标签内通过一些特殊符号,可以实现非嵌套loop循环
//------------------------------------------------------------------------
{$loop(3,0,alter)$} //显示三行,从0行开始,如果有交替列,运行交替列
{$BlockItem$} //默认的循环行,
<td bgcolor="#33ccff">标题:{$dt[5][name]$} , 作者:{$一个参数:dt[dddf]$}</td>
{$/BlockItem$}
{$BlockAlterItem$} // 没有默认行标签对,有交替循标签对。就把交替循标签对当默认 // 行标签对
<td bgcolor="#ff6699">标题:{$dt[5][name]$} , 作者:{$一个参数:dt[dddf]$}</td>
{$/BlockAlterItem$}
{$BlockPatch$} //当要循环的行数大于Datatable内的行数时,用这里的内容补充显 //示 。 如果没有 “补充” 签对。那么当显示行数大于Datatable //中的行数时,将只显示Datatable中的行数
<td bgcolor="#33ccff">补充(里面也可以使用标签)</td>
{$/BlockPatch$}
{$BlockAlterPatch$} //没有补充标签对,有交替补充标签对。就把交替补充标签对当补 //充标签对
<td bgcolor="#ff6699">交替补充(里面也可以使用标签)</td>
{$/BlockAlterPatch$}
{$/loop$} //循环结束
//--------------------------------------------------------------
{$BlockItem$} {$/BlockItem$} :默认的循环行标签对
{$BlockAlterItem$} {$/BlockAlterItem$} :交替循环行标签对
{$BlockPatch$} {$/BlockPatch$} :默认补充行标签对
{$BlockAlterPatch$} {$/BlockAlterPatch$} :交替补充行标签对
//------------------------------------------------------
只有默认的循环行可以不加{$BlockItem$}标签对如
{$loop(3,0,alter)$}
<tr><td>{$函数标签$}</td></tr>
{$/loop$}
和
{$loop(3,0,alter)$}
{$BlockItem$}<tr><td>{$函数标签$}</td></tr>{$/BlockItem$}
{$/loop$}
是表示一样的效果。
//-------------------------------------------------------------
************************************************************************************************
loop参数说明:
{$loop(3,0,alter)$}
loop上一共有三个参数,可适当减少
第一个参数:
3:循环3次 ,没有表示循环全部
第二个参数:
2:从2开始,没有表示从0开始
第三个参数:
alter:交替
noalter:不交替 ,没有表示默认为交替,所以alter加不加是一样的
如果三个参数全不写,至少要保留一对空括号 {$loop()$}
表示循环Datatable内的行数,从0行开始,有补充就显示补充。
************************************************************************************************
建议模板不要大于85k,小心成为大尺寸对象。那可是二代对象
很高兴看见模板类和我自己的认识一起成长。