JFinal 3.0 發布,重新定義模板引擎

2020-11-30 開源中國

本次回歸碼壇為小夥伴們帶來的是重新定義過的 Template Engine 將極速開發繼續貫徹到 View 層。

Java 模板引擎界已被 Freemarker、Velocity 統治多年,但其在這些年的發展可謂乏善可陳,究其根本原因是因為這個領域嚴重依賴於第三方工具去做詞法、語法分析以及 AST 的構建,並未真正在語言層面進行過深入的追問。

例如 Freemarker、Velocity 是基於 javacc 做的二次開發,其他 java 模板引擎多數也是基於 ANTLR、jflex、javacc 生成後的代碼做的二次開發全部自己動手寫代碼而不是二次開發的 java 模板引擎極為少見,國內較為知名的僅見 HTTL。

由於使用 ANTLR 等工具去做模板引擎可以讓 80% 以上的工作由工具代為完成,所以對模板引擎作者極具誘惑力,但誘惑的背後其實是巨大的陷阱。

首先,這類工具無一例外都要求使用一套特定規則先表示出詞法和語法,然後再把它們生成為 Parser 原始碼而詞法、語法描述用的規則和生成的 Parser 並沒有很強的語義連接關係,如果生成的 Parser 有 bug,非常難以回溯排錯。

其次,生成的 Parser 源碼,毫無可讀性而言,進而在 Parser 層面根本無法調試,這種構建模板引擎的方式,相當於將自己的代碼建立在一個飄搖不安的基礎之上。

再次,通過這種方式做出來的模板引擎如果要在更底層改進,則需要先去改語法、詞法描述規則文件,然後再生成一次 Parser 源碼,然後才可以開始真正寫代碼,這個重複、麻煩且容易出錯的過程也嚴重阻礙了模板引擎的改進。

最後,這種構建方式通常在運行時還需要一個類似於 runtime.jar 的依賴,這個依賴多多少少也會增加不確定的風險。

模板引擎在本質上是一門程序語言,要開發一門可用於生產環境的模板語言起碼要對開發程序語言的相關技術、算法很熟悉,例如常用詞法分析算法、語法分析算法、AST、解釋器、編譯原理等等領域知識。

但非常不幸的是,即便對已有算法很熟悉,仍然只能做出極為平庸的模板引擎,因為模板引擎所處理的對象與程序語言有著十分不同的特徵:模板的內容通常是極其自由的文本中嵌入著少量程序語言元素,而類似於 NFA 這樣的算法都是面向類似於 java、c、python 這類高度結構化的原始碼內容。

JFinal Template Engine  直面這個問題,採用獨創的算法徹底代替傳統算法,極大降低了複雜度,減少了代碼量,同時可讀性得到極大提升。JFinal Template Engine 經過公司內部開發者近三個月的試用時間,直到每位開發者都沉醉其中後才放出 jfinal 3.0 版本。

1:獨創 DKFF(Dynamic Key Feature Forward) 詞法分析算法

傳統的 NFA 詞法分析算法基於正則表達式與狀態圖,即便是做一個簡單的模板引擎也需要成百上千個狀態,NFA 算法對於人類來說幾乎不可讀,需要先將二維數組表示的狀態圖存儲結構轉換成畫在紙上的人類可讀的狀態圖,並且還要花費相當長的時間去解讀其內涵。而 JFinal Template Engine 只需 7 個狀態 403 行代碼搞定詞法分析,可讀高,有利於系統進化。

2:獨創 DLRD(Double layer Recursive Descent) 語法分析算法

針對模板文件大量純文本摻雜少量代碼特徵,獨創 DLRD 語法分析算法,將指令與表達式的語法分析劃分在不同的層次之中相比傳統遞歸下降語法分析算法,複雜度降到極致,代碼量少到極致僅 215 行代碼搞定 statement 語法分析。

DLRD 算法還極為輕鬆地解決了傳統算法面對的左遞歸、二義性、回溯以及運算符優先級等麻煩問題,無需文法變換即可消除左遞歸,無需回溯即可解決二義性問題傳統遞下降法算法需要採用變換文法、回溯、提取公因子方式解決上述問題傳統解決方案不僅麻煩而且讓文法變換後的程序可讀性降低,不利於進化。

3:獨創語言級指令擴展

