JFinal 3.6 釋出,五彈齊發迎新年
春節前處理完年前使用者反饋的需求與改進,來年只需專注面向未來。 jfinal 3.6 有近 40 項增強與改進,部分功能與改進十分有價值,值得你擁有。
一、第一彈 JFinal 3.6
1、Controller 新增 set 方法
由於 setAttr 方法使用頻率極高,為了進一步減少程式碼量、提升開發效率,新增了 set 方法,其使用方式與 setAttr 完全一樣:
// 常見用法 set("user", user); // 鏈式用法 set("user", user).set("article", article).render("index.html");
set 方法相對於 setAttr 可以減少五次按鍵,使用者體驗更好。原方法 setAttr 會永久保留。
2、Controller 新增 get 系方法
與 setAttr 方法同樣高頻使用的 getPara、getParaToXxx 方法也進行了同樣改進,新增 get 系方法,進一步減少程式碼量,提升開發體驗:
// get 系替代 getPara 系 get("title"); // getXxx 系替代 getParaToXxx 系 getInt("value"); getLong("counter");
當然,使用 action 注入比這更省程式碼:
// title、content 引數值會被自動注入 public void index(String title, String content) { service.save(title, content); }
set 與 get 系方法的新增,持續表達著 jfinal 在提升開發效率、開發體驗方面永不止步的追求,未來也將永遠進行下去。
3、模板引擎新增 #switch 指令
#switch 指令特色之一是 #case 分支支援多引數:
#switch (month) #case (1, 3, 5, 7, 8, 10, 12) #(month) 月有 31 天 #case (2) #(month) 月平年有28天,閏年有29天 #default 月份錯誤: #(month ?? "null") #end
如上程式碼所示,#case 分支指令支援以逗號分隔的多個引數,這個功能就消解掉了 #break 指令的必要性,所以 enjoy 模板引擎是不需要 #break 指令的。
特色之二是 #case 引數支援任意表達式:
#case (a, b, x + y, "abc", "123")
上述程式碼中用逗號分隔的表示式先會被求值,然後再逐一與 #switch(value) 指令中的 value 進行比較,只要有一個值與其相等則該 case 分支會被執行。
#case 支援逗號分隔的多引數,從而無需引入 #break 指令,不僅減少了程式碼量,而且避免了忘寫 #break 指令時帶來的錯誤隱患。
4、模板引擎新增 #call 指令
使用 #call 指令,模板函式的名稱與引數都可以動態指定,提升模板函式呼叫的靈活性,用法如下:
#call(funcName, p1, p2, ..., pn)
上述程式碼中的 funcName 為函式名,p1、p2、pn 為被呼叫函式所使用的引數。如果希望模板函式不存在時忽略其呼叫,新增常量值 true 在第一個引數位置即可:
#call(true, funcName, p1, p2, ..., pn)
5、Generator 生成器新增生成備註功能
資料庫表字段中如果有備註可以生成在 getter、setter 方法之上,只需要一行配置即可:
generator.setGenerateRemarks(true);
生成備註以後,在開發時將滑鼠指標放在方法名之上會自動彈出備註內容,消滅掉對資料表字段含義的記憶負擔。
6、增強 Tx 事務攔攔截器
老版本 jfinal 應用在 Controller 上的 Tx 攔截器,如果使用 try catch 捕獲異常,不太方便指定異常時響應的頁面或者資料,通常需要使用一個全域性攔截器統一管理。 jfinal 3.6 新版本改進後可以支援下面的用法:
@Before(Tx.class) public void trans { try { service.justDoIt(...); render("ok.html"); } catch (Exception e) { render("error.html"); throw e; } }
如上程式碼所示,在 catch 塊中可以使用 render,也可以使用 renderJson 來靈活響應資料,注意最後別忘了 throw e 丟擲異常,好讓 Tx 攔截器感知異常並回滾事務。
7、Kv、Ret 新增 setIfNotNull 與 setIfNotBlank 方法
jfinal 俱樂部 QQ 群中經常發現小夥伴們的程式碼是下面這樣的:
if (value != null) { kv.set("value", value); } if (StrKit.notBlank(value)) { kv.set("value", value); }
用上 jfinal 3.6 以後,程式碼可以簡化成下面這樣的:
kv.setIfNotNull("value", value); kv.setIfNotBlank("value", value);
這仍然是 jfinal 追求更高開發效率,更爽開發體驗的繼續表達。
8、Db 新增對 String 變數模板的支援
jfinal 3.0 針對於外部 sql 檔案管理,添加了 #sql、#para、#namespace 三指令極簡支援,小夥伴們已然爽翻了,沒想到還有人提出了支援 String 變數管理 sql 的支援,用法是下面這樣的:
String str = "select * from girls where age < #para(0) and weight < #para(1)"; SqlPara sp = Db.getSqlParaByString(str, 19, 50); Db.find(sp);
確實有些小夥伴喜歡將簡單 sql 寫在 java 程式碼中,但同時又希望用上 enjoy 引擎來管理 sql。如果沒有這個功能的支援,往往要使用 StringBuilder 進行 sql 拼接,程式碼將會十分醜陋,而且與 SQL 配套的 Object... paras 處理起來也麻煩很多。
9、Model、Db 新增 findAll()
為了避免 select * 被大量使用,以及該功能可通過 find("select * from t") 比較方便地被消解掉,jfinal 一直未提供 findAll() 方法。但對於有些專案中存在一些類似於 dic 字典表這種小規模資料的 table 就能省些程式碼,對於這類需求,可以這麼用了:
List<dictionary> = dictionaryList = dictionary.findAll();
仍然是追求開發效率、開發體驗的繼續表達。
10、新增 onStart、onStop
新增 onStart()、onStop() 回撥方法,分別替代 JFinalFilter 中的 afterJFinalStart()、beforeJFinalStop(),在減少程式碼量輸出的同時,降低手動入錯誤的概率,而且還降低了記憶成本。
11、解決升到 JDK 8 以後的型別轉換錯誤
jfinal 3.5 版本以 JDK 8 起步以後,Model、Db 中的 findById、deleteById 在某些情況下會出現型別轉換異常, jfinal 3.6 版本將針對多主鍵/聯合主鍵的 findById、deleteById 添加了字尾字元 's' 解決了該問題
所以,如果你的老專案中有涉及多主鍵聯合主鍵的 findById、deleteById 方法的使用,需要改成下面的用法:
document.findByIds(1, 1); Db.deleteByIds("user_role", "userId, roleId", 123, 456);
升級以後,如果有地主需要改的話,eclipse/IDEA 會提示要改的地方,所以升級很安全。
12、優化路由對映效能
新增 Routes.setMappingSuperClass(boolean) 方法,可以配置是否要對 Controller 的超類中的 public 方法進行路由對映,預設值為 false。該優化的效果是會隨著 controller 數量的增加而增加的。
這裡要注意一個或級問題,如果用到了 jfinal weixin 專案,並且用到了其中的 MsgController,需要配置一下:
public void configRoute(Routes me) { me.setMappingSuperClass(true); }
因為 MsgController 中作為超類而存在的,其中的 index() 方法必須要被對映才能分發微信伺服器發來的訊息。
更多改進與增強可以在官網下載 changelog:http://www.jfinal.com
二、第二彈 JFinal Undertow 1.5
傳送門:JFinal Undertow 1.5 釋出,穩定、可靠服役於生產環境
三、第三彈 JFinal Weixin 2.3
傳送門:JFinal Weixin 2.3 釋出,早已支援微信小程式開發
四、第四彈 Enjoy 3.6
傳送門:Enjoy 3.6 釋出,Java 開發者專用超輕量級模板引擎
五、第五彈 Jetty Server 2019.1
傳送門:Jetty Server 2019.1
ONE MORE THING :jfinal 新版本資源已更新併發布在了 jfinal 官網,maven 中心庫也已經上傳,可以極速升級。俱樂部福利也更新了一波:https://www.jfinal.com/club 。 新福利計劃也已出臺:https://www.jfinal.com/club/1-2