基于J2ME的防汛信息系統的研究
在本系統中,客戶(hù)端和服務(wù)器之間主要通過(guò)HTTP協(xié)議進(jìn)行通信,工作流程如下:
(1) 用戶(hù)啟動(dòng)手機上的MIDlet進(jìn)入登錄界面,輸入用戶(hù)名和密碼進(jìn)行登錄。MIDlet用Connector類(lèi)的open方法建立一個(gè)到服務(wù)器端的連接,并把這個(gè)連接強制轉換成為HttpConnection類(lèi)型。
(2) 客戶(hù)端用HttpConnection類(lèi)的openInputStream方法和openOutputStream方法來(lái)返回輸入輸出流并通過(guò)它們來(lái)發(fā)送請求和接收響應信息。
(3) 服務(wù)器端接收到客戶(hù)端的連接請求后,把它封裝成一個(gè)HttpServletRequest對象,調用相應的Servlet,通過(guò)EJB或JavaBean訪(fǎng)問(wèn)數據庫,并把處理結果返回客戶(hù)端的MIDlet。
(4) 客戶(hù)端MIDlet使用輸入流接收服務(wù)器端返回的結果,根據返回的是”station”(測站)、”person”(普通用戶(hù))還是”none”(無(wú)此用戶(hù))而在屏幕上呈現不同的界面。
(5) 登錄成功后,MIDlet重新建立HttpConnection來(lái)進(jìn)行數據更新或查詢(xún)操作。
四、技術(shù)難點(diǎn)和解決方案
4.1 用戶(hù)定制信息的接收
用戶(hù)定制的信息有兩種發(fā)送的方式:
(1)定時(shí)發(fā)送。用于把用戶(hù)定制的日常信息每天定時(shí)發(fā)送給用戶(hù)。
(2)緊急發(fā)送。當出現緊急汛情時(shí)即時(shí)把信息發(fā)送到相關(guān)的責任人。
在客戶(hù)端,對相關(guān)信息的接收是通過(guò)J2ME的PUSH注冊功能來(lái)實(shí)現的。Push技術(shù)是一種能夠使得Midlet應用程序不需要用戶(hù)的操作而自行啟動(dòng)運行的機制。在通常的網(wǎng)絡(luò )連接中,是客戶(hù)端主動(dòng)去連接服務(wù)器,服務(wù)器接受請求并把處理結果返回客戶(hù)端。而Push技術(shù)不同,它不需要應用程序通過(guò)“拉(pull)”的方式通過(guò)網(wǎng)絡(luò )取得數據,客戶(hù)端需要的數據會(huì )被主動(dòng)“推(push)”向客戶(hù)端的移動(dòng)設備。當移動(dòng)設備接收到信息時(shí),相關(guān)的Midlet會(huì )被激活并開(kāi)始運行,處理發(fā)送過(guò)來(lái)的數據。
服務(wù)器端使用Socket可以自動(dòng)向與其相聯(lián)的客戶(hù)端發(fā)送數據,這就為Push技術(shù)提供了保證。先由客戶(hù)端的 MIDlet注冊好服務(wù)類(lèi)型,地址,端口號,當服務(wù)器端檢測到有緊急情況發(fā)生或用戶(hù)定制的情況發(fā)生時(shí),就會(huì )將相應的消息通過(guò)Socket發(fā)送到客戶(hù)端,客戶(hù)端會(huì )啟動(dòng)相應的MIDlet對該消息進(jìn)行相應處理。
J2ME平臺從MIDP2.0開(kāi)始增加了對Push注冊的支持。Push機制可以通過(guò)如下兩種方式激活Midlet:一種是基于接入的網(wǎng)絡(luò )連接的,當客戶(hù)端接收到網(wǎng)絡(luò )Push來(lái)的信息后就自動(dòng)啟動(dòng)Midlet運行;另一種是基于計時(shí)器的警告通知,當。Push 注冊機制可以使MIDlet 自動(dòng)運行,運行方式有兩種:一種基于定時(shí)技術(shù),當到達特定時(shí)間,程序就會(huì )運行;另一種基于網(wǎng)絡(luò ),當設備受到網(wǎng)絡(luò )推送的信息時(shí),可以啟動(dòng)程序運行。本系統采用第一種方式來(lái)實(shí)現定制信息的發(fā)送。
要在客戶(hù)端使用Push技術(shù),必須事先進(jìn)行Push注冊。Push注冊有兩個(gè)方法:靜態(tài)注冊和動(dòng)態(tài)注冊。靜態(tài)注冊需要將 Push注冊信息添加到JAD文件中,在Midlet Suite安裝時(shí)完成注冊。靜態(tài)注冊的缺點(diǎn)是必須通過(guò)Midlet Suite安裝過(guò)程來(lái)實(shí)現,一但安裝好后就無(wú)法添加新的注冊,同時(shí)如果要取消Push注冊,也必須卸載Midlet Suite。動(dòng)態(tài)注冊是MIDlet通過(guò)Push Registry接口A(yíng)PI來(lái)實(shí)現的,可以在程序運行時(shí)添加或取消Push注冊,增加了靈活性。本文采用了動(dòng)態(tài)注冊的方法。
在動(dòng)態(tài)注冊時(shí)MIDlet需要告訴AMS它所要連接的服務(wù)器的IP地址、端口號和要啟動(dòng)的MIDlet類(lèi),實(shí)現代碼如下:
…
String midletClassName=”com.water.PushInfo”;//這是自動(dòng)運行處理數據的Midlet
String ConnectionURL =”socket://:6789”;
String AllowedSender=”*”;//*表示允許接收任意地址發(fā)送的信息
PushRegistry.registerConnection(midletClassName, ConnectionURL, AllowedSender);
…..
這樣,當AMS監測到端口號為6789的Socket服務(wù)器發(fā)送來(lái)的數據后,就會(huì )啟動(dòng)com.water包下的PushInfo來(lái)處理這些數據。
取消注冊可以使用PushRegistry.unregisterConnection(ConnectionURL)來(lái)完成。
4.2 數據庫連接池技術(shù)
本例采用了數據庫連接池技術(shù)。傳統的Web應用程序進(jìn)行數據庫操作時(shí)一般要經(jīng)過(guò)(1)建立數據庫連接;(2)進(jìn)行數據庫的增加、刪除、修改、查詢(xún)操作;(3)斷開(kāi)數據庫連接這三個(gè)步驟。這種方式有一個(gè)重要的缺點(diǎn):要為每個(gè)Web請求建立一次數據庫連接并對其進(jìn)行管理,這些操作都會(huì )耗費大量的時(shí)間和資源。數據庫連接池的基本思想是預先建立一些連接,放置在內存對象中以備使用。當程序中需要建立數據庫連接時(shí),只需從內存中取出一個(gè)來(lái)用而不用重新建一個(gè)連接。同樣,使用完畢后,只需將此連接放回到內存中即可,而連接的建立和斷開(kāi)都由連接池自身來(lái)管理。Weblogic服務(wù)器提供了圖形化的界面來(lái)建立數據庫連接池,設置比較簡(jiǎn)單。建立好數據庫連接池和數據源后,就可以在Servlet中通過(guò)JavaBean或EJB來(lái)調用,代碼如下:
…
Hashtable ht = new Hashtable();
ht.put(Context.INITIAL_CONTEXT_FACTORY,weblogic.jndi.WLInitialContextFactory);
ht.put(Context.PROVIDER_URL,t3://localhost:7001);
try
{
Context ctx=new InitialContext(ht);
DataSource ds=(DataSource)ctx.lookup(WaterJNDI);
Connection con=ds.getConnection();
…
}catch(Exception e){
…
}
…
評論