監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價咨詢管理系統(tǒng) | 工程設(shè)計管理系統(tǒng) | 簽約案例 | 購買價格 | 在線試用 | 手機(jī)APP | 產(chǎn)品資料
X 關(guān)閉

以不變架構(gòu)應(yīng)多變業(yè)務(wù)

申請免費試用、咨詢電話:400-8352-114

來源:泛普軟件

該樣本程序在充分利用已有開源框架的基礎(chǔ)上,開發(fā)了獨立的SinoSoftFrame架構(gòu),基于J2EE規(guī)范實現(xiàn),主要分為三層: Web層、業(yè)務(wù)層、持久層,很好地適應(yīng)了財產(chǎn)保險行業(yè)的業(yè)務(wù)特點。

財產(chǎn)保險行業(yè)業(yè)務(wù)具有以下特點:

1.保險險類、險種、產(chǎn)品眾多

財產(chǎn)保險公司往往有包括企財險類、家財險類、責(zé)任險類、工程險類、車險類、船舶險類和貨運(yùn)險等幾十個險類,上百個甚至幾百個業(yè)務(wù)險種。這些險類險種既有共性,又有特性,如何將這些共性和特性有機(jī)地組織在一起是我們必須要有效解決的問題。

2.全流程業(yè)務(wù)需要

財產(chǎn)保險業(yè)務(wù)往往包含了投保、承保、批改、理賠、收付、財務(wù)等多個業(yè)務(wù)處理環(huán)節(jié),同時還要通過掛接核保核賠管理和單證管理功能來降低企業(yè)的經(jīng)營風(fēng)險。提供多種統(tǒng)計分析與查詢接口實現(xiàn)業(yè)務(wù)數(shù)據(jù)的統(tǒng)計分析,為企業(yè)經(jīng)營決策提供及時、有效的支持和幫助。為統(tǒng)一架構(gòu)與開發(fā)規(guī)范,降低保險公司的開發(fā)和維護(hù)成本,設(shè)計的技術(shù)架構(gòu)必須能滿足眾多子系統(tǒng)的業(yè)務(wù)需求與技術(shù)要求。

3.新產(chǎn)品上線要求時間短

保險公司為了搶占市場,爭奪客戶,從研發(fā)推出新產(chǎn)品到產(chǎn)品上線往往只有一周甚至更短的時間,這對我們的系統(tǒng)架構(gòu)提出了極高的要求。

4.行業(yè)高速發(fā)展,業(yè)務(wù)多變

保險行業(yè)是個高速發(fā)展的行業(yè),業(yè)務(wù)多變,這是當(dāng)前保險行業(yè)的特性決定的,我們只能去適應(yīng)這些變化。所以,要求我們的架構(gòu)必須具備很強(qiáng)的應(yīng)變能力。

5.多語言支持

隨著保險業(yè)的逐漸對外放開,越來越多的外資保險公司成為我們的客戶。多語言支持成為這些客戶對我們系統(tǒng)的基本要求之一。

當(dāng)然財產(chǎn)保險行業(yè)還有其他一些特點,如全國大集中數(shù)據(jù)管理方式、總公司-分公司分支機(jī)構(gòu)的管理模式、無紙化單證管理等等。作為財產(chǎn)保險公司的行業(yè)解決方案,系統(tǒng)必須能夠適應(yīng)以上這些行業(yè)特點,滿足財產(chǎn)保險公司向用戶提供新業(yè)務(wù)、新服務(wù),適應(yīng)市場競爭的需要; 滿足各地區(qū)業(yè)務(wù)的變化性,適應(yīng)地方性險種管理的需要。

從保險的定義出發(fā),保險業(yè)務(wù)領(lǐng)域可分為投承保、批改、理賠等多個業(yè)務(wù)環(huán)節(jié),針對樣本程序,本文僅介紹承保業(yè)務(wù)。承保是保險業(yè)務(wù)的開始,承保信息關(guān)系到保單能否生成、與投保人能否簽訂合同、能否出具保單等。本樣板程序以保險領(lǐng)域中“投保處理”環(huán)節(jié)作為參照實現(xiàn),所以我們此處僅針對投保單相關(guān)的數(shù)據(jù)模型進(jìn)行重點說明。

