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