今天,無線、跨平臺、以及嵌入式應(yīng)用已經(jīng)成為非常流行和時尚的技術(shù)應(yīng)用。在手機、PDA、以及其他一些智能移動設(shè)備已經(jīng)隨處可見, MICROSOFT,SYMBIAN在手機,PDA這些小型設(shè)備上的OS開發(fā)已日趨成熟的同時,用戶對于智能移動設(shè)備應(yīng)用軟件的種類、性能提出更高的要求,對于如何在這些平臺上為程序員提供良好,可移植應(yīng)用軟件的開發(fā)環(huán)境成為一個新的課題。
1、J2me以及J2me的總體架構(gòu)
J2me的誕生:我們知道SUN公司在設(shè)計java語言之初是要面向消費類電器,并將它定位于實現(xiàn)一種為嵌入式處理器編寫程序的可移植方法。SUN的工程師們帶著這個目的開發(fā)出來的JAVA語言以及虛擬機的運行機制,必然具有可以在設(shè)備間移植代碼的CPU無關(guān)性,安全性,簡潔性??梢奐AVA作為開發(fā)小型智能移動設(shè)備的開發(fā)語言在合適不過了,于是SUN公司在J2SE(JAVA 2 STANDARD EDITION)的基礎(chǔ)上為小型智能設(shè)備量身訂做了J2SE的簡化版本J2ME(Java 2 MICRO EDITION),并在1999 年 6loper Conference 上正式宣布J2ME的誕生。
J2ME的總體架構(gòu):J2ME使用配置和簡表定制 Java 運行時環(huán)境,配置將基本運行時環(huán)境定義為一組核心類和一個運行在特定類型設(shè)備上的特定 JVM,而簡表則定義了應(yīng)用程序所支持的設(shè)備類型。
配置:正如上面所說配置將基本運行時環(huán)境定義為一組核心類和一個運行在特定類型設(shè)備上的特定 JVM。當前 J2ME 主要存在兩種配置:連接設(shè)備配置 (CDC) CDC是應(yīng)用在具有較大內(nèi)存,特別是2MB以上的設(shè)備上的,CDC針對有限和間歇的無線連接設(shè)備,CDC與CVM和Foundation profile共同定義了完全的J2ME環(huán)境。連接限制設(shè)備配置 (CLDC)是針對少于512KB內(nèi)存footprint的設(shè)備的配置。CLDC采用的是KVM,它是高度優(yōu)化的JVM方式,他針對的是16比特或32比特的微處理器,160到512 KB內(nèi)存為基礎(chǔ)的低端,網(wǎng)絡(luò)連接,電池驅(qū)動的設(shè)備。這里需要說明的是,無論應(yīng)用在J2ME上的虛擬機CVM還是KVM都是J2SE虛擬機JVM的縮略版。他們之間的關(guān)系如下圖:

簡表:正如前面所講的,簡表為J2ME定義了應(yīng)用程序所支持的設(shè)備類型,它是通過向 J2ME 配置添加了特定于域的類來定義設(shè)備的某種作用的。它位于配置的頂部。J2me為CLDC主要定義了兩種簡表:MIDP(移動信息簡表)和KJAVA,支持小型設(shè)備。同時為CDC也定義了一種基礎(chǔ)表(也叫綱要簡表)主要應(yīng)用于家用電器,汽車導航系統(tǒng)這種比較大的終端。?
??? 注:CDC和CLDC目標設(shè)備的區(qū)別:?