數(shù)據(jù)模型

“投保處理”環(huán)節(jié)涉及到了用戶投保錄入時的眾多信息元素,包含了基本信息、標(biāo)的信息、險種費用信息、條款信息、共保信息等五大類。投保錄入主要涉及到四個主要的實體對象: 投保單主表、投保單險種表、標(biāo)的主表、標(biāo)的物險別責(zé)任表。除了這四個主要實體對象之間存在著一對多的對象關(guān)系外,每個實體對象還關(guān)聯(lián)著眾多的從屬對象。

投保單主表是整張投保單的概括信息,它的相關(guān)從屬表有投保兌換率表、投保單條款表、保險關(guān)系人表、收費計劃表等; 投保單險種相關(guān)表描述的投保單項下各險種的相關(guān)信息,當(dāng)投保單中存在多險種時,險種表描述多條險種信息,它的相關(guān)從屬表有投保單保額保費表、險種條款表、險種費用表等; 投保單中的標(biāo)的信息放在標(biāo)的相關(guān)表中進(jìn)行分類描述,以區(qū)分不同險種下的不同標(biāo)的,它的相關(guān)從屬表根據(jù)險類的不同有財產(chǎn)險標(biāo)的信息、車險標(biāo)的信息、動態(tài)標(biāo)的信息等等; 標(biāo)的險別責(zé)任相關(guān)表是對投保單中標(biāo)的最明細(xì)的描述。它的相關(guān)從屬表有標(biāo)的物責(zé)任條款表、險別責(zé)任附加費表、險別責(zé)任免賠額表、險別責(zé)任賠償限額表等。

總體架構(gòu)

本著“不重復(fù)造車輪但也絕不依賴于任何第三方框架”的設(shè)計思想,我們獨立設(shè)計開發(fā)了自己的基礎(chǔ)框架體系SinoSoftFrame,在此SinoSoftFrame框架體系上,在部分層面引入一些優(yōu)秀的開源產(chǎn)品,集成到我們的框架體系SinoSoftFrame中。這樣,當(dāng)已集成的產(chǎn)品在技術(shù)和效率上無法滿足我們的業(yè)務(wù)需要時或在某個層面有更好、更快、更有效的新產(chǎn)品時,我們可以很容易地從SinoSoftFrame中完成新產(chǎn)品的升級替換,而對已開發(fā)完成的業(yè)務(wù)實現(xiàn)代碼不產(chǎn)生任何影響或?qū)⒂绊懡档阶畹?。SinoSoftFrame架構(gòu)基于J2EE規(guī)范實現(xiàn),主要分為三層: Web層、業(yè)務(wù)層、持久層。

Web層采用MVC模式,主要任務(wù)是接收用戶從頁面提交的請求和最終返回處理結(jié)果。對于處理用戶請求來講,Web層的任務(wù)是讀取用戶提交的表單數(shù)據(jù),把HttpServletRequest中的表單數(shù)據(jù)和請求參數(shù)封裝到數(shù)據(jù)傳輸對象DTO中供業(yè)務(wù)層處理; 對于返回處理結(jié)果來講,Web層的任務(wù)是把業(yè)務(wù)層處理完畢后返回的數(shù)據(jù)傳輸對象DTO返回給JSP頁面展現(xiàn)給客戶。

業(yè)務(wù)層主要完成業(yè)務(wù)邏輯的實現(xiàn)。如業(yè)務(wù)數(shù)據(jù)校驗、業(yè)務(wù)邏輯處理、事務(wù)管理、記錄業(yè)務(wù)處理日志、拋出業(yè)務(wù)處理異常等任務(wù)。

