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