對於傳統模板引擎來說指令系統是固定的,相當於程序語言的關鍵字,無法為語言動態添加新的關鍵字,JFinal template engine 得益於獨創的 DKFF、DLRD 算法,極為輕鬆的在程序語言層面實現了指令擴展功能,從而整個模板引擎只需提供了極少的常用指令,其她所有指令均由擴展而成,例如 com.jfinal.template.ext.directive 以及com.jfinal.plugin.activerecord.sql 包之下的所有指令全是擴展而來。

基於以上主要創新, JFinal 在極簡的路上繼續挺進,一個 MVC + ORM 各層全面實現極速開發的框架由此誕生:

1:極簡設計

JFinal Template Engine 消滅了大量傳統模板引擎中的無聊概念,例如 macro、layout、pageContent、nested、tag 插值等等概念,但凡一門可用於生產環境的語言,只需利用表達式、語句、函數、分支、循環等基本要素,就可以像呼吸空氣一樣自由地實現上述這些功能,引入新的概念純屬製造麻煩。

以 macro 為例,該概念產生於很古老的程序語言,已證明是歷史性糟粕在後起的程序語言中被拋棄,可卻在 freemarker、velocity 等模板引擎中死而復生,以致於後來者也爭相跟風模仿引入了 macro 概念。

2:獨創空合安全取值調用操作符

JFinal Template Engine 引入了 swift 與 C#語言中的空合操作符,並在其基礎之上進行了極為自然的擴展,該表達式符號為兩個緊靠的問號: ??

value ?? rightExpr  // 當value為null時,表達式取值rightExprobject.value ??    // 當 object 為 null 時變為安全取值,不報空指針異常,表達式的值為nullobject.method() ?? // 當 object 為 null 時變為安全調用,不報空指針異常,表達式的值為nullobject.value ?? rightExpr  // 空合併與安全取值的組合用法,當object為null時表達式取值rightExprobject.method() ?? rightExpr  // 空合併安全調用的組合用法,當object為null時表達式取值為rightExpr

swift 與 C# 語言僅支持第一種用法並稱之為空合操作符,而 JFinal Template Engine 在空合的基礎上再支持安全取值、安全調用兩個擴展,在模板引擎的應用場景之下的開發體驗極為順滑。

3:消滅插值指令

傳統模板引擎通常會引入所謂的插值指令,而其它指令則使用另一套規則,而 jfinal template engine 將插值指令仍然當成是指令,並不引進新的概念,不僅在實現上更加簡潔只需 21 行代碼,而且降低了學習成本

  #(value)  #(object.value)  #(map.key)

4:消滅 macro 指令

如果真心將 template engine 當成一門語言去設計,原本用 macro 實現的功能只需要使用所有語言中都有的 function/method 概念,即可更為簡單實現,如下是利用 fcuntion 實現 layout 功能的示例先在 layout.html 中定義 layout() 函數,並在 body調用 main() 函數

 #define layout() <html>     <body>     #@main()     <body> </html> #end

然後在最終的頁面,直接調用 layout() 並定義 main() 函數

   #@layout()   #define main()   ...   #end

注意:以上的 layout.html、layout、main 這些名稱可以隨便取名,不是具體的概念,僅為一個名字

JFinal Template Engine 代碼僅有 5556 行,僅為 freemarker 的十分之一,完全手寫算法,無第三方依賴,對於有任何一門程序語言的開發者學習成本幾乎為 0。為控制篇幅,在此不在贅述。jfinal 3.0 版不僅僅是重新定義了 Template Engine,還對其她方面做了非常有價值的改進

1:Routes 級攔截器

jfinal 3.0 可以在 Routes 中添加攔截器,Routes 極攔截器,將攔截所有在此 Routes 中映射的 Controller:

public class AdminRoutes extends Routes { public void config() {     addInterceptor(new AdminInterceptor());     add("/admin", IndexAdminController.classs);     add("/admin/project", ProjectAdminController.classs);   }}

上例中的 AdminInterceptor 將攔截 IndexAdminController、ProjectAdminController 中的所有 action,這非常有利於多個控制器配置了相同攔截器的應用場景,減少了代碼冗餘。

2:active record 模塊 sql 管理模塊

JFinal 3.0利用自帶的Template Engine極為簡潔的實現了Sql管理功能,可以將sql保存在外部配置文件之中,並且以極少概念極少 API 實現 mybatis 的核心功能

#sql("findPrettyGirl")  select * from girl where age > ? and age < ? and weight < 50#end

java 代碼中的使用方式:

 find(getSql("findPrettyGirl"), 16, 20);

同時還提供了 namespace 支持與 para 動態綁定功能,詳見 jfinal 手冊

3:Cron4jPlugin 支持任務調度