持久層僅用來完成業(yè)務(wù)數(shù)據(jù)持久化和查詢讀取,這里采用關(guān)系型數(shù)據(jù)庫來完成數(shù)據(jù)的持久化保存,因此持久層主要完成數(shù)據(jù)庫的CRUD(增、刪、改、查),同時包含對存儲異常的處理等任務(wù)。

SinoSoftFrame通過模擬Spring的實現(xiàn)機(jī)制建立了自己的容器實現(xiàn)機(jī)制,并通過定義接口、擴(kuò)展基類等方法將對第三方依賴的內(nèi)容封裝到SinoSoftFrame中,從而實現(xiàn)與第三方框架的解耦。下面重點說明一下在架構(gòu)設(shè)計的三層上具體采用的實現(xiàn)方式或開源框架。

因Web層確定采用MVC的設(shè)計模式,而軟件開發(fā)領(lǐng)域有很多優(yōu)秀的MVC開源框架,如Struts、WebWork2、Spring MVC等等,但也各有其優(yōu)缺點。SinoSoftFrame的Web層實現(xiàn)選擇了Struts,原因主要是基于它歷經(jīng)6年的不斷成熟、它的穩(wěn)定開發(fā)團(tuán)隊、它龐大的社區(qū)、用戶和程序員基礎(chǔ)。頁面展現(xiàn)仍采用了傳統(tǒng)的JSP+Taglib的實現(xiàn)方式。畢竟開發(fā)成本也是架構(gòu)設(shè)計和選型要考慮的重要因素之一。

業(yè)務(wù)層框架的設(shè)計要求是增加模塊或代碼的復(fù)用性,降低業(yè)務(wù)類之間的耦合,減少程序修改帶來的“漣漪”效應(yīng)。在SinoSoftFrame的業(yè)務(wù)層我們選擇了Spring。Spring是一種無侵入式的輕量級框架,可以用簡單的POJO去完成接口類的定義及實現(xiàn)的調(diào)用,絕大多數(shù)業(yè)務(wù)對象都不需要依賴于Spring;可以很容易對業(yè)務(wù)層進(jìn)行單元測試; 它促進(jìn)程序員養(yǎng)成好的編程習(xí)慣(把對接口編程而不是對類編程的代價幾乎減少到零)。當(dāng)然,Spring框架帶給我們的優(yōu)勢不只以上這些,它就像系統(tǒng)的粘合劑,對系統(tǒng)各個層面各個環(huán)節(jié)的功能、實現(xiàn)框架都提供了無縫的支持。不過,最主要也是最重要的還是Spring的Ioc模式實現(xiàn)(Ioc通俗來說,就是在編制程序時,只要寫被調(diào)用者的接口代碼,具體子類實例可通過配置實現(xiàn))。

SinoSoftFrame選擇了Hibernate作為持久層實現(xiàn)。Hibernate是一種Java語言下的對象關(guān)系映射解決方案。

它為面向?qū)ο蟮念I(lǐng)域模型到傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的映射,提供了一個使用方便的框架。它的設(shè)計目標(biāo)是將軟件開發(fā)人員從大量相同的數(shù)據(jù)持久層相關(guān)編程工作中解放出來。Hibernate不僅負(fù)責(zé)從Java類到數(shù)據(jù)庫表的映射(還包括從Java數(shù)據(jù)類型到SQL數(shù)據(jù)類型的映射),還提供了面向?qū)ο蟮臄?shù)據(jù)查詢檢索機(jī)制,從而極大地縮短了手工處理SQL和JDBC的時間,而且它不會強(qiáng)迫修改對象的行為方式,不需要實現(xiàn)任何框架要求的接口。惟一需要做的就是創(chuàng)建一份XML“映射文檔”,告訴框架你希望能夠保存在數(shù)據(jù)庫中的類,以及它們?nèi)绾侮P(guān)聯(lián)到該數(shù)據(jù)庫中的表和列,然后就可以要求它以對象的形式獲取數(shù)據(jù),或者把對象保存為數(shù)據(jù)。同時,它可以支持多達(dá)十六種數(shù)據(jù)庫,包含企業(yè)級常用的Oracle、DB2、Informix、SQLServer、Sybase等。SinoSoftFrame系統(tǒng)架構(gòu)如圖1所示。

