jfinal技術(shù)框架解析_第1頁
jfinal技術(shù)框架解析_第2頁
jfinal技術(shù)框架解析_第3頁
jfinal技術(shù)框架解析_第4頁
jfinal技術(shù)框架解析_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、JFinal 技術(shù)架構(gòu)淺析1.1空間架構(gòu)框架采用微內(nèi)核全方位擴展架構(gòu),全方位是指其擴展方式在空間上的表現(xiàn)形式。整個空間架構(gòu)由HandlerInterceptorControllerRenderPlugin五大部分組成。每個部分都是基于接口實現(xiàn)的,支持完整的自定義,使用靈活,擴展性強??臻g架構(gòu)圖。HandlerInterceptorControllerRenderPlugin1.2邏輯架構(gòu)框架的邏輯架構(gòu)非常簡單,就是一個經(jīng)典的MVC模式演化、大致分成以下6個步驟:1.2.1 Http包括HttpServletRequest、HttpServletResponse,即客戶端請求與響應(yīng)1.2.2 F

2、ilter所有請求的攔截器,相當(dāng)于是一個閘口1.2.3 Handler請求處理器,是對所有請求的公共處理,在這里我們可以做權(quán)限控制、安全驗證等。它是一個責(zé)任鏈模式變種,由初始配置的Handler以及框架默認的ActionHandler構(gòu)成一個鏈條,依次執(zhí)行。1.2.4 Action動作處理器,它是一個AOP+Command模式變種由ActionInvocation進行調(diào)度,先執(zhí)行攔截器,最后執(zhí)行具體方法。1.2.5 Model模型層。在這個層面包括實體模型的定義、DB+ActiveRecord模式數(shù)據(jù)庫操作的支持、從請求中解析出對應(yīng)參數(shù)構(gòu)造Model實例,可以把它看成是DAO(1.2.6 Re

3、nder渲染層。負責(zé)將服務(wù)端的數(shù)據(jù)組裝成客戶端需要的數(shù)據(jù)格式,然后response至U客戶端。支持多種視圖的渲染:FreeMark、Jsp、VELOCITY以及自定義。HttpServletRequestHttpServletResponseJFinalFilter(所有請求的攔截器)Interceptorn(攔截器)Method(具體的方法)ActionActionInvocation(動作調(diào)度器)ActionHandler(動作處王里器)Handler(處王里器)HandlerModelInjector(模型構(gòu)造器)Model(模型定義)DB(數(shù)據(jù)庫操作工具)Render(渲染器)JSPF

4、reeMarkVelocity自定義View1.3代碼架構(gòu)1.3.1包結(jié)構(gòu)1.3.2包簡介Aop:攔截器Config:通用配置Core:核心處理,主要是Controller的調(diào)度Ext:擴展包Handler:全局處理器I18N:國際化util:一些工具類Log:日志類Plugin:插件處理Render:渲染處理,比如對于FreeMark的支持Server:服務(wù)器Token:令牌Upload:文件上傳處理Validate:驗證處理,主要是數(shù)據(jù)持久化時的驗證1.4運作原理我們從一次新增頁面的add操作請求來看:1.%2.%3 .首先是客戶端點擊新增按鈕,提交一個新增請求,請求中會帶上服務(wù)端處理地址

5、url2.%2.%3 .所有請求都會被JFinalFilter攔截,然后調(diào)用Handler進行詳細處理3.%2.%3 .Handler是一個鏈條形式的調(diào)用,包括0-n個自定義Handler,以及最后一個ActionHandler,依次執(zhí)行,當(dāng)然可以自定義跳出。4.%2.%3 .進入ActionHandler后,首先會根據(jù)請求的target從緩存的ActionMapping中映射扶取到具體操作對應(yīng)的Action對象,這個對象里面封裝了方法名、方法上面的攔截器,方法所在的Controller,controller上面的攔截器等。然后根據(jù)Action以及Controller實例構(gòu)造出Actionin

6、vocation。5.%2.%3 .接下來通過Actioninvocation的invoke進行具體處理,這是一個明顯的Command模式的實現(xiàn)。首先是攔截器的調(diào)用,攔截器調(diào)用中會重新回調(diào)Actioninvocation的invoke,當(dāng)攔截器調(diào)用完畢后,會調(diào)用當(dāng)前操作的method6.%2.%3.當(dāng)進入具體controller的新增方法時,調(diào)用基類getModel(Systemparam.class);這個方法會從request中解析出所需要的數(shù)據(jù),通過反射設(shè)置給具體的Model實體類,最終通過ActiveRecord來進行數(shù)據(jù)存儲.7.%2.%3 .最后是頁面渲染render核心代碼簡介我

7、們還是從一次新增請求的流程來看涉及到的核心類有哪些本身就是一個Http的過濾器,主要有3個方法2.6.1init(初始化)在服務(wù)器啟動時執(zhí)行一次,負責(zé)初始化框架的全局配置2.6.2destory(銷毀)在服務(wù)器停止時運行一次,負責(zé)銷毀框架的全局配置2.6.3doFilter(攔截)攔截所有的客戶端請求,處理具體邏輯2.12JFinalConfig是一個API弓I導(dǎo)式配置接口,供使用者自定義實現(xiàn)。里面主要配置常品、配置路由、配置處理器、配置插件、配置攔截器。2.12.1 Config自定義配置執(zhí)行的調(diào)度器2.13JFinal初始化框架全局配置的調(diào)度器,由它來負責(zé)調(diào)用各個組件的初始化接口。包括pa

8、th、Handler、Action、Render、ActiveRecord、Const、i18n等。另外它還提供了啟動內(nèi)置服務(wù)器Jetty的api2.14Action即一個具體的動作, 比如新增、 修改、 刪除等, 你也可以稱之為方法。它包含以下內(nèi)容:controllerClass、controllerKey、actionKey、method、methodNameinterceptorsviewPath2.14.1 ActionMapping初始化請求url與Action的映射關(guān)系, 是Controller的解析器, 最終的產(chǎn)出物是生成一個個actionKey以及與之對應(yīng)的Action對象。2

9、.14.2 Actioninvocation動作調(diào)度器,負責(zé)調(diào)用各個攔截器以及具體的方法2.14.3 ActionKey自定義的注解,用于自定義action的路由規(guī)則2.15Handler通用的全局處理器2.15.1 ActionHandler動作處理器,負責(zé)分析請求,找到對應(yīng)的Action并執(zhí)行2.15.2 HandlerFactory全局Handelr的工廠,負責(zé)生成一個handler鏈2.16Render渲染器2.16.1 RenderFactory渲染器的工廠類,負責(zé)構(gòu)造出各種視圖的渲染器1FreeMarkerRenderFactoryFreeMarkerRender1JspRende

10、rFactoryJspRender1VelocityRenderFactoryVelocityRender1Iplugin插件1.3C3p0Plugin、DruidPlugin數(shù)據(jù)源插件1.3EhCachePlugin緩存插件1.3ActiveRecordPluginmodel初始化插件1.3.10 AutoTableBindPlugin自動綁定model與數(shù)據(jù)庫表的插件1.3.10 TableInfoBuilder負責(zé)初始化model與數(shù)據(jù)庫表的映射關(guān)系1TableInfo存儲的即映射關(guān)系,包括tableName、primaryKey、columnTypeMap所有Model的基類,封裝了通

11、用的數(shù)據(jù)庫操作的方法.1Modelinjector從請求中構(gòu)造出model實例的工具類27,3.4Db、DbKit通用的數(shù)據(jù)庫操作工具類1.3SpringPlugin負責(zé)與spring框架進行集成1.3QuartzPlugin、Cron4jPlugin任務(wù)調(diào)度插件1.3ConfigPlugin配置文件插件1Routes路由規(guī)則1.4MyRoutesUtil自動綁定Controller的工具類1Controller所有Controller的基類,封裝了通用的方法1攔截器Interceptor1.6Before自定義攔截器的注解,配合攔截器實現(xiàn)類使用,實現(xiàn)熱插拔攔截的功能1.6Tx事

12、務(wù)處理的攔截器2.11Validator服務(wù)端的校驗器,供用戶自定義實現(xiàn)2.12服務(wù)器接口IServerJettyServer內(nèi)置的jetty服務(wù)器實現(xiàn)2.13MultipartRequest對于文件上傳的處理3.詳細介紹這里暫時只介紹幾個核心的內(nèi)容bd9-96df-47b4-9163-248b3bd55684-Numbered_62967f5b-53ec-4a8d-ad7a-9e69c55365f1-Numbered_e5bf2bf9-b初始化初始化在服務(wù)器啟動時進行,入口即在JFinalFilter中,下面講最重要的2項初始化過程2-7a5d-445d-9e6a-f23b6f08e278-

13、Numbered_2093300108-f控制器的初始化控制器的初始化包括2個方面,1個是路由,1個是action。路由僅僅是初始化得到一個pathControllerClass的映射。Action的初始化則是將Controller中每個方法進行封裝。Action的初始化依靠ActionMapping的buildActionMapping方法實現(xiàn),下面是實現(xiàn)過程,當(dāng)然我們首先得明白actioin初始化目標是方法:.扶取不需要初始化的方法的名稱,主要是基類Controller里面封裝的一些通用方法.扶取全局攔截器.遍歷前面初始化好的路由,也就是每個自己寫的業(yè)務(wù)Controller.解析每個Con

14、troller的攔截器.反射扶取到每個Controller里面的所有方法,進行遍歷6.排除掉不需要的,剩下的方法首先解析出方法上面的攔截器.進行Action的構(gòu)造newAction(controllerKey,actionKey,controllerClass,method,methodName,actionInters,routes.getViewPath(controllerKey);.最后用一個actionKey與Action進行映射,然后全局緩存住,這個actionKey即為客戶端調(diào)用這個方法的唯一鑰匙從上面可以看出,jfinal中實際上是不保留對于Controller的初始化信息的,

15、它的單位只有1個,就是Action(動作or方法)。在我看來,這樣的組織有點不合理,個人覺得應(yīng)該是Controller保留,Action依附在Controller中,這樣才是最合理的,而且全局的和類的成員將不需要重復(fù)出現(xiàn)在每個Action中??蛻舳苏埱筮^來之后,應(yīng)該首先執(zhí)行全局方法,再扶取到Controller,執(zhí)行類方法,最后抉取對應(yīng)Action,執(zhí)行具體動作。Model初始化對于model的初始化,最終結(jié)果就是抉取Tableinfo對象這個對象里面包含表名、 主鍵名、 實體名以及1個columnTypeMap,這個map里面存放的是數(shù)據(jù)庫列名與該列數(shù)據(jù)類型Class的映射入口也是Jfina

16、lFilter的init方法這里的Tableinfo的list就是我們使用Jfinal的config需要初始配置的,自動初始化實體的實現(xiàn)編寫了一個AutoTableBindPlugin插件類,通過查詢出所有繼承自Model的實體類,然后通過解析TableBind這個自定義注解,抉取表名以及主鍵名3.2Jdbc是如何與連接池插件集成的比如我們原先使用的proxool,hibernate就支持與之整合。亦或者spring中默認使用的c3p0。連接池,說白了就是用來管理數(shù)據(jù)庫連接的,比如最大允許多少連接數(shù),最長連接時間等等,那么我們自己寫的jdbc,怎么來整合它扶得它所提供的功能呢?其實和簡單,我們

17、只需要將數(shù)據(jù)庫連接交由連接池去托管即可:.自定義一個類,比如叫C3P0Plugin,它負責(zé)與連接池的整合銜接,其實就是根據(jù)數(shù)據(jù)庫的配置,生成一個javax.sql.DataSource即可,這個DataSource對象必須是連接池的,比如要整合C3P0,那么就必須DataSourcedataSource=newComboPooledDataSource();dataSource.setJdbcUrl(jdbcUrl);dataSource.setUser(user);dataSource.setPassword(password);.所有需要使用到數(shù)據(jù)庫Connection的地方,全部通過C3

18、p0Plugin中的DataSource扶取,抉取方法為dataSource.getConnection()。這樣就完成了將數(shù)據(jù)庫連接納入連接池的工作3.3聲明式事務(wù)是如何實現(xiàn)的框架的事務(wù)是通過注解來支持的,spring也是如此,即在需要事務(wù)的方法上面加上事務(wù)特有的注解,比如這就是所謂的聲明式事務(wù)。要講它是如何實現(xiàn)的,那么就必須先明白注解是怎么起作用的。.注解的意義注解的誕生就是為了解放xml的冗繁,從這一點可以看出,其實它最核心的功能就是為了配置。當(dāng)然它還有其他一些作用,比如功能聚簇。實體的映射xml文件其實就應(yīng)該與實體在一起的。.自定義注解自己定義一些需要使用到的注解,這個簡單的應(yīng)用還是比

19、較簡單的,這里不多說.注解解析注解的核心作用既然是配置,那么肯定是需要解析的,而且這種固定式的配置,顯然只需要解析一次即可。Jfinal中是在Filter的init方法中進行注解的解析工作的。它會將方法以及方法上面的注解的映射關(guān)系都解析好緩存起來4.注解應(yīng)用當(dāng)調(diào)用到具體該方法時,首先會從緩存中扶取該方法上面的注解, 然后根據(jù)具體的注解內(nèi)容進行相關(guān)的處理, 比如這里的Tx.class,就是一個事務(wù)處理的攔截器,那么就會調(diào)用事務(wù)處理的操作。這里是一個遞歸調(diào)用方式:Actioninvocation調(diào)用invoke方法Invoke方法中調(diào)用各個攔截器的攔截方法interceptIntercept方法中

20、會通過傳入的Actioninvocation對象回調(diào)invoke方法繼續(xù)處理這樣如下的事務(wù)操作就可以囊括整個方法的執(zhí)行了,這就是個命令模式。3.4DB+ActiveRecordDB的話很簡單明了,就是一個數(shù)據(jù)庫操作工具類,ActiveRecord說白了就是在我們的model中加入了數(shù)據(jù)庫操作的能力。比如add、remove、update。這些通用的處理,JFinal在中統(tǒng)一交由最上層的基類Model進行,我們的實體類繼承自Model,就擁有了該能力。3.5表單數(shù)據(jù)自動綁定是怎么實現(xiàn)的Jfinal中一個表單的新增,后臺只需要寫如下代碼即可完成,它是如何實現(xiàn)的1.表單頁面首先我們看下這個表單頁面,

21、注意3個輸入域的name屬性,都是blog.xxx,這里實際上就是設(shè)置了值與實體屬性之間的映射關(guān)系了2.服務(wù)端從request中扶取到所有的值,過濾出其中blog屬性,緩存到Model基類的attrs這個map中3.最后通過Record的add方法進行新增。3.6關(guān)于路由3.6.1ioc這里的路由就相當(dāng)于我們原先seam框架的ioc了,不過它功能更簡單一些,需要在初始的時候進行配置,也就是頁面與Controller之間的映射關(guān)系。如何去除路由配置很簡單,使用我們原先的注解的方式即可。自定義一個Controller的注解,比如Name,然后解析初始化到全局配置中即可。自動綁定controller

22、的實現(xiàn)原理與我們原先猜想的一樣1,自定義了一個RouteBind注解,然后每個Controller進行綁定2,編寫了一個工具類MyRoutesUtil該工具類將webinf/classes目錄下面所有的.class二進制文件查找出來,然后通過反射和解析注解生成jfinal的Routes3.在服務(wù)器啟動的時候進行初始化即可3.7攔截器Jfinal中所有的攔截都通過Interceptor實現(xiàn),根據(jù)位置大致可以分成以下幾種全局攔截器在config中進行注冊類攔截器在類上面通過注解注冊方法攔截器在方法上面通過注解注冊插件機制插件的機制主要就是一個基于接口動態(tài)擴展實現(xiàn)的架構(gòu), 最頂層是一個IPlugin

23、。其實說白了,它就是一個全局性配置的擴展實現(xiàn)。插件的注冊在自定義實現(xiàn)的JfinalConfig中進行配置插件運行所有插件的運行都是在服務(wù)器啟動的時候進行一次,具體是在Config類中的如下方法:插件停止停止即在服務(wù)器關(guān)閉時JfinalFiler的destroy中進行緩存EcachePlugin框架本身內(nèi)置了Ecache這個插件,可以直接使用,只需要在JfinalConfig中進行注冊即可MemcachedClient另外還有1個分布式緩存的實現(xiàn),具體可以參照MemcacheTool4 如何使用攔截器參照上面的3.7控制器編寫一個普通java類,繼承Controller,類上面使用注解進行路由綁定RouteBind(path=/power)publicclassPowerContrallerextendsBaseController調(diào)用controller的方法面進來的時候默認會走index方法,這個實現(xiàn)在ActionMapping用指定方法默認調(diào)用controller中方法的方式為/controllername/methodname比如上面的路徑,power為controller的路由注解、list即為方法名字。但是也可以通過ActionKe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論