君子意如何

我就是路人甲 http://www.dongdongyou.com/ 动动友

导航

更新模板类,和一些使用经验

      下载 /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,小心成为大尺寸对象。那可是二代对象
很高兴看见模板类和我自己的认识一起成长。


 

posted on 2006-06-24 20:41  君子意如何  阅读(2506)  评论(21编辑  收藏  举报