同時,為了提供最佳的用戶體驗,SinoSoftFrame框架中還引入了Ajax的DWR實現(xiàn),加上Ajax的調(diào)用層次后,系統(tǒng)調(diào)用架構(gòu)如圖2所示。

輔助工具

● 代碼生成工具JToolPad

設(shè)計師設(shè)計框架的目的是為了解耦、應(yīng)變、統(tǒng)一規(guī)范、跨平臺、支持多語言,但程序員眼中的好框架更多的則是:簡單易用、快速開發(fā)。而SinoSoftFrame框架包含了三層,進(jìn)行應(yīng)用系統(tǒng)開發(fā)的程序員要面對眾多的接口和實現(xiàn)類以及多個配置文件,顯然并不簡單。為此,我們獨立開發(fā)了輔助代碼生成工具JToolPad,用以生成SinoSoftFrame框架中的部分類和配置文件。為了從程序員的角度查看該架構(gòu),我們將JToolPad可以生成的類和配置文件以及框架本身提供的基類去掉后的系統(tǒng)架構(gòu)圖如圖3所示。圖3是程序員開發(fā)應(yīng)用系統(tǒng)時的框架結(jié)構(gòu),而針對數(shù)據(jù)庫應(yīng)用系統(tǒng)中大多數(shù)的單表增、刪、改、查操作,JToolPad還能生成更多的常見類及代碼,如圖4所示。

從圖4可以看到,程序員在結(jié)合JToolPad工具使用SinoSoftFrame框架時,大多數(shù)情況下都只需要完成Web層的頁面控制跳轉(zhuǎn)Action及業(yè)務(wù)層的接口和接口實現(xiàn)類即可,當(dāng)然還有少不了的JSP頁面和Action配置文件。如果程序員還覺得麻煩,JToolPad甚至還可以根據(jù)實現(xiàn)類直接生成對應(yīng)的接口類(當(dāng)然從設(shè)計的角度出發(fā),不建議這么做)。

● 自定義標(biāo)簽庫

為了進(jìn)一步提高開發(fā)速度、統(tǒng)一頁面規(guī)范,SinoSoftFrame框架中提供了多種自定義標(biāo)簽,如分頁導(dǎo)航條、通用操作命令按鈕、下拉列表、多語言自動支持、代碼選擇域、用戶自定義風(fēng)格等。

以分頁導(dǎo)航條為例,開發(fā)人員只需在頁面中相應(yīng)位置嵌入一段簡單的標(biāo)簽庫代碼即可在頁面上顯示風(fēng)格統(tǒng)一并可自動實現(xiàn)上頁、下頁、第一頁、最后一頁、跳轉(zhuǎn)到指定頁的分頁導(dǎo)航條。

● 基類及常用工具類

為了易于擴(kuò)展SinoSoftFrame中各層的功能,也為了能通過AOP的方式完成業(yè)務(wù)的共性操作,如日志、權(quán)限檢測等等。SinoSoftFrame在各層的基類中都提供了豐富的功能,如SQL權(quán)限的自動封裝、功能權(quán)限的判斷與檢測、險種代碼的自動替換、調(diào)試的Log自動輸出等。

同時,SinoSoftFrame還提供了專門針對新版SinoSoftFrame框架開發(fā)的工具類,如頁面參數(shù)的封裝(單一對象封裝及List對象自動封裝)、Hibernate的增強(qiáng)處理等等。

● 業(yè)務(wù)通用組件

