做web開發(fā)也有幾年了。自己在不同的公司有不同的認(rèn)識。最近做blog項(xiàng)目。自己認(rèn)識到了模板類在web開發(fā)中的作用。自己晚上在家。總想可以做一個專門的為asp.ne開發(fā)而設(shè)計的模板類。于是就寫了這個模板類。
下載地址點(diǎn)這
把下載下來的 500sea.txt 文件改名為 Templet.rar 文件打開就可以
如果打開
http://img.club.163.com/images/user/other/500sea
沒有提示 500sea.txt文件下載。那就用網(wǎng)絡(luò)快車等東西下這個地址
把下來的500sea.txt文件 改為 *.rar 文件就好
下面是里面的一個說明文件
//---------------------------------------------------------------------------------------------------------------------------//
介紹:
此模板類是為三層架構(gòu)web站點(diǎn)開發(fā)而編寫的。StringTempletReplet.dll組件
內(nèi)包含模板類。StringTempletReplet命名空間內(nèi)的模板類可以使用在UI層,也可
以使用在邏輯層。
*****************************************************************************
運(yùn)行方法:
建立一個名叫 Templet 的虛擬目錄指象解壓后的 Templet 文件夾
運(yùn)行內(nèi)部的 RetuenString.aspx,ReturnText.aspx,WriteArticon.aspx,
LongLoop.aspx 頁面。在頁面對應(yīng)的cs文件上有相應(yīng)說明。
第一次打開頁面應(yīng)為要保留委托對象和模板文件到緩存中,所以真正的速度要看第
一次以后的。
*****************************************************************************
原理介紹:
一種標(biāo)簽替換的模板。使用了c#中的指針運(yùn)算查找標(biāo)簽位置。
用委托對象指象標(biāo)簽對應(yīng)的解析函數(shù),并用靜態(tài)對象緩存全部委托對象。
在不改變模板正文的情況下,緩存全部模板內(nèi)容。可以動態(tài)更換模板。
****************************************************************************
標(biāo)簽介紹:
在成對特殊符號{$ 和 $} 之間的內(nèi)容為標(biāo)簽
如
{$標(biāo)簽名:參數(shù)1:參數(shù)2:參數(shù)3::字符10$}
{$標(biāo)簽名:參數(shù)1:參數(shù)2::字節(jié)10$}
{$dt[5][name]$}
在標(biāo)簽內(nèi)部通過 :: 符號把標(biāo)簽分為 (標(biāo)簽參數(shù)部分) 和 (命令控制部分) 兩快
{$標(biāo)簽名:參數(shù)1:參數(shù)2:參數(shù)3::字節(jié)10$}
(標(biāo)簽參數(shù)部分) :: (命令控制部分)
在這兩部分內(nèi)以:號分割標(biāo)簽參數(shù)部分和命令控制部分
標(biāo)簽參數(shù)部分 ---第一個為標(biāo)簽名,就是標(biāo)簽解析函數(shù)的對應(yīng)名稱,以后的為函數(shù)的參數(shù),
標(biāo)簽解析函數(shù)接受全部參數(shù)類型為string類型的,參數(shù)個數(shù)為0--20個的
函數(shù),返回類型為string類型。參數(shù)可在標(biāo)簽上寫死,也可以動態(tài)寫入。
命令控制部分 ---現(xiàn)在只有兩個命令符號 字符 和 字節(jié) ,后帶一個數(shù)字參數(shù),表示截取標(biāo)
簽解析結(jié)果的長度, 如 字符10 字節(jié)10 。
我以后會在擴(kuò)展其他的命令控制符號。
標(biāo)簽和函數(shù)對應(yīng)請看Business.cs 文件內(nèi)說明
標(biāo)簽具體使用規(guī)則請看Templet/templet/aa1.htm 模板內(nèi)說明
具體調(diào)用規(guī)則請看項(xiàng)目中的這三個aspx頁面
WriteArticon.aspx -- 讀模板 解析 寫入文件 用于產(chǎn)生靜態(tài)頁面的新聞系統(tǒng)
ReturnText.aspx -- 讀模板 解析 返回字符串 用與寫經(jīng)常要改變外觀的頁面,
換皮膚的頁面。可動態(tài)更換模板 。
RetuenString.aspx -- 接受標(biāo)簽字符串,返回解析結(jié)果。常用與Ajax。
******************************************************************************
標(biāo)簽動態(tài)取值:
標(biāo)簽解析函數(shù)除可以接受標(biāo)簽內(nèi)傳來的固定參數(shù)外。可以有三種方式接受動態(tài)參數(shù)
象模板類傳遞 Datatable 和 Hashtable 對象以后
(Datatable 從數(shù)據(jù)層獲取 ,Hashtable 一般是頁面變量 和其他變量)
1。 dt[5][name] ---- 表示取Datatable內(nèi)5行name列上的數(shù)值,第一個為數(shù)字,
第二個是列名
2。 dt[name] ---- 在loop循環(huán)外表示取Datatable內(nèi)0行name列上的數(shù)值,
一個參數(shù)表示列名
---- 在loop循環(huán)內(nèi)表示取Datatable內(nèi)name列上的數(shù)值,取那
些行通過loop標(biāo)簽的參數(shù)決定
3。 page[PageId] ----- 表示取Hashtable對象內(nèi)PageId鍵上的數(shù)值,返回string類型
如 {$二個參數(shù)書簽:dt[3][Word]:page[UserId]::字符10$}
{$dt[5][name]$} {$dt[name]$} {$page[PageId]$}
或
{$dt[5][name]::字符10$} {$dt[name]::字符10$} {$page[PageId]::字符10$}
這樣的標(biāo)簽表示直接在頁面上顯示對象內(nèi)的數(shù)值
****************************************************************************
頁面或類內(nèi)調(diào)用模板類方法:
可在頁面或類內(nèi)調(diào)用
產(chǎn)生對象,關(guān)聯(lián)對應(yīng)標(biāo)簽函數(shù)解析類
//在這里我門只要在這一行后面 new Business() 一個Business類對象就可以了
//用接口實(shí)現(xiàn)多態(tài),代碼看起來有點(diǎn)麻煩。 自己用的時候只要修改最后一個"new Business()" 為自己的包含標(biāo)簽解析函數(shù)的類就可以了
ILabelAnalyStart objILabel=(ILabelAnalyStart) new TempletReplet(new Business());
//讀模板路徑屬性
objILabel.ReadFilePath=this.Server.MapPath("templet/aa1.htm");
//寫文件路徑屬性
objILabel.WritFilePath=this.Server.MapPath("page/aa1.html");
//獲取數(shù)據(jù)表對象
objILabel.LabelDatatable=ds.Tables[0];
//把這個頁面上的變量用Hashtable對象傳近模板類
objILabel.LabelHashtable=ht;
然后可以實(shí)現(xiàn)三種替換
//開始替換寫模板
objILabel.LaberReplet();
//返回解析結(jié)果
string aa=objILabel.LaberRepletText();
//返回解析結(jié)果,這個是直接接受模板字符串的,具體看RetuenString.cs文件
string aa=objILabel.LaberRepletString();
詳細(xì)可看這三個文件的cs文件
WriteArticon.aspx -- 讀模板 解析 寫入文件 用于產(chǎn)生靜態(tài)頁面的新聞系統(tǒng)
ReturnText.aspx -- 讀模板 解析 返回字符串 用與寫經(jīng)常要改變外觀的頁面
換皮膚的頁面
RetuenString.aspx -- 接受標(biāo)簽字符串 返回解析結(jié)果。常用與ajax
****************************************************************************
標(biāo)簽函數(shù)關(guān)聯(lián):
具體詳細(xì)請看 Business.cs 文件
在邏輯層對應(yīng)的類的靜態(tài)構(gòu)造器內(nèi),加如下代碼。
//調(diào)用靜態(tài)構(gòu)造器,把標(biāo)簽執(zhí)行函數(shù)委托放到靜態(tài)哈希表內(nèi)
//必須執(zhí)行這個方法
static Business()
{
Business _this=new Business();
FunctionList.objFunctionHashtable.Add("無參書簽",new KeyItemDelegate(new UserDelegate.Run_0(_this.show),0));
FunctionList.objFunctionHashtable.Add("一個參數(shù)書簽",new KeyItemDelegate(new UserDelegate.Run_1(_this.tag),1));
FunctionList.objFunctionHashtable.Add("二個參數(shù)書簽",new KeyItemDelegate(new UserDelegate.Run_2(_this.tag_two),2));
//書簽和執(zhí)行函數(shù)關(guān)聯(lián)。放到書簽解析類的靜態(tài)構(gòu)造函數(shù)內(nèi)。是為了可以完全使用內(nèi)存中的對象,不每次都執(zhí)行
// "一個參數(shù)書簽" 字符對應(yīng) public string tag(string aa) 函數(shù) 對應(yīng)模式為在哈希表上加key和value
// ("一個參數(shù)書簽",new KeyItemDelegate(new UserDelegate.Run_1(_this.tag),1));
// 標(biāo)簽名 | | |
// 一個參數(shù)就用Run_1委托。 | |
// 對應(yīng)的標(biāo)簽執(zhí)行函數(shù) |
// 一個參數(shù)就寫數(shù)字一
// 0 個或多個上面有對應(yīng)例子
}
具體詳細(xì)請看 Business.cs 文件
*****************************************************************************
標(biāo)簽內(nèi)loop循環(huán)介紹:
標(biāo)簽內(nèi)通過一些特殊符號,可以實(shí)現(xiàn)非嵌套loop循環(huán)
//------------------------------------------------------------------------
{$loop(3,0,alter)$} //顯示三行,從0行開始,如果有交替列,運(yùn)行交替列
{$BlockItem$} //默認(rèn)的循環(huán)行,
<td bgcolor="#33ccff">標(biāo)題:{$dt[5][name]$} , 作者:{$一個參數(shù):dt[dddf]$}</td>
{$/BlockItem$}
{$BlockAlterItem$} // 交替循環(huán)行 當(dāng)沒有默認(rèn)行標(biāo)簽對,有交替循標(biāo)簽對。就把交替循標(biāo)簽對當(dāng)默認(rèn)行標(biāo)簽對
<td bgcolor="#ff6699">標(biāo)題:{$dt[5][name]$} , 作者:{$一個參數(shù):dt[dddf]$}</td>
{$/BlockAlterItem$}
{$BlockPatch$} //當(dāng)要循環(huán)的行數(shù)大于Datatable內(nèi)的行數(shù)時,用這里的內(nèi)容補(bǔ)充顯示 。 如果沒有 “補(bǔ)充” 標(biāo)簽對。那么當(dāng)顯示行數(shù)大于Datatable中的行數(shù)時,將只顯示Datatable中的行數(shù)
<td bgcolor="#33ccff">補(bǔ)充(里面也可以使用標(biāo)簽)</td>
{$/BlockPatch$}
{$BlockAlterPatch$} //沒有補(bǔ)充標(biāo)簽對,有交替補(bǔ)充標(biāo)簽對。就把交替補(bǔ)充標(biāo)簽對當(dāng)補(bǔ)充標(biāo)簽對
<td bgcolor="#ff6699">交替補(bǔ)充(里面也可以使用標(biāo)簽)</td>
{$/BlockAlterPatch$}
{$/loop$} //循環(huán)結(jié)束
//--------------------------------------------------------------
{$BlockItem$} {$/BlockItem$} :默認(rèn)的循環(huán)行標(biāo)簽對
{$BlockAlterItem$} {$/BlockAlterItem$} :交替循環(huán)行標(biāo)簽對
{$BlockPatch$} {$/BlockPatch$} :默認(rèn)補(bǔ)充行標(biāo)簽對
{$BlockAlterPatch$} {$/BlockAlterPatch$} :交替補(bǔ)充行標(biāo)簽對
//------------------------------------------------------
如果只有默認(rèn)的循環(huán)行可以不加{$BlockItem$}標(biāo)簽對
如
{$loop(3,0,alter)$}
<tr><td>{$函數(shù)標(biāo)簽$}</td></tr>
{$/loop$}
和
{$loop(3,0,alter)$}
{$BlockItem$}<tr><td>{$函數(shù)標(biāo)簽$}</td></tr>{$/BlockItem$}
{$/loop$}
是表示一樣的效果
//-------------------------------------------------------------
{$loop(3,0,alter)$}
{$BlockAlterPatch$}
<tr><td>{$函數(shù)標(biāo)簽$}</td></tr>
{$/BlockAlterPatch$}
{$/loop$}
如果只有交替循環(huán)行標(biāo)簽對沒有默認(rèn)的循環(huán)行標(biāo)簽對那么交替循環(huán)行標(biāo)簽對將自動轉(zhuǎn)換為
默認(rèn)循環(huán)行標(biāo)簽對
//--------------------------------------------------------------
{$loop(3,0,alter)$}
{$BlockAlterPatch$}
<tr><td>{$函數(shù)標(biāo)簽$}</td></tr>
{$/BlockAlterPatch$}
{$/loop$}
如果只有交替補(bǔ)充行標(biāo)簽對沒有默認(rèn)補(bǔ)充行標(biāo)簽對那么交替補(bǔ)充行標(biāo)簽對將自動轉(zhuǎn)換為
默認(rèn)循環(huán)行標(biāo)簽對
**************************************************************************
loop參數(shù)說明:
{$loop(3,0,alter)$}
loop上一共有三個參數(shù),可適當(dāng)減少
第一個參數(shù):
3:循環(huán)3次 ,沒有表示循環(huán)全部
第二個參數(shù):
2:從2開始,沒有表示從0開始
第三個參數(shù):
alter:交替
noalter:不交替 ,沒有表示默認(rèn)為交替,所以alter加不加是一樣的
如果三個參數(shù)全不寫,至少要保留一對空括號 {$loop()$}
表示循環(huán)Datatable內(nèi)的行數(shù)
從0行開始,有補(bǔ)充就顯示補(bǔ)充。
*************************************************************************
有更新了一下。主要是優(yōu)化循環(huán)。
現(xiàn)在循環(huán)5萬行的表格要 300-400 毫秒。
***************************************************************************
建議模板不要大于85k,小心成為大尺寸對象。那可是二代對象
建議頁面模板小于等于919個,對應(yīng)函數(shù)標(biāo)簽建議不超過1597個。
很高興看見模板類和我自己的認(rèn)識一起成長。
*****************************************************************************
新聞熱點(diǎn)
疑難解答