<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      由淺入深:自己動手開發(fā)模板引擎——解釋型模板引擎(一)

      受到群里兄弟們的竭力邀請,老陳終于決定來分享一下.NET下的模板引擎開發(fā)技術(shù)。本系列文章將會帶您由淺入深的全面認(rèn)識模板引擎的概念、設(shè)計、分析和實戰(zhàn)應(yīng)用,一步一步的帶您開發(fā)出完全屬于自己的模板引擎。關(guān)于模板引擎的概念,我去年在百度百科上錄入了自己的解釋(請參考:模板引擎)。老陳曾經(jīng)自己開發(fā)了一套網(wǎng)鳥Asp.Net模板引擎,雖然我自己并不樂意去推廣它,但這已經(jīng)無法阻擋群友的喜愛了!

      與置換型模板引擎不同的是,解釋型模板引擎包含了一個專用解釋器,有了解釋器的存在就可以支持一些更加復(fù)雜而嚴(yán)謹(jǐn)?shù)恼Z法。熟悉設(shè)計模式的朋友此時此刻應(yīng)該能夠回想起來“解釋器模式”,它是將一些業(yè)務(wù)封裝成一個或多個命令,然后通過一個復(fù)雜的解釋器(Interpreter)來解析執(zhí)行來滿足生產(chǎn)需求的。實際上,解釋型模版引擎就是一個較為復(fù)雜的解釋器模式的實現(xiàn)而已。具體到模板引擎技術(shù)上來,解釋器的工作任務(wù)實際上就小了很多。按照數(shù)據(jù)封裝模式的不同,解釋型模板引擎分為命令解釋器和反射解釋器兩個大類。

      命令解釋器

      還記得置換型模板引擎中,我們在最后曾經(jīng)處理了一個較為負(fù)載的Label“{CreationTime:yyyy年MM月dd日 HH:mm:ss}”嗎?實際上,這個就是命令解釋器的一種實現(xiàn)。此Label中的format部分可以看作是CreationTime的一個命令。有了命令,我們可以讓Label去做更多的事情,這是顯而易見的。

      命令也可以理解為指令。

      為了更加能夠說明這個問題,我們先將我們要處理的模板復(fù)雜化一點,如下:

      1 <!--#include file="_Page_Header.shtml" -->
      2 <ul>
      3 <li>博主姓名:陳彥銘</li>
      4 <li>創(chuàng)建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li>
      5 <li>粉絲數(shù)量:{FunsCount:D4}</li>
      6 </ul>
      7 <!--#include file="_Page_Footer.shtml" -->

      除了我們已經(jīng)熟悉的{xxx}標(biāo)簽之外,我們又增加了一個文件包含指令“<!--#include file="_Page_Header.shtml" -->”。這個指令是標(biāo)準(zhǔn)的SHTML語法,意思就是將其他文檔中的模板合并到當(dāng)前的指令位置,如此我們便可以實現(xiàn)代碼重用。尤其對于HTML開發(fā)來說,使用SHTML包含語法,還可以在諸如Dreamweaver等IDE中實現(xiàn)“所見即可得”的效果。

      關(guān)于如何實現(xiàn)包含指令,我們將在后續(xù)章節(jié)中具體介紹。

      反射解釋器

      接觸了指令之后,其實我們還是不夠滿足,因為到目前為止,我們的模板只能做簡單的標(biāo)簽置換,這個相當(dāng)不給力。比如有些內(nèi)容我們想讓它根據(jù)情況輸出,那么就需要條件語句的效果,再如我們經(jīng)常會遇到列表等情況,此時要是能有個迭代語句豈不是很給力?難道我們要編寫一堆的Label1、Label2、Label3?

      有需求,是好事情!咱們是做技術(shù)的,為需求而生,為滿足需求而戰(zhàn),沒有需求,技術(shù)就都只是浮云!

      為什么條件語句和迭代語句要使用反射來實現(xiàn),因為在編寫這篇文章之前,老陳已經(jīng)決定了用反射來實現(xiàn)這些機(jī)制,無論您是否喜歡!Hah..

      我們再次將模板語法復(fù)雜化如下:

       1 <!--#include file="_Page_Header.shtml" -->
      2 <ul>
      3 <li>博主姓名:陳彥銘</li>
      4 <li>創(chuàng)建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li>
      5 <li>粉絲數(shù)量:{FunsCount:D4}</li>
      6 </ul>
      7 <hr />
      8 <m:if test="{articles.Count > 0}">
      9 <ul>
      10 <m:foreach item="article" collection="articles">
      11 <li><a href="{article.Url}">[{article.Category}] {article.Title}</a></li>
      12 </m:foreach>
      13 </ul>
      14 </m:if>
      15 <!--#include file="_Page_Footer.shtml" -->

      現(xiàn)在有木有感覺到某種給力呢?雖然這不是最給力的……

      概念

      雖然,我們只增加了兩種語法,而且不多,看起來也貌似并不復(fù)雜,但這背后將會牽扯到方方面面的問題,代碼解析的難度進(jìn)一步增加。我們有必要了解一下后面可能使用到的一些概念。

      • 元素:即Element。它是組成模板的最基本的元素,派生出標(biāo)簽、表達(dá)式、Tag等。
      • 標(biāo)簽:即Label。形如{item},或{item.getTitle()}等,標(biāo)簽不能嵌套使用,但標(biāo)簽內(nèi)的語法可以較為復(fù)雜;
      • 表達(dá)式:即Expression。比如標(biāo)簽大括號之間的內(nèi)容,我們從本節(jié)課開始將其稱之為表達(dá)式,表達(dá)式是可以運行、計算的,例如我們可以輸入較為復(fù)雜的標(biāo)簽:{item.x * item.y}
      • 運算符:有了表達(dá)式,那么我們就需要一些運算符支持,例如上述{item.x * item.y}中的 * 運算符
      • Tag:我們將Tag定義為形如<m:if></m:if><m:else/>這樣的表示形式,它的主要作用是提供流程控制支持;
      • 特性:既然有Tag了,那么我們就需要特性,即Attribute,概念與xml/html中的Attribute一致,它通常為Tag提供可選參數(shù);
      • 指令:即Command,其格式類似于Tag,只不過開始和結(jié)束標(biāo)記被我們替換為xml/html的注釋格式,形如:<!--#include file="_Page_Footer.shtml" -->;

      這里我列出的概念可能還不夠完整,隨著課程的演進(jìn),我們再一一認(rèn)識他們!

      再次提醒:如果之前的課程您沒有掌握,請一定多多研究、體會,如果有問題可以隨時通過評論提問,我會盡力解答!希望大家都能夠真正的看懂、學(xué)會!

      優(yōu)點

      解釋型模板引擎可以支持更加復(fù)雜的語法、指令,能夠滿足更多的需求。同時由于它不像編譯型模板引擎那樣會受到運行時環(huán)境的限制,解釋型模版引擎用途非常廣泛。

      缺點

      但是它有一個很大的缺陷就是其內(nèi)部使用了反射機(jī)制,雖然我們也試圖對反射進(jìn)行優(yōu)化(請參考:淺談.NET反射機(jī)制的性能優(yōu)化),但這并不能完全解決反射帶來的一系列問題,這就意味著在某些場合它無法獲得令人滿意。

      小結(jié)

      本課僅作為解釋型模板引擎的一個引子,也是我寫博過程中的一個緩沖。

      在解析本課提出的兩個模板代碼的時候,您需要認(rèn)真的體會我們之前的課程并學(xué)會它們,否則越往后面您就會越發(fā)的感覺到吃力!

      為了自己,不要偷懶!學(xué)習(xí)是自己的,不學(xué)就一定不是自己的!


      解釋型模板引擎在我歸納的三大類模板引擎當(dāng)中是難度最高的,我會細(xì)心的完成每一節(jié)課程,進(jìn)度會比較慢,大家一定要耐著性子!我們的目標(biāo)是看懂、學(xué)會、掌握,而不是直接應(yīng)用它們!話說,樓主這一番苦心,大家是否表示贊同呢?

       

       

      posted @ 2012-04-09 09:01  O.C  閱讀(5325)  評論(6)    收藏  舉報
      主站蜘蛛池模板: 亚洲av成人在线一区| 漂亮人妻中文字幕丝袜| 少妇特黄a一区二区三区| 中文字幕人妻不卡精品| 午夜亚洲国产理论片亚洲2020 | 丰满无码人妻热妇无码区 | 日韩精品成人区中文字幕| 无码国模国产在线观看免费| 山阴县| 国产精品一区二区三区性色| 日韩有码精品中文字幕| 日本黄漫动漫在线观看视频| 色诱视频在线观看| 亚洲国产在一区二区三区| 汶上县| 91一区二区三区蜜桃臀| 女女互揉吃奶揉到高潮视频| 牟定县| 啊轻点灬大JI巴太粗太长了在线| 2019国产精品青青草原| 成年性午夜免费视频网站| 亚洲熟妇丰满多毛xxxx| 午夜av高清在线观看| 狠狠躁夜夜躁人人爽天天5| 全免费A级毛片免费看无码| 无码丰满人妻熟妇区| 精品亚洲没码中文字幕| 欧美性群另类交| 久久se精品一区精品二区国产| 国产mv在线天堂mv免费观看| 女的被弄到高潮娇喘喷水视频| 亚洲精品二区在线播放| 久久精品国产久精国产| 亚洲日本中文字幕乱码中文| 国产乱啊有帅gv小太正| 亚洲中文字幕无码av在线| 高清国产一区二区无遮挡| 日韩少妇人妻vs中文字幕| 国产无套精品一区二区| 欧美日韩一线| 欧美老少配性行为|