Cron4jPlugin 對 cron4j 進行了極簡封裝,簡單用法如下:   

Cron4jPlugin cp = new Cron4jPlugin();cp.addTask("* * * * *", new MyTask());me.add(cp);

外部配置文件用法詳見 jfinal 手冊

4:renderQrCode 支持二維碼生成

添加 Controller.renderQrCode(...) 極速生成二維碼

jfinal 3.0 一如既往地堅持極簡設計風格,在極速開發的路上一路挺進,力爭為開發者帶來更高的開發效率,更好的開發體驗,更低的學習成本,進一步節約時間去陪戀人、家人和朋友!篇幅所限,更多功能增強與改進詳見 changelog: http://www.jfinal.com/share/190

ONE MORE THING:JFinal 俱樂部頻道今起正式開放,將為小夥伴們提供更高附加值的產品與服務進一步提升開發效率,節省開發時間。老司機要發車了,GO GO GO:http://www.jfinal.com/club

相關焦點

  • njs 0.3.4 與 0.3.5 發布,Nginx 的 JavaScript 腳本語言
    njs 0.3.4 與 0.3.5 發布了。
  • 全球首駕「離子引擎」飛機問世,麻省理工重新定義飛機!
    全球首駕「離子引擎」飛機問世,麻省理工重新定義飛機! 這架飛機翼展5米,重2.45公斤,以平均高度0.47米持續飛行了60米。 據測算,這個引擎最終產生了每千瓦5牛頓的推力,讓飛機上升了0.47米。 但值得慶幸的是,離子推進系統還具備3個極其誘人的科研潛力: 首先,當飛機的速度提高時,能量轉換率會顯著提高。例如,當飛行速度達到300米每秒時,能量轉換率可以高達50%。 其次,許多研究表明離子風相比空氣,能夠增強機翼的動力。也就是說離子風推進的飛行器,機翼活動所消耗的能量會更小。
  • njs 0.3.0 發布,擴展 Nginx 功能的 JavaScript 子集
    njs 不是通過 V8 引擎實現的,而是通過一個更小、能耗更低、更符合 Nginx 應用場景的小虛擬機(VM)來實現,可以理解為 Nginx 為其實現了一套自己的詞法解析。njs 以 Nginx 插件的方式存在,名字就叫 njs 。和其他 Nginx 插件一樣,我們需要重新編譯 Nginx 來完成安裝。njs 目前仍處於早期研發狀態,最新版本 0.3.0 已發布。
  • 雲米發布近60款新品AirBot 重新定義未來家生活
    雲米發布近60款新品AirBot 重新定義未來家生活 2019-03來源:中國新聞網作者:${中新記者姓名}責任編輯:葉攀   中新網3月
  • ZStack Mini 3.0.0 正式發布
    ZStack Mini 3.0新功能概覽如下: 雲主機新增容錯技術(Fault Tolerance,FT) 支持外接FC SAN光纖存儲資源 支持外接USB移動硬碟備份 強大靈活的應用中心 提供物理網絡連接狀態變化檢測 支持長時任務中止操作  雲主機新增容錯技術(Fault Tolerance, FT) ZStack Mini 3.0.0
  • 作業幫一課2.0發布 重新定義在線學習
    7月9日,作業幫一課2.0版本正式發布,上線「app+小程序+web」三端聯動新體驗,推出浣熊英語、科學素養等新課程,以「在家學的名師直播課」品牌理念「重新定義學習」。
  • realme UI 2.0作業系統發布 配備量子動畫引擎2.0和AI應用預啟動
    原標題:realme UI 2.0正式發布 全局主題色便捷浮窗玩出花樣   北京時間10月13日上午10點,realme召開真我Q2系列發布會為我們帶來了多款新品,5G手機的價格也來到了998元。
  • PHP 框架 QueryPHP 1.0.3 發布,兼容 PHP 8.0 和 PHP 8.1
    QueryPHP 1.0.3 僅僅做了對 PHP 8.0 和 PHP 8.1 兼容性處理,修復了 PHP 8 下面的代碼和測試用例。
  • ZStack 3.4.0 正式發布 - OSCHINA - 中文開源技術交流社區
    2019年4月16日,ZStack正式發布最新版本——ZStack 3.4.0,涵蓋大屏監控新增科技款主題、
  • Spark 3.0發布啦,改進SQL,棄Python 2,增強擴展,性能大幅提升
    Apache Spark 3.0.0正式發布啦,Apache Spark 3.0是在Spark 2.x的基礎上開發的,帶來了新的想法和功能。Apache Spark 3.0.0Spark是一個開源的大數據處理、數據科學、機器學習和數據分析工作負載的統一引擎,自2010年首次發布以來,已經成長為最活躍的開源項目之一;支持Java、Scala、Python、R等語言
  • LayaAir 2.0 正式版發布了,重要特性全面介紹
    2018年9月15日,Layabox再次發布LayaAir 2.0 引擎測試版。2.0引擎在保持1.0極致性能的基礎上,更為重視開發者的易用性體驗。因此2.0的IDE進行了大量的易用性改進與優化。而3D方面,則完全重構了3D引擎,不僅再次提升了性能與易用性,還新增了150多項功能。
  • Joyschool系列課程發布 重新定義英語啟蒙
    據悉,為了樹立幼兒英語啟蒙市場的課程新標準,促進行業良性發展,Joyschool系列課程在此次全球發布會上提出了「重新定義英語啟蒙」的戰略方向,並首創將幼兒成長期間所需的9大價值觀培養融入課程本身,幫助全球父母抓住孩子語言學習的黃金期,同時培養孩子「終生受益的品格素養」。
  • MiniFramework 2.6.0 發布,PHP 開源框架
    MiniFramework 於2021年1月10日發布 2.6.0 版本,主要變化有: 新特性:新增常量 URL_SUFFIX,默認值為"htm|html|shtml",用於定義偽靜態擴展名。 新特性:新增常量 URL_SPLIT_SYMBOL,默認值為"_",用於定義偽靜態時 URL 參數的分割符號。
  • 微軟發分布式圖處理引擎GraphEngine1.0
    【IT168 資訊】5月21日消息,由微軟亞洲研究院開發的Graph Engine 1.0預覽版正式發布。Graph Engine是一個基於內存的分布式大規模圖數據處理引擎。在此之前,它在學術界更廣為人之的名稱是Trinity。  大規模圖處理在很多領域扮演著重要的角色。
  • Java 時間工具包 xk-time 3.0.1 發布,中國工作日計算問題修復
    (7)自定義時區格式化方法,比如 format(Date date, DateTimeFormatter formatter, String zoneId),根據zoneId格式化Date。(8)自定義模板格式化方法,比如 format(Date date, String dateFormatPattern),根據dateFormatPattern格式化Date。
  • 固件升級,索尼NW-A105HN重新定義聽覺盛宴
    在2020年10月10日,索尼(中國)有限公司又對其推出了新版的固件升級(版本Ver 3.00.07),使得索尼NW-A105擁有更加強大的表現。具體升級了哪些功能,小編將為大家一一呈現。Android 9.0作業系統 流媒體服務更全面最值得重點表揚的還屬完整版Android 9.0作業系統,Android 9.0的加入,使索尼NW-A105HN的操作界面帶來很大的變化,基礎操作已經與智慧型手機沒有太大區別,本地音樂播放系統被收納在「Walkman」應用內,打開應用即可看見Walkman
  • 全球首駕「離子引擎」飛機問世,麻省理工重新定義飛機
    這架飛機翼展5米,重2.45公斤,以平均高度0.47米持續飛行了60米。試驗中,MIT工程師將飛機安裝在彈射器上,首先在不使用離子引擎的情況下彈射,飛機飛行了10米:據測算,這個引擎最終產生了每千瓦5牛頓的推力,讓飛機上升了0.47米。
  • Docker 引擎 - 發布渠道
    Docker 引擎具有下面 3 個更新渠道: stable, test和 nightly:StableTest 渠道提供了在發布之前的預覽,被用於 general availability (GA) 之前的測試。Nightly 渠道在針對下一個主要發行版本的每天晚間自動構建包。
  • Foxit Reader 3.0全新發布
    經過兩個多月的測試後,全新的Foxit Reader 3.0版已經發布,引入了一系列激動人心的新功能,很多現有功能也進行了增強。新增功能:1、多媒體設計:不但支持多媒體播放,還能通過電影工具(Movie Tool)和聲音工具(Sound Tool)加入、編輯和刪除多媒體文件。
  • 質量單位——千克的重新定義
    從1889年到1989年的100年間,BIPM以IPK為參考對BIPM保存的6顆官方複製品和各個會員國的國家基準進行了3次周期比對驗證。比對結果表明,6顆官方作證基準及其質量值變化了50微克。作為唯一實物基準的國際千克原器的穩定性受到科學家們的質疑,科學家們開始致力於質量單位的重新定義。有科學家提出,可以使用自然界中的基本物理常數來重新定義質量單位。