2、J2ME-J2EE架構(gòu)的優(yōu)勢?
我們知道雖然利用J2ME可以開發(fā)一些不需要運行在無線網(wǎng)絡(luò)環(huán)境的小應(yīng)用程序(比如計算器,小游戲,日歷),但是這并不是J2ME誕生的真正意義,隨著信息社會的到來,人們對于資源需求的不斷膨脹,對于信息儲備極其有限的手機,PDA這種小型設(shè)備來說,互連網(wǎng)絡(luò)是他們獲取信息的最佳的途徑。于是人們針對這個問題研究,并制定了各種各樣的方案,這里我首推J2ME-J2EE架構(gòu)。?
關(guān)于J2EE(Java 2 Platform Enterprise Edition):J2EE是一種利用Java 2平臺來簡化企業(yè)解決方案的開發(fā)、部署和管理相關(guān)的復雜問題的體系結(jié)構(gòu)。J2EE技術(shù)的基礎(chǔ)就是核心Java平臺或Java 2平臺的標準版,J2EE不僅鞏固了標準版中的許多優(yōu)點,例如"編寫一次、隨處運行"的特性、方便存取數(shù)據(jù)庫的JDBC API、CORBA技術(shù)以及能夠在Internet應(yīng)用中保護數(shù)據(jù)的安全模式等等,同時還提供了對 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技術(shù)的全面支持。其最終目的就是成為一個能夠使企業(yè)開發(fā)者大幅縮短投放市場時間的體系結(jié)構(gòu)。有了J2EE,使得服務(wù)器端的開發(fā)有了強有力的支持。?
但是網(wǎng)絡(luò)應(yīng)用的模式有很多,為什么非要選擇J2ME+J2EE的架構(gòu)呢??
傳統(tǒng)的網(wǎng)絡(luò)開發(fā)通常采用瘦客戶端的形式,瘦客戶端是基于瀏覽器的應(yīng)用,主要使用HTML,WML,HDML。但是這種架構(gòu)需要連接到高速網(wǎng)絡(luò)才能很好的工作。這顯然不太適合無線網(wǎng)絡(luò)。憑借J2ME背后強大的JAVA技術(shù)的支持,再加上采用JAVA服務(wù)器技術(shù)J2EE作為服務(wù)端,J2ME完全可以設(shè)計出超越瘦客戶端的新的客戶端形式,即智能客戶端。?
J2ME-J2EE架構(gòu)圖示:

它的優(yōu)勢體現(xiàn)在:?
(1). 離線能力(即在設(shè)備掉線情況下仍能正常工作)?
(2).客戶端邏輯(即可以本地確認和存儲數(shù)據(jù))?
(3).異步網(wǎng)絡(luò)(即數(shù)據(jù)能導向到設(shè)備)?
(4).更好的響應(yīng)效率 ?
這里需要強調(diào)的是J2ME+J2EE的架構(gòu)是基于HTTP協(xié)議的,HTTP協(xié)議,以及HTTP協(xié)議的擴展協(xié)議HTTPS本身具有很多優(yōu)勢,在互連網(wǎng)上有很廣泛的應(yīng)用。?
擁有了以上的優(yōu)勢,J2ME+J2EE的架構(gòu)無疑為我們提供了一個很好的解決方案。?
3、J2ME-J2EE的架構(gòu)的分析和設(shè)計思路?
常用的應(yīng)用模型:隨著手機及其他小型設(shè)備的普及,我們可以看到很多基于手機的無線應(yīng)用,基于短信的居多(比如在線評球,在線竟猜,和一些在線的小游戲),顯然應(yīng)用在技術(shù)上已經(jīng)比較成熟。我們把這種模型稱為長時間離線型。它的特點在于何時在線并不影響應(yīng)用,設(shè)立更多的本地模塊,通?;诙绦诺哪J?。這種設(shè)計可以極大的降低連接成本,并且由于數(shù)據(jù)交互在后臺進行,不需要用戶在進行干預(yù)。?
與長時間離線型相對的另外一種應(yīng)用模型便是長時間連線型,顧名思義這種應(yīng)用模型需要在線狀態(tài)下運行,并且采用客戶端-服務(wù)端的運行模式,使得用戶可以實時的查詢和更新數(shù)據(jù),J2ME-J2EE的架構(gòu)通常被這種模型的設(shè)計采用,下面我簡單舉例說明一下采用J2ME-J2EE架構(gòu)實現(xiàn)的長時間應(yīng)用模型的設(shè)計過程。
(天氣情況查詢系統(tǒng))客戶段的設(shè)計:客戶端采用J2ME編寫,主要采用基于HTTP協(xié)議的javax.microedition.io.HttpConnection類來完成,手機在上網(wǎng)之后通過它可以實現(xiàn)與運行在INTERNET上的J2EE服務(wù)器的數(shù)據(jù)交換。使用它的主要函數(shù)是GetWeather(),代碼片段如下:?
public void getWeather() {……?
try {……?
URL=”www.x.com/X.JSP?Country=x”?
StringBuffer sb = new StringBuffer(URL);?
sb.append(urlEncode(postalCode.getString()));?
??????? HttpConnection conn = (HttpConnection)Connector.open(sb.toString()):?
??????? InputStream is = conn.openInputStream();//獲取輸入流?
??????? String contentType = conn.getType();?
??????? int len = (int)conn.getLength();?
??????? receivedData = new byte[len];?
??????? int nb = is.read(receivedData);//得到數(shù)據(jù)?
??????? ……}?
上面的實例是基于HTTP協(xié)議的GET請求協(xié)議,并通過OpenInputStream來獲得數(shù)據(jù)流,當然我們也可以采用POST的請求方式,我們知道POST請求的參數(shù)是存放到消息體里的,所以我們要用到OpenOutputStream來返回一個輸出流,并且采用write(“attributeA value”)將參數(shù)寫入消息體。(實際上基于J2ME的客戶端應(yīng)用主要發(fā)送HTTP的請求消息,輸出流已經(jīng)不想SOCKET編程應(yīng)用的那么頻繁,基本上只在寫入POST參數(shù)才會用到。)?
服務(wù)器的設(shè)計:服務(wù)器端用一個簡單的javaBean+JSP即可,這里就是簡單的實現(xiàn)。?
Sring postalCode = (String)request.getParameter("postalCode");?
……?
????? ResultSet rs = stmt.executeQuery(query);?
????? if (rs.next()) {?
??????? request.setAttribute ("city", rs.getString("city")?
??????? request.setAttribute ("stateprovince", rs.getString("province"));?
??????? request.setAttribute ("weather", rs.getString("weather"));?
??????? nextJSP = "/ReportWeather.jsp";?
???? ??}?
……?
rd.forward(request, response);?
當然在系統(tǒng)設(shè)計的同時,我們通常有許多因素要考慮到,是我對于這個問題的一些思路。
應(yīng)當考慮的因素:?
1.保證J2ME的應(yīng)用不會被外來的不可抗拒的因素破壞,中斷,這種因素主要來自于J2ME的設(shè)備的主要應(yīng)用(比如手機收到電話,短信),所以盡可能的采用后臺線程來管理應(yīng)用程序,避免這些因素的影響。?
2.小型設(shè)備并非采用像PC一樣的標準鍵盤,如何用小鍵盤進行準確的輸入也是應(yīng)當考慮的問題(比如采用詳細的選擇列表代替用戶的輸入)。?
3.安全性,包括數(shù)據(jù)在傳輸過程中被竊取,J2ME設(shè)備的毀壞和遺失造成的數(shù)據(jù)丟失 (我們可以對數(shù)據(jù)進行加密,并且采取措施定期的對數(shù)據(jù)備份)?
關(guān)于MIDP2。0:MIDP作為應(yīng)用在CLDC配置上的一種結(jié)構(gòu)已經(jīng)得到了日趨廣泛的應(yīng)用,MIDP2.0作為MIDP1.0的升級版本曾加了許多新的特性。包括HTTPS成為必要組件,一些包括播放聲音在內(nèi)的一些多媒體API集的引入,并且通過曾加用戶接口,對游戲編程提供了特別的支持。?
結(jié)束語?
通過上面的介紹,我們可以看到通過J2ME技術(shù)與J2EE技術(shù)的結(jié)合完全可以構(gòu)筑完備的企業(yè)級無線應(yīng)用,隨著手機,PDA為代表的小型智能設(shè)備的進一步發(fā)展,相信以J2ME為代表的JAVA技術(shù)會有更為廣闊的施展舞臺。?
參考文獻:?
1.Sun公司J2ME 網(wǎng)站 ?
2.J2ME專業(yè)開發(fā)者指南 MIDP Wiley,IS BN 0471034657?
3.sun網(wǎng)絡(luò)社區(qū) ?
