J2ME編程實踐之聯(lián)網(wǎng)開發(fā)1_JSP教程
推薦:對SUN定義的四種JDBC驅(qū)動程序標準簡介SUN定義的四種JDBC驅(qū)動程序標準: Type1 JDBC-ODBC橋 作為JDK1.1后的一部分,是sun.jdbc.odbc包的一部分 ApplicationJDBC-ODBC Bridge(Type1 jdbc driver)-JDBC-ODBC LibraryODBC D
由于無線設(shè)備所能支持的網(wǎng)絡(luò)協(xié)議非常有限,僅限于HTTP,Socket,UDP等幾種協(xié)議,不同的廠家可能還支持其他網(wǎng)絡(luò)協(xié)議,但是,MIDP 1.0規(guī)范規(guī)定,HTTP協(xié)議是必須實現(xiàn)的協(xié)議,而其他協(xié)議的實現(xiàn)都是可選的。 因此,為了能在不同類型的手機上移植,我們盡量采用HTTP作為網(wǎng)絡(luò)連接的首選協(xié)議,這樣還能重用服務(wù)器端的代碼。但是,由于HTTP是一個基于文本的效率較低的協(xié)議,因此,必須仔細考慮手機和服務(wù)器端的通信內(nèi)容,盡可能地提高效率。
對于MIDP應(yīng)用程序,應(yīng)當盡量做到:
1.發(fā)送請求時,附加一個User-Agent頭,傳入MIDP和自身版本號,以便服務(wù)器能識別此請求來自MIDP應(yīng)用程序,并且根據(jù)版本號發(fā)送相應(yīng)的相應(yīng)。
2.連接服務(wù)器時,顯示一個下載進度條使用戶能看到下載進度,并能隨時中斷連接。
3.由于無線網(wǎng)絡(luò)連接速度還很慢,因此有必要將某些數(shù)據(jù)緩存起來,可以存儲在內(nèi)存中,也可以放到RMS中。
對于服務(wù)器端而言,其輸出響應(yīng)應(yīng)當盡量做到:
1. 明確設(shè)置Content-Length字段,以便MIDP應(yīng)用程序能讀取HTTP頭并判斷自身是否有能力處理此長度的數(shù)據(jù),如果不能,可以直接關(guān)閉連接而不必繼續(xù)讀取HTTP正文。
2. 服務(wù)器不應(yīng)當發(fā)送HTML內(nèi)容,因為MIDP應(yīng)用程序很難解析HTML,XML雖然能夠解析,但是耗費CPU和內(nèi)存資源,因此,應(yīng)當發(fā)送緊湊的二進制內(nèi)容,用DataOutputStream直接寫入并設(shè)置Content-Type為application/octet-stream。
3. 盡量不要重定向URL,這樣會導(dǎo)致MIDP應(yīng)用程序再次連接服務(wù)器,增加了用戶的等待時間和網(wǎng)絡(luò)流量。
4. 如果發(fā)生異常,例如請求的資源未找到,或者身份驗證失敗,通常,服務(wù)器會向瀏覽器發(fā)送一個顯示出錯的頁面,可能還包括一個用戶登錄的Form,但是,向MIDP發(fā)送錯誤頁面毫無意義,應(yīng)當直接發(fā)送一個404或401錯誤,這樣MIDP應(yīng)用程序就可以直接讀取HTTP頭的響應(yīng)碼獲取錯誤信息而不必繼續(xù)讀取相應(yīng)內(nèi)容。
5. 由于服務(wù)器的計算能力遠遠超過手機客戶端,因此,針對不同客戶端版本發(fā)送不同響應(yīng)的任務(wù)應(yīng)該在服務(wù)器端完成。例如,根據(jù)客戶端傳送的User-Agent頭確定客戶端版本。這樣,低版本的客戶端不必升級也能繼續(xù)使用。
MIDP的聯(lián)網(wǎng)框架定義了多種協(xié)議的網(wǎng)絡(luò)連接,但是每個廠商都必須實現(xiàn)HTTP連接,在MIDP 2.0中還增加了必須實現(xiàn)的HTTPS連接。因此,要保證MIDP應(yīng)用程序能在不同廠商的手機平臺上移植,最好只使用HTTP連接。雖然HTTP是一個基于文本的效率較低的協(xié)議,但是由于使用特別廣泛,大多數(shù)服務(wù)器應(yīng)用的前端都是基于HTTP的Web頁面,因此能最大限度地復(fù)用服務(wù)器端的代碼。只要控制好緩存,仍然有不錯的速度。
SUN的MIDP庫提供了javax.microediton.io包,能非常容易地實現(xiàn)HTTP連接。但是要注意,由于網(wǎng)絡(luò)有很大的延時,必須把聯(lián)網(wǎng)操作放入一個單獨的線程中,以避免主線程阻塞導(dǎo)致用戶界面停止響應(yīng)。事實上,MIDP運行環(huán)境根本就不允許在主線程中操作網(wǎng)絡(luò)連接。因此,我們必須實現(xiàn)一個靈活的HTTP聯(lián)網(wǎng)模塊,能讓用戶非常直觀地看到當前上傳和下載的進度,并且能夠隨時取消連接。
一個完整的HTTP連接為:用戶通過某個命令發(fā)起連接請求,然后系統(tǒng)給出一個等待屏幕提示正在連接,當連接正常結(jié)束后,前進到下一個屏幕并處理下載的數(shù)據(jù)。如果連接過程出現(xiàn)異常,將給用戶提示并返回到前一個屏幕。用戶在等待過程中能夠隨時取消并返回前一個屏幕。
我們設(shè)計一個HttpThread線程類負責在后臺連接服務(wù)器,HttpListener接口實現(xiàn)Observer(觀察者)模式,以便HttpThread能提示觀察者下載開始、下載結(jié)束、更新進度條等。HttpListener接口如下:
public interface HttpListener { |
實現(xiàn)HttpListener接口的是繼承自Form的一個HttpWaitUI屏幕,它顯示一個進度條和一些提示信息,并允許用戶隨時中斷連接:
public class HttpWaitUI extends Form implements CommandListener, HttpListener { |
HttpThread是負責處理Http連接的線程類,它接受一個URL和HttpListener:
class HttpThread extends Thread { |
使用GET獲取內(nèi)容
我們先討論最簡單的GET請求。GET請求只需向服務(wù)器發(fā)送一個URL,然后取得服務(wù)器響應(yīng)即可。在HttpThread的run()方法中實現(xiàn)如下:
public void run() { // 返回響應(yīng)大小,或者-1如果大小無法確定 // 響應(yīng)大小未知,設(shè)定一個固定大小的緩沖區(qū) |
當下載完畢后,HttpWaitUI就獲得了來自服務(wù)器的數(shù)據(jù),要傳遞給下一個屏幕處理,HttpWaitUI必須包含對此屏幕的引用并通過一個setData(DataInputStream input)方法讓下一個屏幕能非常方便地讀取數(shù)據(jù)。因此,定義一個DataHandler接口:
public interface DataHandler { |
HttpWaitUI響應(yīng)HttpThread的onFinish事件并調(diào)用下一個屏幕的setData方法將數(shù)據(jù)傳遞給它并顯示下一個屏幕:
public void onFinish(byte[] buffer, int size) { Displayable object cannot handle data."); |
由于無線設(shè)備所能支持的網(wǎng)絡(luò)協(xié)議非常有限,僅限于HTTP,Socket,UDP等幾種協(xié)議,不同的廠家可能還支持其他網(wǎng)絡(luò)協(xié)議,但是,MIDP 1.0規(guī)范規(guī)定,HTTP協(xié)議是必須實現(xiàn)的協(xié)議,而其他協(xié)議的實現(xiàn)都是可選的。 因此,為了能在不同類型的手機上移植,我們盡量采用HTTP作為網(wǎng)絡(luò)連接的首選協(xié)議,這樣還能重用服務(wù)器端的代碼。但是,由于HTTP是一個基于文本的效率較低的協(xié)議,因此,必須仔細考慮手機和服務(wù)器端的通信內(nèi)容,盡可能地提高效率。
對于MIDP應(yīng)用程序,應(yīng)當盡量做到:
1.發(fā)送請求時,附加一個User-Agent頭,傳入MIDP和自身版本號,以便服務(wù)器能識別此請求來自MIDP應(yīng)用程序,并且根據(jù)版本號發(fā)送相應(yīng)的相應(yīng)。
2.連接服務(wù)器時,顯示一個下載進度條使用戶能看到下載進度,并能隨時中斷連接。
3.由于無線網(wǎng)絡(luò)連接速度還很慢,因此有必要將某些數(shù)據(jù)緩存起來,可以存儲在內(nèi)存中,也可以放到RMS中。
對于服務(wù)器端而言,其輸出響應(yīng)應(yīng)當盡量做到:
1. 明確設(shè)置Content-Length字段,以便MIDP應(yīng)用程序能讀取HTTP頭并判斷自身是否有能力處理此長度的數(shù)據(jù),如果不能,可以直接關(guān)閉連接而不必繼續(xù)讀取HTTP正文。
2. 服務(wù)器不應(yīng)當發(fā)送HTML內(nèi)容,因為MIDP應(yīng)用程序很難解析HTML,XML雖然能夠解析,但是耗費CPU和內(nèi)存資源,因此,應(yīng)當發(fā)送緊湊的二進制內(nèi)容,用DataOutputStream直接寫入并設(shè)置Content-Type為application/octet-stream。
3. 盡量不要重定向URL,這樣會導(dǎo)致MIDP應(yīng)用程序再次連接服務(wù)器,增加了用戶的等待時間和網(wǎng)絡(luò)流量。
4. 如果發(fā)生異常,例如請求的資源未找到,或者身份驗證失敗,通常,服務(wù)器會向瀏覽器發(fā)送一個顯示出錯的頁面,可能還包括一個用戶登錄的Form,但是,向MIDP發(fā)送錯誤頁面毫無意義,應(yīng)當直接發(fā)送一個404或401錯誤,這樣MIDP應(yīng)用程序就可以直接讀取HTTP頭的響應(yīng)碼獲取錯誤信息而不必繼續(xù)讀取相應(yīng)內(nèi)容。
5. 由于服務(wù)器的計算能力遠遠超過手機客戶端,因此,針對不同客戶端版本發(fā)送不同響應(yīng)的任務(wù)應(yīng)該在服務(wù)器端完成。例如,根據(jù)客戶端傳送的User-Agent頭確定客戶端版本。這樣,低版本的客戶端不必升級也能繼續(xù)使用。
MIDP的聯(lián)網(wǎng)框架定義了多種協(xié)議的網(wǎng)絡(luò)連接,但是每個廠商都必須實現(xiàn)HTTP連接,在MIDP 2.0中還增加了必須實現(xiàn)的HTTPS連接。因此,要保證MIDP應(yīng)用程序能在不同廠商的手機平臺上移植,最好只使用HTTP連接。雖然HTTP是一個基于文本的效率較低的協(xié)議,但是由于使用特別廣泛,大多數(shù)服務(wù)器應(yīng)用的前端都是基于HTTP的Web頁面,因此能最大限度地復(fù)用服務(wù)器端的代碼。只要控制好緩存,仍然有不錯的速度。
SUN的MIDP庫提供了javax.microediton.io包,能非常容易地實現(xiàn)HTTP連接。但是要注意,由于網(wǎng)絡(luò)有很大的延時,必須把聯(lián)網(wǎng)操作放入一個單獨的線程中,以避免主線程阻塞導(dǎo)致用戶界面停止響應(yīng)。事實上,MIDP運行環(huán)境根本就不允許在主線程中操作網(wǎng)絡(luò)連接。因此,我們必須實現(xiàn)一個靈活的HTTP聯(lián)網(wǎng)模塊,能讓用戶非常直觀地看到當前上傳和下載的進度,并且能夠隨時取消連接。
一個完整的HTTP連接為:用戶通過某個命令發(fā)起連接請求,然后系統(tǒng)給出一個等待屏幕提示正在連接,當連接正常結(jié)束后,前進到下一個屏幕并處理下載的數(shù)據(jù)。如果連接過程出現(xiàn)異常,將給用戶提示并返回到前一個屏幕。用戶在等待過程中能夠隨時取消并返回前一個屏幕。
我們設(shè)計一個HttpThread線程類負責在后臺連接服務(wù)器,HttpListener接口實現(xiàn)Observer(觀察者)模式,以便HttpThread能提示觀察者下載開始、下載結(jié)束、更新進度條等。HttpListener接口如下:
public interface HttpListener { |
實現(xiàn)HttpListener接口的是繼承自Form的一個HttpWaitUI屏幕,它顯示一個進度條和一些提示信息,并允許用戶隨時中斷連接:
public class HttpWaitUI extends Form implements CommandListener, HttpListener { |
HttpThread是負責處理Http連接的線程類,它接受一個URL和HttpListener:
class HttpThread extends Thread { |
使用GET獲取內(nèi)容
我們先討論最簡單的GET請求。GET請求只需向服務(wù)器發(fā)送一個URL,然后取得服務(wù)器響應(yīng)即可。在HttpThread的run()方法中實現(xiàn)如下:
public void run() { // 返回響應(yīng)大小,或者-1如果大小無法確定 // 響應(yīng)大小未知,設(shè)定一個固定大小的緩沖區(qū) |
當下載完畢后,HttpWaitUI就獲得了來自服務(wù)器的數(shù)據(jù),要傳遞給下一個屏幕處理,HttpWaitUI必須包含對此屏幕的引用并通過一個setData(DataInputStream input)方法讓下一個屏幕能非常方便地讀取數(shù)據(jù)。因此,定義一個DataHandler接口:
public interface DataHandler { |
HttpWaitUI響應(yīng)HttpThread的onFinish事件并調(diào)用下一個屏幕的setData方法將數(shù)據(jù)傳遞給它并顯示下一個屏幕:
public void onFinish(byte[] buffer, int size) { Displayable object cannot handle data."); |
分享:JSP頁面自動生成html頁面或任何格式頁面先建立一個模本頁面:template.htm ###title### ###title### 作者:###author### ###content###=========================================再寫一個JSP頁面: buildhtml.jsp
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-J2ME編程實踐之聯(lián)網(wǎng)開發(fā)1
。