李 劍
LI Jian
(南京化工職業(yè)技術(shù)學(xué)院,南京 210048)
隨著保險(xiǎn)業(yè)管理要求和風(fēng)險(xiǎn)防范意識(shí)的增強(qiáng),通過大量的數(shù)據(jù)統(tǒng)計(jì),可以分析經(jīng)營(yíng)趨勢(shì),為保險(xiǎn)行業(yè)決策者提供參考。因此,如何在規(guī)定的時(shí)間段收集保險(xiǎn)子公司經(jīng)營(yíng)數(shù)據(jù)并進(jìn)行統(tǒng)計(jì)分析就成了保險(xiǎn)行業(yè)需要解決的問題。然而,目前保險(xiǎn)行業(yè)總部依靠各地下屬部門層層上報(bào)數(shù)據(jù),該方法已經(jīng)不能適應(yīng)保險(xiǎn)行業(yè)對(duì)數(shù)據(jù)及時(shí)性的需求。因此,利用先進(jìn)的JSF-Guice-iBATIS集成框架技術(shù)研發(fā)保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng),具有較強(qiáng)的現(xiàn)實(shí)意義。
該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)需求:
1)設(shè)定周一至周五的夜間23:30,觸發(fā)數(shù)據(jù)采集程序;
2)該系統(tǒng)數(shù)據(jù)采集功能將各子公司的經(jīng)營(yíng)數(shù)據(jù)存儲(chǔ)到總部數(shù)據(jù)庫;
3)總部人員登錄系統(tǒng)后,可以瀏覽總部數(shù)據(jù)庫的數(shù)據(jù),通過應(yīng)用系統(tǒng)提供的圖形統(tǒng)計(jì)方法,進(jìn)行決策分析。
該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)主要模塊功能如下:
1)數(shù)據(jù)采集模塊:系統(tǒng)每個(gè)工作日定時(shí)從各地分公司數(shù)據(jù)庫采集數(shù)據(jù)到總部數(shù)據(jù)庫,里面包括定時(shí)觸發(fā)程序。
2)統(tǒng)計(jì)分析模塊:包括瀏覽數(shù)據(jù)和分析決策兩項(xiàng)功能。其中,瀏覽數(shù)據(jù)就是指總部人員瀏覽各地分公司經(jīng)營(yíng)數(shù)據(jù);分析決策就是指總部人員按時(shí)間縱向比較、按不同分公司橫向比較,可以對(duì)險(xiǎn)種銷售數(shù)據(jù)進(jìn)行分類,按照不同子公司、按照不同時(shí)段進(jìn)行統(tǒng)計(jì),生成相應(yīng)折線、柱狀對(duì)比圖形。
2.1 系統(tǒng)邏輯結(jié)構(gòu)設(shè)計(jì)
該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)采用JSF- GuiceiBATIS集成框架,如圖1所示。其中,JSF是一個(gè)基于Java Web的用戶界面標(biāo)準(zhǔn),同時(shí)又符合MVC模式的Web應(yīng)用程序框架,它主要作用是將視圖層與模型層分開,解開其中的耦合性;Guice是一個(gè)優(yōu)于Spring的實(shí)現(xiàn)控制反轉(zhuǎn)(IoC)及面向切面編程(AOP)的輕量級(jí)框架;iBATIS是以SQL為中心的數(shù)據(jù)持久層框架。三者共同構(gòu)成JSF- GuiceiBATIS集成框架。
在圖1中,控制層用JSF框架構(gòu)建,負(fù)責(zé)系統(tǒng)用戶界面和控制器,其中C代表控制器FaceServlet,V代表視圖JSP,負(fù)責(zé)顯示功能,M代表Backing Bean,JSP頁面的數(shù)據(jù)經(jīng)簡(jiǎn)單處理后,被傳輸給業(yè)務(wù)層;業(yè)務(wù)層由Guice框架構(gòu)建,根據(jù)業(yè)務(wù)邏輯來決定下一步操作;持久層由iBATIS框架構(gòu)建,負(fù)責(zé)與數(shù)據(jù)庫層進(jìn)行交互。
JSF- Guice- iBATIS集成框架包含對(duì)持久性、事務(wù)管理、安全性、日志記錄等問題的現(xiàn)成解決方案,同時(shí)本身又具有很強(qiáng)的普適性和實(shí)用性,從而使開發(fā)者在應(yīng)用該框架技術(shù)時(shí),能夠大大提高該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)開發(fā)的效率。
圖1 JSF-Guice-iBATIS集成框架示意圖
圖1所示的系統(tǒng)邏輯結(jié)構(gòu)能夠更好地遵循Sun J2EE平臺(tái)中兩個(gè)主要的設(shè)計(jì)原則:“多層架構(gòu),松耦合”。由于采用分層的設(shè)計(jì)方式,各個(gè)模塊功能相互獨(dú)立封裝,層與層之間的關(guān)聯(lián)少,保持松耦合連接,系統(tǒng)的穩(wěn)定性高,便于擴(kuò)展和維護(hù)。另外,項(xiàng)目中的每一層所采用的技術(shù)都是可替換的,例如JSF可以被Struts或者Tapestry等其它的表示層實(shí)現(xiàn)框架替換掉,Guice 可以換成Spring框架,iBATIS可以替換成JDO或Hibernate框架。在每個(gè)層中都不同程度地應(yīng)用了J2EE平臺(tái)中常用的設(shè)計(jì)模式,并且使用基于POJO的輕量級(jí)架構(gòu)實(shí)現(xiàn)系統(tǒng)中的各個(gè)核心的功能組件,從而使得系統(tǒng)易于測(cè)試、移植、縮短開發(fā)周期。
2.2 系統(tǒng)接口設(shè)計(jì)
2.2.1 DAO層設(shè)計(jì)
當(dāng)開發(fā)該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)時(shí),利用一個(gè)通用API層將實(shí)體操作的細(xì)節(jié)封裝起來。DAO(Data Access Objects)允許程序員通過一個(gè)簡(jiǎn)單接口的來操作數(shù)據(jù),從而屏蔽了具體實(shí)現(xiàn)細(xì)節(jié)。利用DAO,程序員可以動(dòng)態(tài)配置應(yīng)用程序來訪問不同的實(shí)體存儲(chǔ)機(jī)制。該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)包含復(fù)雜的應(yīng)用,需要用到子公司的數(shù)據(jù)庫,DAO讓程序員建立一個(gè)一致的API,讓系統(tǒng)的其它部分來調(diào)用。圖2為本地持久層接口SupdataDao與接口實(shí)現(xiàn)類SupdataDaoImpl的類圖。
在圖2中,F(xiàn)iliale類構(gòu)成了子公司數(shù)據(jù)表實(shí)體模型,而SupdataDao接口調(diào)用這個(gè)Filiale模型來定義具體的DAO方法,SupdataDaoImpl類則是SupdataDao接口的實(shí)現(xiàn)類。SupdataDao接口則調(diào)用了Filiale類模型來定義接口的一些方法。
圖2 Filiale模型DAO層類結(jié)構(gòu)圖
2.2.2 業(yè)務(wù)邏輯層設(shè)計(jì)
該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)業(yè)務(wù)邏輯層提供統(tǒng)一的Facade接口,前臺(tái)Web層僅僅調(diào)用這個(gè)Facade接口,這樣,Web層與后臺(tái)耦合非常松散,即使替換整個(gè)Web層也較容易。
圖3為該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)業(yè)務(wù)邏輯結(jié)構(gòu)示意圖。
圖3 該系統(tǒng)業(yè)務(wù)邏輯結(jié)構(gòu)示意圖
在圖3中,業(yè)務(wù)層處在DAO層之外,除負(fù)責(zé)該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)業(yè)務(wù)處理外,還通過DAO層管理業(yè)務(wù)邏輯到持久層實(shí)現(xiàn)、提供與其它層交互接口、管理業(yè)務(wù)對(duì)象之間依賴關(guān)系及管理事務(wù)。
圖4為子公司Filiale模型Service層類關(guān)系圖。在圖4中,F(xiàn)ilialeServiceImpl類實(shí)現(xiàn)了接口FilialeService所定義的方法,并且調(diào)用了FilialeDao接口,而FilialeService接口則引入了Filiale對(duì)象模型。這里調(diào)用的是FilialeDao接口,不是調(diào)用的FilialeDao接口實(shí)現(xiàn)類。調(diào)用FilialeDao接口而不關(guān)注具體的實(shí)現(xiàn)類FilialeServiceImpl的好處,就是研發(fā)人員修改某一實(shí)現(xiàn)類的時(shí)候不需修改調(diào)用層的代碼,降低了該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)的開發(fā)復(fù)雜性。
圖4 Filiale模型Service層類關(guān)系圖
在系統(tǒng)需求分析與總體設(shè)計(jì)的基礎(chǔ)上,完成系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn),這部分內(nèi)容包括公共類設(shè)計(jì)、系統(tǒng)持久層實(shí)現(xiàn)、數(shù)據(jù)自動(dòng)采集功能實(shí)現(xiàn)、統(tǒng)計(jì)分析功能實(shí)現(xiàn)以及系統(tǒng)關(guān)鍵問題解決方案,限于篇幅,下文著重闡述后三部分。
3.1 數(shù)據(jù)自動(dòng)采集功能實(shí)現(xiàn)
3.1.1 控制器組件實(shí)現(xiàn)
該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)數(shù)據(jù)采集模塊沒有視圖層,控制器FacesServlet也無需另外開發(fā),但需要在web.xml文件和faces-config.xml兩個(gè)配置文件中進(jìn)行定義。
3.1.2 Service層組件實(shí)現(xiàn)
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)開發(fā)過程中,業(yè)務(wù)層,根據(jù)圖3該系統(tǒng)業(yè)務(wù)邏輯結(jié)構(gòu)示意圖可以看出,該層最容易出現(xiàn)與其它層緊耦合現(xiàn)象。例如,該層與持久層的交互的處理、事務(wù)的管理。在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,利用Guice作為業(yè)務(wù)層來解決這類問題。其中包括業(yè)務(wù)層接口FilialeService、業(yè)務(wù)層接口實(shí)現(xiàn)類FilialeServiceImpl。
業(yè)務(wù)層接口FilialeService包括以下方法聲明:
1)獲取持久層插入數(shù)據(jù)方法insertData(Filiale Filiale);
2)獲取持久層遍歷xuzhoudata、zhenjiangdata等各保險(xiǎn)分公司數(shù)據(jù)庫的方法selectXuZhouData()、selectZhenJiangData();
業(yè)務(wù)層接口實(shí)現(xiàn)類FilialeServiceImpl類實(shí)現(xiàn)了接口FilialeService所定義的方法,并且調(diào)用了FilialeDao接口,而FilialeService接口則引入了Filiale對(duì)象模型。
關(guān)于接口類FilialeService與其實(shí)現(xiàn)類FilialeServiceImpl之間的綁定在“4.3.4 業(yè)務(wù)模塊綁定問題”中闡述。
3.1.3 DAO層組件實(shí)現(xiàn)
SupDataDao接口類接受業(yè)務(wù)層接口實(shí)現(xiàn)類FilialeServiceImpl的調(diào)用,進(jìn)行持久化操作。具體包括以下方法:
1)向保險(xiǎn)總公司數(shù)據(jù)庫插入信息insert
Data();
2)遍歷xuzhoudata、zhenjiangdata、…、taizhoudata等各保險(xiǎn)分公司數(shù)據(jù)庫的方法:selectXuZhouData()、selectZhenJiangData()、
…、selectTaiZhouData();
SupDataDaoImpl繼承SqlMapClientDaoSupp
ort,是接口類SupDataDao的實(shí)現(xiàn)類,使用Ibatis進(jìn)行持久化操作。在Filiale模型DAO層類結(jié)構(gòu)中,F(xiàn)iliale類構(gòu)成了實(shí)體模型,而FilialeDao接口調(diào)用這個(gè)Filiale模型來定義具體的DAO方法,F(xiàn)ilialeDaoImpl類則是FilialeDao接口的實(shí)現(xiàn)類。
關(guān)于接口類FilialeDao與其實(shí)現(xiàn)類FilialeDaoImpl之間的綁定在“4.5.4 業(yè)務(wù)模塊綁定問題”中闡述。
3.2 統(tǒng)計(jì)分析功能實(shí)現(xiàn)
保險(xiǎn)公司總部人員每天一上班,就可以登錄系統(tǒng),查看每一個(gè)子公司的數(shù)據(jù)險(xiǎn)種銷售經(jīng)營(yíng)額,并可進(jìn)行按照日、月、年對(duì)各個(gè)子公司進(jìn)行分析,統(tǒng)計(jì)分析圖形顯示借助插件JFreeChart完成。
3.2.1 各分支機(jī)構(gòu)數(shù)據(jù)及統(tǒng)計(jì)結(jié)果展示
各分支機(jī)構(gòu)數(shù)據(jù)及統(tǒng)計(jì)結(jié)果展示手段包括各分公司保險(xiǎn)日經(jīng)營(yíng)額匯總顯示以及任意時(shí)間段經(jīng)營(yíng)額統(tǒng)計(jì)。
3.2.2 各分支機(jī)構(gòu)數(shù)據(jù)圖形化比較
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,對(duì)于圖的表示方法,柱狀圖表示業(yè)績(jī),其中的每一個(gè)柱表示實(shí)際的業(yè)績(jī),用數(shù)值表示;線狀圖用來表達(dá)趨勢(shì),通常按時(shí)序排列其中的點(diǎn),每個(gè)點(diǎn)對(duì)應(yīng)的值也是實(shí)際業(yè)績(jī),用數(shù)值表示。下面利用JFreeChart生成統(tǒng)計(jì)結(jié)果圖表。
前面從數(shù)據(jù)庫中取出了連續(xù)一段時(shí)間每天的經(jīng)營(yíng)額,并保存在MNPeriodsale對(duì)象中。MNPeriodsale是由JFreeChart提供的輔助類,用來生成統(tǒng)計(jì)報(bào)表。JFreeChart是開放源代碼Java項(xiàng)目,它主要用來生成各種各樣的圖形。
1)使用ChartFactory來創(chuàng)建時(shí)間序列的折線圖標(biāo)對(duì)象
日經(jīng)營(yíng)額統(tǒng)計(jì)調(diào)用的dayTurnover方法。該方法首先獲得要統(tǒng)計(jì)日經(jīng)營(yíng)總額,調(diào)用TurnoverHandle的getDayTurnover方法從數(shù)據(jù)庫中獲取數(shù)據(jù)集,并將數(shù)據(jù)集保存在request對(duì)象中。處理完畢后,流程轉(zhuǎn)向頁面day.jsp。視圖頁面首先從request對(duì)象中取出數(shù)據(jù)集,然后調(diào)用ChartHandle的generateZizagChart方法來生成圖形,最后將圖形展示在界面上。
2)使用ChartFactory來創(chuàng)建時(shí)間序列的柱狀圖標(biāo)對(duì)象
通過統(tǒng)計(jì)最近幾個(gè)月每月的經(jīng)營(yíng)額,可以從較大的時(shí)間段上反映經(jīng)營(yíng)額變化情況。對(duì)于這些數(shù)據(jù)的比較與分析,保險(xiǎn)公司決策層可以采取更有效的措施刺激保險(xiǎn)業(yè)績(jī)的增長(zhǎng)。
getMonthTurnover方法用于獲取當(dāng)月在內(nèi),前幾個(gè)月的保險(xiǎn)營(yíng)銷額,并保存到數(shù)據(jù)集中返回,供JfreeChart調(diào)用。其中參數(shù)count為要統(tǒng)計(jì)多少月的數(shù)據(jù),結(jié)果集中包含前count月每月的經(jīng)營(yíng)總額。
用柱狀圖來描述每月的保險(xiǎn)總額,主要實(shí)現(xiàn)過程是使用ChartFactory創(chuàng)建柱狀JfreeChart。
3.3 關(guān)鍵問題解決方案
3.3.1 讀取多數(shù)據(jù)源問題
該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)iBATIS配置文件中分公司數(shù)據(jù)庫配置文件分別為farData1.xml、farData2.xml、分公司數(shù)據(jù)庫映射文件distanceData.xml、字段配置文件column.properties、分公司數(shù)據(jù)表查詢條件配置文件farTable.xml。
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,讀取分公司的數(shù)據(jù)源的步驟如下:
1)設(shè)定查詢條件,本應(yīng)用中的查詢條件設(shè)定為:xuzhouid=1與zhenjiangid=2,……
2)利用ParameterColmn類,讀取字段配置文件column.properties,獲得資源數(shù)據(jù)庫表名稱和字段信息。
3)利用ParseFarXml類解析分公司數(shù)據(jù)查詢條件farTable.xml。
4)根據(jù)Guice容器加載的filepath文件獲得資源數(shù)據(jù)庫iBATIS客戶端(一共得到兩個(gè)客戶端實(shí)例:farData1、farData2)。
5)設(shè)定臨時(shí)文件,存儲(chǔ)查找的數(shù)據(jù),供應(yīng)用程序DistanceDataRowHandler.java解析,轉(zhuǎn)存到ArrayList中。
3.3.2 自動(dòng)采集過程觸發(fā)器問題
Quartz是輕量級(jí)的組件,能夠用來完成J2EE應(yīng)用中的定時(shí)操作。簡(jiǎn)單的來說,Quartz把一個(gè)定時(shí)事件分成Job(任務(wù))及Trigger(觸發(fā)器)兩個(gè)模塊,Job用于定義工作內(nèi)容,Trigger用于定義觸發(fā)條件,也就是定義任務(wù)開始的時(shí)間。
關(guān)鍵代碼為:
CronTrigger cTrigger = new CronTrigger
("myTrigger",Scheduler.DEFAULT_GROUP,"0 30 23 ? * MON-FRI");
利用上述代碼,就可實(shí)現(xiàn)從周一到周五每天晚上的23點(diǎn)30分觸發(fā)保險(xiǎn)公司總部應(yīng)用系統(tǒng),完成從分公司數(shù)據(jù)源進(jìn)行數(shù)據(jù)采集。
3.3.3 數(shù)據(jù)采集程序
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,數(shù)據(jù)采集涉及到的程序是DistanceDataRowHandler類、DistanceDataTrigger類、DistanceDataTrigger
Impl類。下面分別闡述。
1)開發(fā)DistanceDataRowHandler類
這一步建立查詢工具,將得到的數(shù)據(jù)存到ArrayList對(duì)象中,開發(fā)的具體類名稱為DistanceDataRowHandler類,在這個(gè)類中,重寫iBATIS的RowHandler方法,利用iBATIS的客戶端進(jìn)行數(shù)據(jù)查詢。查詢分公司數(shù)據(jù)庫數(shù)據(jù)過程為:首先使用組裝好的查詢條件SQL語句,然后將得到的數(shù)據(jù)重新組裝成完整的插入語句,最后將這些插入語句整體存儲(chǔ)在List中。
2)開發(fā)DistanceDataTrigger類、Distance DataTriggerImpl類
首先查找分公司數(shù)據(jù)庫,然后利用查詢工具DistanceDataRowHandler類將得到的數(shù)據(jù)存儲(chǔ)到總部數(shù)據(jù)庫中,開發(fā)的類為DistanceDataTrigger、DistanceDataTriggerImpl,前者是接口,后者是該接口的實(shí)現(xiàn)類。
3.3.4 業(yè)務(wù)模塊綁定問題
1)該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)綁定類Bind類在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,業(yè)務(wù)層的綁定利用Guice解決。
在工程根目錄下新建一個(gè)繼承AbstrctModule的Bind類,此類中的configure()方法用來將所有的接口和實(shí)現(xiàn)類綁定。主要代碼如下:
通過以上程序,將DistanceDataTriggerImpl、FilialeDaoImpl 、FilialeServiceImpl等實(shí)現(xiàn)類與DistanceDataTrigger、FilialeDao、FilialeService等接口類實(shí)現(xiàn)綁定。
然后,在當(dāng)前當(dāng)前目錄下新建一個(gè)類Injectors,用Injectors類將Binds類中的綁定進(jìn)行注入。這樣,就可以使用Injectors類中的Injecting方法來調(diào)用Binds類的注入了。
2)該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)業(yè)務(wù)層具體工作過程
下面討論該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)業(yè)務(wù)層具體工作過程。
1)Guice啟動(dòng)時(shí)的流程
Guice在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)是如何工作的,首先來看Guice對(duì)接口FilialeService及其實(shí)現(xiàn)類FilialeServiceImpl之間的綁定過程。
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,利用Guice進(jìn)行接口綁定序列圖如圖5所示。
圖5 該系統(tǒng)使用Guice進(jìn)行接口綁定序列圖
(1)根據(jù)該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)業(yè)務(wù)需求定義業(yè)務(wù)接口及其實(shí)現(xiàn)類。
(2)定義接口FilialeService的實(shí)現(xiàn)類FilialeServiceImpl,并覆蓋模塊FilialeService接口中configure方法,同時(shí)利用Binder類完成具體綁定。Binder類的具體實(shí)現(xiàn)在“4.5.3 數(shù)據(jù)采集程序”小節(jié)“3.業(yè)務(wù)模塊綁定問題”詳細(xì)闡述。
(3)調(diào)用com.google.inject包中的Guice類,利用此類的createInjector方法來完成注入。
(4)用“Guice.createInjector(new Bind()).getInstance(FilialeService)”調(diào)用綁定接口FilialeService,完成接口FilialeService與實(shí)現(xiàn)類FilialeServiceImpl的依賴注入。
2)Guice的運(yùn)行
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,利用啟動(dòng)階段創(chuàng)建的注入器(Guice.createInjector())注入對(duì)象并內(nèi)省綁定(將FilialeServiceImpl與FilialeService)。Guice運(yùn)行時(shí)的模型由一個(gè)可管理一定數(shù)量綁定的注入器(Injector)組成。由Injector調(diào)用綁定類,這樣調(diào)用接口FilialeService就等于調(diào)用FilialeServiceImpl。
該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)采用JSF-Guice-iBATIS集成框架構(gòu)建。其中,JSF作為表示層框架,Guice作為業(yè)務(wù)層框架,iBATIS作為持久層框架。在開發(fā)過程中,通過Guice提供的依賴注入,結(jié)合靈巧的iBATIS持久化框架和動(dòng)態(tài)的XML解析,再將Guice的受管Bean注入到JSF的后臺(tái)Bean中,實(shí)現(xiàn)了這三者的結(jié)合,達(dá)到保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)良好的復(fù)用目的,使系統(tǒng)的開發(fā)變得更加容易。與同類系統(tǒng)相比,該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)具有以下優(yōu)勢(shì):
4.1 JSF框架backing bean模式的應(yīng)用
在進(jìn)行JSF頁面開發(fā)的過程中,對(duì)于每一個(gè)JSF頁面,其后臺(tái)都應(yīng)有一個(gè)JavaBean與其對(duì)應(yīng)。頁面中要顯示的信息和要輸入的信息都綁定到后臺(tái)JavaBean的屬性上,在進(jìn)行顯示或請(qǐng)求提交時(shí),JSF框架會(huì)自動(dòng)調(diào)用與該屬性相對(duì)應(yīng)的get或set方法。
4.2 JSF與Guice的集成
由于JSF和Guice都支持IoC,因此在開發(fā)過程中,可以通過配置文件將Guice的受管Bean注入到JSF的后臺(tái)Bean中,實(shí)現(xiàn)JSF和Guice的完美結(jié)合。
4.3 Guice動(dòng)態(tài)注入的使用
Guice把業(yè)務(wù)邏輯層組件之間的依賴關(guān)系通過Guice容器來管理,動(dòng)態(tài)注入,提高了靈活性和運(yùn)行效率,達(dá)到系統(tǒng)組件良好的復(fù)用目的。而且,Guice容器保證把代碼修改和配置文件修改同步。
4.4 數(shù)據(jù)訪問層采用iBATIS框架
數(shù)據(jù)訪問層采用iBATIS Database Layer框架,在分公司數(shù)據(jù)庫結(jié)構(gòu)不同情況下,易于維護(hù)。另外,與Hibernate框架相比,降低了開發(fā)難度,提高開發(fā)效率。
4.5 數(shù)據(jù)層多數(shù)據(jù)源的使用
因?yàn)樵摫kU(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)數(shù)據(jù)采集來源屬于不同的分公司,因此,在設(shè)計(jì)中,數(shù)據(jù)層采用多數(shù)據(jù)源的方式,也可有效提高系統(tǒng)的水平伸縮性。
4.6 面向接口編程
在數(shù)據(jù)層設(shè)計(jì)過程中,分為SQL Maps和DAO層。在DAO層設(shè)計(jì)過程中,采用接口與實(shí)現(xiàn)分離的方式,并通過對(duì)象關(guān)系模型分析DAO層類關(guān)系。這種方式在業(yè)務(wù)層設(shè)計(jì)過程中同樣采用,使系統(tǒng)層次更加清晰,便于維護(hù)。
4.7 利用插件quartz實(shí)現(xiàn)觸發(fā)器
在該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)中,利用Quartz解決定時(shí)觸發(fā)問題,并針對(duì)該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)數(shù)據(jù)定時(shí)采集特殊需求,比較了Quartz中三種觸發(fā)器功能,最后利用CronTrigger解決問題。
4.8 模型差異
從MVC角度來看,同類系統(tǒng)視圖層采用Struts框架,其中ActionForm模型必須繼承框架類,這樣導(dǎo)致程序緊耦合。該保險(xiǎn)行業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)采用的JSF框架,將Struts框架中的ActionForm組件和業(yè)務(wù)控制器Action組件合并成一個(gè)Backing Bean組件,Backing Bean組件屬于POJO,不需要繼承框架類,顯得比較靈活。
4.9 使用JFreeChart完成圖形分析
借助JFreeChart來實(shí)現(xiàn)保險(xiǎn)公司經(jīng)營(yíng)額時(shí)間序列的折線圖、柱狀圖,完成各分支機(jī)構(gòu)數(shù)據(jù)及統(tǒng)計(jì)結(jié)果表格展示,可以直觀地反映經(jīng)營(yíng)額變化情況,便于保險(xiǎn)公司決策層采取更有效的措施刺激保險(xiǎn)業(yè)績(jī)的增長(zhǎng)。
應(yīng)用該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng),能夠極大地提高數(shù)據(jù)統(tǒng)計(jì)效率,以往需要層層上報(bào)數(shù)據(jù)進(jìn)行匯總的統(tǒng)計(jì)方式,現(xiàn)在完全由該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)自動(dòng)完成,提高了數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確性和及時(shí)性。
該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)將有關(guān)分公司數(shù)據(jù)整合起來,對(duì)分支機(jī)構(gòu)數(shù)據(jù)進(jìn)行綜合分析,將數(shù)據(jù)轉(zhuǎn)化為有用信息,便于管理層關(guān)注數(shù)據(jù)的地區(qū)及不同時(shí)段的差異性,為保險(xiǎn)公司產(chǎn)品開發(fā)、客戶服務(wù)提供可靠的依據(jù)。
該保險(xiǎn)業(yè)數(shù)據(jù)統(tǒng)計(jì)系統(tǒng)便于保險(xiǎn)公司積累成功實(shí)施經(jīng)驗(yàn),保險(xiǎn)營(yíng)銷管理流程得到進(jìn)一步優(yōu)化,為保險(xiǎn)企業(yè)規(guī)避風(fēng)險(xiǎn)提供了保障;數(shù)據(jù)集中和圖形分析為保險(xiǎn)公司管理水平的提升奠定了基礎(chǔ),促使保險(xiǎn)公司從傳統(tǒng)粗放型的管理向精細(xì)化管理邁進(jìn)。
[1]孟平揚(yáng).淺析中國(guó)保險(xiǎn)的社會(huì)管理功能[J].技術(shù)與市場(chǎng),2009,(1):21-21.
[2]梁遠(yuǎn)航,齊琳琳.我國(guó)保險(xiǎn)行業(yè)協(xié)會(huì)自律的反思與完善[J].財(cái)經(jīng)科學(xué),2009,(6):40-46.
[3]余香.淺談我國(guó)保險(xiǎn)營(yíng)銷模式的創(chuàng)新[J].福建商業(yè)高等??茖W(xué)校學(xué)報(bào),2009,(1):33-36.
[4]曹紅欣.我國(guó)保險(xiǎn)營(yíng)銷制度改革探討[J].管理觀察,2009,(13):44-45.
[5]白兆華,張峰.軟件保險(xiǎn)問題中動(dòng)態(tài)加密的研究[J].科技信息,2009,(16):202-205.
[6]胡玉琴.中國(guó)養(yǎng)老保險(xiǎn)制度改革中性別利益的精算分析[J].統(tǒng)計(jì)與信息論壇,2009,(5):63-67.
[7]張曉婷,程耕國(guó),鮑考明.基于JSF框架的化驗(yàn)室管理系統(tǒng)的設(shè)計(jì)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,(9):2289-2292.
[8]朱佳.JSF技術(shù)在基金管理系統(tǒng)中的應(yīng)用與分析[J].科技資訊,2009,(10):18-20.
[9]雷沖,廉迎戰(zhàn).JSF框架的研究及其應(yīng)用[J].網(wǎng)絡(luò)安全技術(shù)與應(yīng)用,2009,(5):69-70.
[10]彭勝,劉衛(wèi)國(guó).基于JSF定制生命周期的AjaX組件開發(fā)[J].計(jì)算機(jī)應(yīng)用,2009,(7):1764-1766.
[11]北京皓辰網(wǎng)域網(wǎng)絡(luò)信息技術(shù)有限公司.http://publish.itpub.net/zt/guice/[EB/OL/].Guice輕量級(jí)框架學(xué)習(xí)專題,2006-07-05.
[12]北大青鳥.Google Guice [EB/OL/].http://www.bdaccp.com/xw/news_view.asp?newsid=1211,2008-6-8.
[13]yiketree.Guice與Spring框架的區(qū)別[EB/OL/].http://hi.baidu.com/yiketree/blog/item/351d4301da27ded1277fb5d2.html,2008-12-10.
[14]scansoft.Guice[EB/OL/].http://baike.baidu.com/view/890473.htm?fr=ala0_1,2009-11-15.
[15]章文躍.在J2EE持久層中用Spring+iBATIS實(shí)現(xiàn)Webwork開發(fā)[J].福建電腦,2009,(5):172-173.
[16]李澎林,朱國(guó)清,吳斌.基于iBatis SQL Map的數(shù)據(jù)持久層實(shí)現(xiàn)應(yīng)用研究[J].浙江工業(yè)大學(xué)學(xué)報(bào),2008,(1):72-76.[17]馮浩.基于Struts與iBatis框架的Web開發(fā)在國(guó)稅部門的應(yīng)用研究[J].科技情報(bào)開發(fā)與經(jīng)濟(jì),2007,(34):212-14.
[18]邢波.用ibatis提升一類數(shù)據(jù)庫檢索查詢的性能[J].計(jì)算機(jī)應(yīng)用與軟件,2007,(12):205-207.
[19]王付強(qiáng),方麗娜.基于MVC和Ibatis的Web開發(fā)研究[J].新鄉(xiāng)師范高等??茖W(xué)校學(xué)報(bào),2007,(5):58-61.
[20]田秋艷,王蕾,吳慶,等.基于JSF+Spring+Hibernate架構(gòu)的教學(xué)資源共享平臺(tái)[J].長(zhǎng)春工業(yè)大學(xué)學(xué)報(bào),2009,(3):337-340.
[21]孫華林.基于JSF-Spring-Hibernate架構(gòu)的研究與應(yīng)用[J].信息技術(shù),2009,(5):208-211.