針對財產(chǎn)保險行業(yè)的領(lǐng)域特點及行業(yè)通用需求,SinoSoftFrame中還特意提供了很多業(yè)務(wù)通過組件,有用于頁面的通用組件,如: 嵌套多行輸入域、雙擊代碼選擇域、多語言自支持等。也有用于系統(tǒng)后臺處理的通用組件,如: 權(quán)限管理、影像管理、打印管理、代碼管理、工作流管理等。這些組件有的是通過直接調(diào)用類的方式實現(xiàn),有的是通過標(biāo)簽庫實現(xiàn),大粒度的組件則是按組件的使用規(guī)則和使用方法實現(xiàn)。

● 引入的其他開源框架

針對應(yīng)用系統(tǒng)開發(fā)中的特定問題框架也引入了其他的優(yōu)秀開源框架。數(shù)據(jù)檢驗采用了Validtor校驗框架,通過配置文件就可以對頁面的輸入域和多行數(shù)據(jù)域配置校驗規(guī)則; 在使用Ajax為用戶提供最佳體驗方面,采用了DWR框架; 系統(tǒng)安全認(rèn)證采用了Acegi,Acegi是在Spring的基礎(chǔ)上實現(xiàn)的一套安全認(rèn)證框架; 任務(wù)調(diào)度采用了Quartz調(diào)度框架。

鏈接:實現(xiàn)范例

我們通過“投保單保存”的一個實際調(diào)用過程說明一下SinoSoftFrame的具體實現(xiàn)。

● Web層信息錄入

我們將信息元素按業(yè)務(wù)分類組織在多個標(biāo)簽頁中,如: 基本信息、標(biāo)的信息、險種費用信息、條款信息、共保信息等。每個標(biāo)簽頁中包含了該類的主要錄入元素。投保相關(guān)的頁面通過標(biāo)簽的形式組織在一起,其中< mpc:page>標(biāo)簽庫包含的內(nèi)容在頁面中的展現(xiàn)就形成了投保頁面上的標(biāo)簽頁。其中每個標(biāo)簽頁中的內(nèi)容又根據(jù)頁面信息分類的不同包含在不同的JSP頁面中,通過< jsp:include>標(biāo)簽庫有機(jī)地組織在一起。

針對保險行業(yè)系統(tǒng)的國際化要求,JSP頁面基本上都是用STRUTS標(biāo)簽以及自定義標(biāo)簽來寫的。

● Struts配置文件相關(guān)定義

JSP頁面提交后交由Struts的Action處理,相應(yīng)的處理類定義在配置文件app-prpall-struts.xml文件中。需要特別注意的是配置文件中包含的通配符“$”的一行forward,內(nèi)容如下:

< forward name="prepareInsert" path="/prpall/risk/$/EditFrame$.jsp business Type=Proposal"/>

該通配符是對保險行業(yè)產(chǎn)品眾多特點的特殊處理,配合SinoSoftFrame的目錄結(jié)構(gòu)規(guī)范,開發(fā)人員只需在相應(yīng)的Action中設(shè)置需要替換的險種代碼即可很輕松、很容易地完成相應(yīng)保險產(chǎn)品的自動跳轉(zhuǎn)。

● Web層StrutsAction說明

系統(tǒng)應(yīng)用框架根據(jù)Struts中的配置文件定義跳轉(zhuǎn)到GuProposalAction類,系統(tǒng)應(yīng)用框架根據(jù)Request中傳入的actionType自動跳轉(zhuǎn)到的相應(yīng)方法中進(jìn)行處理(處理方法與actionType同名)。

Web層處理類Action首先將頁面參數(shù)組織到了投保單復(fù)合對象GuProposalDto中。SinoSoftFrame是通過paramUtils類完成頁面變量到Dto對象和列表對象自動轉(zhuǎn)換的。paramUtils是系統(tǒng)框架中提供的Request參數(shù)工具類。程序中簡單地通過paramUtils的generateObject方法和generateList方法就可以完成頁面參數(shù)到DTO對象間的自動映射。

● 業(yè)務(wù)層實現(xiàn)

