JFinal 是基於 Java 語言的極速 WEB + ORM 開發框架,其核心設計目標是開發迅速、代碼量少、學習簡單、功能強大、輕量級、易擴展、Restful。在擁有Java 語言全部優點的同時再擁有 ruby、python、php 等動態語言的開發效率!爲您節約更多時間,去陪戀人、家人和朋友!php
在我尚未認識JFinal的理論知識前,我新建的第一個JFinalDemo項目,個人第一次感受是:太簡單了,太隨意了!哈哈,我是debug模式下啓動他的,而後我能夠直接在Java代碼中隨意的修改,而後頁面刷新,效果直接顯現出來!這就叫「熱編譯」。其次,我的還總結了JFinal的其餘主要特色:
MVC 架構,設計精巧,使用簡單
遵循 COC 原則,零配置,無 xml
首創 Db + Record 模式,靈活便利
ActiveRecord 支持,使數據庫開發極致快速
自動加載修改後的 java 文件,開發過程當中無需重啓 web server
AOP 支持,攔截器配置靈活,功能強大
Plugin 體系結構,擴展性強
多視圖支持,支持 FreeMarker、JSP、Velocity
強大的 Validator 後端校驗功能
功能齊全,擁有 struts2 絕大部分核心功能
體積小僅 218K,且無第三方依賴java
JFinal 遵循大道至簡的設計思想。主要創新點:python
JFinal的架構及原理web
JFinal採用微內核全方位擴展架構,全方位是指其擴展方式在空間上的表現形式。數據庫
JFinal由Handler、Interceptor、Controller、Render、Plugin五大部分組成,以Action爲參照,Handler處在擴展的最外圍,Interceptor處在更貼近Action的周圍,Controller承載Action處在擴展的中心,Render處於Action後端,Plugin處於在Action側邊位置。後端
JFinal實現極速開發主要是由於走的極簡設計風格:零配置、代碼量少、開發體驗連續、無第三方依賴、概念最少化等等。ruby
要實現極簡設計,必需要爲架構注入靈魂,系統纔有本身的極簡性格。設計前先在腦海中造成一整套的極簡設計思想,讓這套思想融入到靈魂的深處,在行動時每動一個設計念頭時以此爲指導思想,最後的結果就能如願。架構
關於JFinal的介紹就很少說了,使用JFinal框架的人也愈來愈多了,關於它的介紹也不少。框架
下面是JFinal事務處理原理:學習
上述配置中爲 savePost() 配置了事務也就是攔截器 Tx,當調用到 savePost() 的時候,是會進入到 Tx 的 intercept 方法中的:
主要代碼以下:
public void intercept(Invocation inv) { Config config = getConfigWithTxConfig(inv); if (config == null) config = DbKit.getConfig(); Connection conn = config.getThreadLocalConnection(); // 下面這段支持嵌套事務,能夠忽略不看 if (conn != null) { try { if (conn.getTransactionIsolation() < getTransactionLevel(config)) conn.setTransactionIsolation(getTransactionLevel(config)); inv.invoke(); return ; } catch (SQLException e) { throw new ActiveRecordException(e); } } Boolean autoCommit = null; try { // 1. 創建數據庫鏈接 conn = config.getConnection(); autoCommit = conn.getAutoCommit(); config.setThreadLocalConnection(conn); // 2. 設置事務隔離級別 conn.setTransactionIsolation(getTransactionLevel(config)); // conn.setTransactionIsolation(transactionLevel); // 3. 設置事務手動提交 conn.setAutoCommit(false); // 4. 反射機制調用 savePost() inv.invoke(); // 5. 事務提交 conn.commit(); } catch (NestedTransactionHelpException e) { if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);} LogKit.logNothing(e); } catch (Throwable t) { // 6. 如有異常就回滾 if (conn != null) try {conn.rollback();} catch (Exception e1) {LogKit.error(e1.getMessage(), e1);} throw t instanceof RuntimeException ? (RuntimeException)t : new ActiveRecordException(t); } finally { try { if (conn != null) { if (autoCommit != null) conn.setAutoCommit(autoCommit); conn.close(); } } catch (Throwable t) { LogKit.error(t.getMessage(), t); // can not throw exception here, otherwise the more important exception in previous catch block can not be thrown } finally { config.removeThreadLocalConnection(); // prevent memory leak } } }
JFinal官網:http://www.jfinal.com