系統(tǒng)需求
現(xiàn)場銷售人員在與客戶洽談時,需要及時地了解客戶和聯(lián)系人的詳細(xì)資料,管理相關(guān)的商業(yè)機(jī)會,清楚公司產(chǎn)品的報價、存貨等信息,能夠方便地進(jìn)行查詢(多條件)、創(chuàng)建、更新和刪除(權(quán)限允許)等操作,并且能夠把相關(guān)數(shù)據(jù)下載到手機(jī)當(dāng)中。另外,現(xiàn)場服務(wù)工程師需要隨時掌握客戶的服務(wù)請求及其客戶和聯(lián)系人信息,以便做出迅速的反映,協(xié)調(diào)處理好該服務(wù)請求。由于客戶、聯(lián)系人資料等需要填寫較多的數(shù)據(jù),系統(tǒng)應(yīng)當(dāng)支持離線和在線兩種工作方式,用戶可以先在離線方式下創(chuàng)建數(shù)據(jù)信息,保存到手機(jī)當(dāng)中,再上傳數(shù)據(jù),進(jìn)行同步,從而節(jié)省費(fèi)用。開發(fā)工具我選擇IBM WebSphere Studio.
系統(tǒng)設(shè)計與實(shí)現(xiàn)
考慮到系統(tǒng)的安全性、擴(kuò)展性和可維護(hù)性,我決定在J2EE平臺下開發(fā)服務(wù)器端程序,這樣做系統(tǒng)復(fù)雜度低、成本低、系統(tǒng)性能優(yōu)越。系統(tǒng)客戶端是運(yùn)行在Java手機(jī)上的,因此必須充分考慮這一特點(diǎn),并在開發(fā)中加以應(yīng)用。系統(tǒng)設(shè)計的目標(biāo)是分開業(yè)務(wù)邏輯和表示層,它是一個典型的四層分布式MVC應(yīng)用體系架構(gòu),下面將對其設(shè)計思想和實(shí)現(xiàn)原理進(jìn)行詳細(xì)闡述。
客戶端(Client Tier)
客戶端獲得用戶請求后提交給遠(yuǎn)程服務(wù)器,得到結(jié)果后加以表現(xiàn)。我選擇在J2ME(CLDC+MIDP)平臺上開發(fā)客戶端程序。由于MIDlet程序開發(fā)具有內(nèi)存小、界面簡單、有限的運(yùn)算能力和網(wǎng)絡(luò)性能等特點(diǎn),需要重點(diǎn)設(shè)計以下幾個方面:
1.與Web服務(wù)器之間的通信
J2ME支持打開網(wǎng)絡(luò)連接、傳送數(shù)據(jù)、訪問遠(yuǎn)程服務(wù)器資源。首先,用戶在離線方式下設(shè)置系統(tǒng)參數(shù),指定本公司W(wǎng)eb服務(wù)器的IP地址、端口和Web根目錄,選擇工作方式(在線或者離線)。隨后,程序?qū)蓷l相關(guān)信息寫進(jìn)本地數(shù)據(jù)庫,一條記錄Web服務(wù)器地址,另一條記錄工作方式。每當(dāng)系統(tǒng)啟動或者切換工作方式時加載,這樣可以使得MIDlet工作在適當(dāng)?shù)臓顟B(tài)。MIDlet編程支持HTTP網(wǎng)絡(luò)連接,代碼如下:
HttpConnection conn = (HttpConnection)Connector.open(url);
這樣就在客戶端與Web服務(wù)器之間建立了HTTP連接,其中url存儲了請求參數(shù)信息,比如:
url = "http://www.mcrm.com:8000/CRMRoot/custCreateAlias?id=001&name=..."
Web服務(wù)器中相應(yīng)的Servlet將調(diào)用doGet()方法處理請求,返回響應(yīng),從而把業(yè)務(wù)邏輯的處理交給服務(wù)器端,達(dá)到“瘦”客戶端的設(shè)計目標(biāo)。建好HTTP連接以后,就可以方便地操作數(shù)據(jù)流,進(jìn)行數(shù)據(jù)讀寫了,代碼如下:
InputStream in = conn.openInputStream();
int data;
while(data=in.read()!=0){...} ...
需要注意的是,有的手機(jī)對中文的支持還不算很完善,其中有些地方需要進(jìn)行編碼轉(zhuǎn)換。
客戶端編程的重點(diǎn)在于準(zhǔn)確地提交用戶請求參數(shù)、創(chuàng)建和查詢客戶信息、聯(lián)系人信息、商業(yè)機(jī)會和服務(wù)請求,并可對查詢到的結(jié)果進(jìn)行更新、刪除和下載。實(shí)現(xiàn)時,類CRMCustomer、類CRMLinkman、類CRMOpportunity、類CRMService封裝了這些方法;類custSearch、類linkSearch、類oppoSearch、類servSearch提供了查詢的界面;類CRMViewProduct實(shí)現(xiàn)了查看產(chǎn)品信息的功能。它們的實(shí)現(xiàn)手段相同,都是通過生成并提交存儲請求參數(shù)信息的url,打開HTTP連接,請求服務(wù)響應(yīng)來達(dá)到目的。]
2.本地數(shù)據(jù)庫操作
MIDP(Mobile Information Device Profile)支持對持久數(shù)據(jù)的存儲,J2ME記錄管理系統(tǒng) ( RMS )允許數(shù)據(jù)流被儲存并在一個記錄基礎(chǔ)上訪問數(shù)據(jù),由應(yīng)用程序開發(fā)者把每個記錄解析到字段水平。系統(tǒng)需要存儲的是包含用戶請求參數(shù)信息的URL,從第三條記錄開始讀寫(前兩條已做系統(tǒng)參數(shù)用)。調(diào)用J2ME中類RecordStore的getRecord(int recordId)、addRecord(byte[] data, int offset, int numBytes)方法進(jìn)行基本的讀、寫操作,并以“&”為標(biāo)志符解析數(shù)據(jù)記錄url,得到名/值對。系統(tǒng)把整個本地數(shù)據(jù)庫操作封裝在類CRMdb當(dāng)中,這樣,這些操作就可重用。
3.XML解析
XML(Extensible Markup Language)是一種獨(dú)立于系統(tǒng)的表達(dá)數(shù)據(jù)信息的標(biāo)記語言,現(xiàn)已成為網(wǎng)絡(luò)系統(tǒng)中通用的數(shù)據(jù)交換格式。本系統(tǒng)采用XML技術(shù)進(jìn)行數(shù)據(jù)交換,利用它的分級結(jié)構(gòu),很容易訪問到所需的數(shù)據(jù)信息。這就意味著想要取得遠(yuǎn)程服務(wù)器端XML文檔中的數(shù)據(jù)信息,MIDlet編程就必須支持XML解析技術(shù)。從網(wǎng)上不難得到J2ME端的XML解析器,本系統(tǒng)采用的是NanoXML,它是一種非確認(rèn)(non-validating)、單步(single-step)解析器。NanoXML解析整個XML文檔,并把它轉(zhuǎn)換成一棵元素樹(如圖2),可以通過調(diào)用方法getChildren、getTagName、getContents等來遍歷整棵樹,得到數(shù)據(jù)信息。
表示層(Web Tier)
Servlets和JavaBean構(gòu)成了表示層。這是一種控制結(jié)構(gòu),減低了視圖與模型之間的耦合性。當(dāng)Servlet響應(yīng)到一個HTTP GET請求時,doGet()方法被service()方法的默認(rèn)實(shí)現(xiàn)所調(diào)用,并把request對象和response對象作為參數(shù)傳給該函數(shù)。整個程序覆蓋了doGet()方法,它們所做主要工作是創(chuàng)建JavaBean實(shí)例,傳遞request對象,調(diào)用bean方法,取得存放于Bean中的數(shù)據(jù),返回結(jié)果(XML文檔)。JavaBean封裝了更為復(fù)雜的業(yè)務(wù)邏輯,可以調(diào)用EJB方法執(zhí)行各種數(shù)據(jù)存取的事務(wù)。JavaBean是一種可重用組件,提高代碼復(fù)用性,加快了軟件開發(fā)過程。如上所述,系統(tǒng)利用JAXP和W3C提供的訪問XML的接口DOM來處理XML文檔。代碼如下所示:
<custList>
<matchedCust>7</matchedCust>
<customer>
<id>Cust_001</id>
<name>Oliver</name>
</customer>
</custList>
業(yè)務(wù)邏輯層(Business Tier)
EJB container提供了一種系統(tǒng)級服務(wù),開發(fā)者只需要專注于業(yè)務(wù)邏輯處理即可。系統(tǒng)運(yùn)用實(shí)體Bean封裝數(shù)據(jù)對象,建立與數(shù)據(jù)庫間的映射。會話Bean封裝了業(yè)務(wù)邏輯,該系統(tǒng)實(shí)現(xiàn)的會話Bean是無狀態(tài)的。業(yè)務(wù)邏輯層結(jié)構(gòu)如圖3所示。
EJBs功能如表1。
表1
包ejb.entity | 封裝了客戶、聯(lián)系人、產(chǎn)品、商業(yè)機(jī)會及客戶服務(wù)請求等數(shù)據(jù)信息,并提供Home、Remote訪問接口。 |
包ejb.session | 封裝了系統(tǒng)所需的業(yè)務(wù)邏輯和數(shù)據(jù)操作,包括添加、查詢、更新和刪除各項信息,并提供Home、Remote訪問接口,也提供了一些方便數(shù)據(jù)操作的輔助類。 |
數(shù)據(jù)庫(Backend Tier)
利用Sun公司提供的JDBC API可以很方便地操作關(guān)系型數(shù)據(jù)庫(RDBMS),如上所述,實(shí)體Bean要與數(shù)據(jù)庫表建立一種良好的映射關(guān)系。設(shè)計數(shù)據(jù)庫時要注意主鍵值,它是惟一標(biāo)識。本系統(tǒng)數(shù)據(jù)庫共有五張表,見表2。
customer | 存儲客戶信息,設(shè)name,location,honor等字段,主鍵id。 |
linkman | 存儲聯(lián)系人信息,設(shè)birthday,custid,custname等字段,主鍵id。 |
opportunity | 存儲商業(yè)機(jī)會信息,設(shè)description,moment,status等字段,主鍵id。 |
product | 存儲產(chǎn)品信息,設(shè)style,price,unit等字段,主鍵id。 |
service | 存儲客戶服務(wù)請求信息,設(shè)product,contact等字段,主鍵id。 |
現(xiàn)在,以“創(chuàng)建客戶信息”為用例,察看整個系統(tǒng)各個模塊間的協(xié)作與實(shí)現(xiàn)。
請求參數(shù)輸入界面: CRMCustomer.java
響應(yīng)的servlet: custCreate.java
處理請求的JavaBean: CRMController.java
調(diào)用的會話bean: CRMBean.java
實(shí)體bean: CustBean.java
數(shù)據(jù)庫表: customer
顯示結(jié)果: CRMCustomer.java
在整個開發(fā)周期中,需不斷精化和細(xì)化用戶需求,改進(jìn)用例與建模,迭代構(gòu)造和測試,使系統(tǒng)趨于完善。
小結(jié)
利用Java無線應(yīng)用技術(shù),結(jié)合J2ME和J2EE平臺,可以設(shè)計并開發(fā)出健壯、高效的企業(yè)級無線應(yīng)用程序,幫助企業(yè)提升經(jīng)濟(jì)效益。現(xiàn)在,越來越多的電信廠商生產(chǎn)出性能優(yōu)越的Java手機(jī),而且在電信運(yùn)營商、電信設(shè)備制造商和應(yīng)用程序開發(fā)者之間存在著一種較好的盈利模式。我們相信Java無線應(yīng)用會有更好的發(fā)展。