投保單服務(wù)類由接口定義類和實現(xiàn)類組成。接口和實現(xiàn)的分離從一定程度上消解了依賴關(guān)系,具體實現(xiàn)可以在編譯期間發(fā)生變化。GuProposal-Service及GuProposalServiceSpringImpl類圖如圖5所示。在GuProposalAction中調(diào)用業(yè)務(wù)層進(jìn)行投保單保存的代碼如下:


圖5 GuProposalService GuProposalServiceSpringImpl類圖

ServiceManager.getGuProposalService().insert(guProposalDto);

首先通過ServiceManager類的get方法來獲得該服務(wù)接口類,然后通過insert()接口方法完成投保單的保存。方法的具體實現(xiàn)是在服務(wù)接口實現(xiàn)類中完成的,系統(tǒng)編碼中引用的是接口類,而接口的實現(xiàn)類是由SinoSoftFrame在運(yùn)行期注入的。接口和實現(xiàn)類的對應(yīng)關(guān)系通過配置文件App-prpall-service.xml定義。

● 持久層實現(xiàn)

持久層主要由兩部分構(gòu)成: 數(shù)據(jù)訪問對象DAO接口及其實現(xiàn)、實體對象PO。業(yè)務(wù)層通過調(diào)用持久層的DAO完成業(yè)務(wù)對象的持久化(即保存到數(shù)據(jù)庫中)。實體對象PO是和業(yè)務(wù)模型一致用以完成數(shù)據(jù)庫操作的業(yè)務(wù)對象,在進(jìn)行投保單保存時主要有以下實體對象: 投保單主表、投保人及被保險人對象、投保費用。

系統(tǒng)框架要求實體對象必須遵從如下要求: 每個實體對象都必須繼承于自身的實體Base類(該實體Base類是通過工具自動生成的);為實體對象增加不需要持久化的擴(kuò)展屬性時,在實體對象中增加; 嚴(yán)格保持Base類與數(shù)據(jù)業(yè)務(wù)模型(即數(shù)據(jù)庫結(jié)構(gòu))的一致。

Hibernate完成業(yè)務(wù)對象的持久化是通過hbm配置文件將對象屬性和數(shù)據(jù)庫表中的字段對應(yīng)來自動完成的,因此配置文件hbm是不可缺少的(可以由工具自動生成)。

持久層DAO的設(shè)計模式和業(yè)務(wù)層類似,也是將接口和實現(xiàn)分開實現(xiàn)了持久層的解耦。接口類中定義了每個業(yè)務(wù)對象的持久化操作,實現(xiàn)類中實現(xiàn)了具體的持久化實現(xiàn)代碼。通過持久層的解耦,有效地解除了應(yīng)用系統(tǒng)對SinoSoftFrame中引用的持久層框架的依賴,同時更有效地支持了各種存儲形式,包括自定義的存儲方式。

通過類圖可以看到,每個持久化對象都會對應(yīng)一套DAO對象(該套DAO可以通過工具自動生成)。如果需要編寫自定義的數(shù)據(jù)庫操作,可以在DAO的接口和實現(xiàn)層中進(jìn)行擴(kuò)展(不需要修改DAOBase類)。可以看到,只需調(diào)用Dao層的insert方法即可將投保單持久化對象保存到數(shù)據(jù)庫中。(ccw)

發(fā)布:2007-04-23 09:56    編輯:泛普軟件 · xiaona    [打印此頁]    [關(guān)閉]
太原OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號1層9號

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費獲取試用系統(tǒng)

QQ在線咨詢

泛普太原OA快博其他應(yīng)用

太原OA軟件 太原OA新聞動態(tài) 太原OA信息化 太原OA快博 太原OA行業(yè)資訊 太原軟件開發(fā)公司 太原門禁系統(tǒng) 太原物業(yè)管理軟件 太原倉庫管理軟件 太原餐飲管理軟件 太原網(wǎng)站建設(shè)公司