posts - 241,  comments - 116,  trackbacks - 0

          smarty4j是一個smarty for java的模板引擎,該引擎是將smarty模板從php上移植過來,需要asm-3.0.jar。

          smarty4j將文本解析成語法樹,然后根據(jù)語法樹生成Java Code的字節(jié)碼,相當(dāng)于一個基于JVM的smarty語法的編譯器。語法樹的生成采用左序遍歷的方式依次生成,大致的語法結(jié)點包含語句與表達(dá)式兩大基本 類型,語句結(jié)點能保證JVM的語句棧在執(zhí)行完畢后沒有新壓入的數(shù)據(jù),而表達(dá)式結(jié)點將產(chǎn)生一個數(shù)據(jù)。人人

          一般的結(jié)構(gòu),最頂層是一個文檔結(jié)點,內(nèi)部可以由三種結(jié)點組成,分別是文本結(jié)點、函數(shù)結(jié)點與輸出結(jié)點

          • 文檔結(jié)點
            • 文本結(jié)點
            • 函數(shù)結(jié)點
              1. 行函數(shù)結(jié)點
              2. 塊函數(shù)結(jié)點
            • 輸出結(jié)點

          其中,輸出結(jié)點是輸出一個對象的內(nèi)容,因此由對象表達(dá)式與變量調(diào)節(jié)器結(jié)點組成,對象表達(dá)式主要是郵字符串表達(dá)式、NULL表達(dá)式與變量表達(dá)式組成

          • 輸出結(jié)點
            • 對象表達(dá)式
              1. 字符串表達(dá)式
              2. NULL表達(dá)式
              3. 變量表達(dá)式
            • 變量調(diào)節(jié)器結(jié)點

          變量表達(dá)式又包含相關(guān)的List或者M(jìn)ap擴(kuò)展信息 除此外,表達(dá)式結(jié)點還有浮點表達(dá)式結(jié)點、整數(shù)表達(dá)式結(jié)點與布爾表達(dá)式結(jié)點,只要是表達(dá)式結(jié)點對象,就支持在壓棧過程中對這三種數(shù)值之間進(jìn)行轉(zhuǎn)化。

          執(zhí)行優(yōu)化

          smarty4j的塊函數(shù)結(jié)點將整個文檔分隔成代碼塊,分析每個代碼塊是否有變量的回寫操作,如assign等。如果不存在,則會在棧內(nèi)存中自動緩 存相關(guān)的節(jié)點讀取操作,第二次需要讀取時,是直接從棧內(nèi)存中讀取,減少了分析和從容器中提取數(shù)據(jù)的問題。特別是針對循環(huán)操作時緩存指針變量,能大幅度提高 執(zhí)行的速度。 smarty4j會自動識別條件分支中的“短路”位置,一個布爾表達(dá)式結(jié)點的真或假的結(jié)果成立后,可以直接跳到if等函數(shù)指定的出口點,而不需要逐級去驗 證,對于復(fù)雜的布爾表達(dá)式,能小幅度的提高執(zhí)行速度。

          功能擴(kuò)展

          smarty4j的語法擴(kuò)展分為幾個層次:

          1.直接用java代碼實現(xiàn)新的函數(shù)與變量調(diào)節(jié)器

          繼承org.lilystudio.smarty4j.statement包下的 AbstractLineFunction,AbstractBlockFunction,AbstractCustomModifier三個類可以分別 實現(xiàn)單行函數(shù)、區(qū)塊函數(shù)與變量調(diào)節(jié)器的java代碼實現(xiàn),新的類名以$符號開頭,放置在 org.lilystudio.smarty4j.statement.function與 org.lilystudio.smarty4j.statement.modifier包下可以被直接引用,否則需要在配置文件中定義函數(shù)的自動搜索 包。這種方式面向普通的java開發(fā)人員女裝品牌排行榜

          2.實現(xiàn)自己特點的函數(shù)語法

          繼承org.lilystudio.smarty4j.statement包下的AbstractFunction、 AbstractModifier或第一點中提供的接口,通過重新實現(xiàn)syntax或process方法來實現(xiàn)函數(shù)特有的語法或特定的處理方式,如 if,literal,break等均是代表。使用非標(biāo)準(zhǔn)的smarty參數(shù)語法應(yīng)當(dāng)慎重,一般由架構(gòu)人員來評估后由普通java開發(fā)人員進(jìn)行。

          3.實現(xiàn)自己的函數(shù)與變量調(diào)節(jié)器語法轉(zhuǎn)換節(jié)點 

          繼承org.lilystudio.smarty4j.statement包下的AbstractFunction或 AbstractModifier,或者實現(xiàn)IFunction,IBlockFunction,IModifier接口,通過重寫parse方法來生成 jvm匯編代碼。這種方式需要對jvm匯編了解程度較高,而且需要經(jīng)常對每一個分支的測試才能使用,否則會出現(xiàn)虛擬機(jī)的類加載異常或者是jvm匯編校驗異 常。

          posted on 2011-04-22 09:30 墻頭草 閱讀(2769) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          人人游戲網(wǎng) 軟件開發(fā)網(wǎng) 貨運專家
          主站蜘蛛池模板: 克什克腾旗| 古交市| 巢湖市| 香港 | 双鸭山市| 江阴市| 陵川县| 施秉县| 东丰县| 泰兴市| 普安县| 陇西县| 油尖旺区| 余干县| 宜君县| 庆城县| 万荣县| 修水县| 阳春市| 通道| 广南县| 托里县| 梓潼县| 双桥区| 北碚区| 齐齐哈尔市| 盖州市| 周至县| 浙江省| 建平县| 措美县| 曲阜市| 顺昌县| 瓮安县| 滦平县| 民权县| 疏附县| 洞口县| 叶城县| 贵南县| 永宁县|