J2ME的重要功能簡(jiǎn)介1_JSP教程
推薦:J2ME及其基本慨念如果您曾經(jīng)http://www.javasoft.com ;網(wǎng)站上查詢有關(guān)Java 2 Micro Edition 的資料,十之八九會(huì)被一大堆的技術(shù)名詞搞的一頭霧水。 什么 KVM ,什么CLDC 、CDC 、MIDP ,后面面還冒出了P
持久數(shù)據(jù)和記錄管理系統(tǒng)( Record Management System,簡(jiǎn)稱 RMS)
MIDP提供在移動(dòng)設(shè)備上存儲(chǔ)持久數(shù)據(jù)的支持,并且 MID簡(jiǎn)表還特意規(guī)定兼容的移動(dòng)設(shè)備必須提供至少 8KB的非動(dòng)態(tài)內(nèi)存用于數(shù)據(jù)存儲(chǔ)的用途,時(shí)式上,大多數(shù)的 MIDP Java設(shè)備提供的空間比這要求多得多。這就允許一個(gè)midlet充份利用應(yīng)用程序的持久數(shù)據(jù)。對(duì)于有 Java 2標(biāo)準(zhǔn)版開發(fā)經(jīng)驗(yàn)的開發(fā)者,應(yīng)該注意這種數(shù)據(jù)存儲(chǔ)能力與標(biāo)準(zhǔn)的 Java有區(qū)別。J2ME記錄管理系統(tǒng) ( RMS )允許數(shù)據(jù)流被儲(chǔ)存并且在一個(gè)記錄基礎(chǔ)上訪問數(shù)據(jù)。由應(yīng)用程序開發(fā)者把每個(gè)記錄解析到字段水平。RMS程序包內(nèi)部的接口支持一個(gè)應(yīng)用程序定義的基礎(chǔ)上的比較與檢索功能。
一、javax.microedition.rms程序包
通過 javax.microedition.rms包訪問 J2ME記錄管理系統(tǒng),這個(gè)包包括一個(gè)類, RecordStore,和好幾個(gè)有用的接口 (在下列表格中描述 ):
| 接口 | 描述 |
| RecordComparator | 一個(gè)接口,定義一個(gè)比較機(jī)制,比較兩個(gè)記錄(以一個(gè)實(shí)現(xiàn)定義的方式)看它們是否匹配或它們的相對(duì)排序次序是什么樣的。 |
| RecordEnumeration | 一個(gè)接口,一個(gè)雙向的紀(jì)錄模擬器 |
| RecordFilter | 一個(gè)接口,定義了一個(gè)過濾器用于檢查一個(gè)記錄,看其是否匹配 (基于一種應(yīng)用程序定義的標(biāo)準(zhǔn) )。 |
| RecordListener | 一個(gè)監(jiān)聽者接口,從一個(gè)記錄存儲(chǔ)器中接受記錄更改/添加/刪除事件。 |
這些接口對(duì)于實(shí)現(xiàn)自定義搜索和檢索功能很有用,這些接口中使用的最多的就是 RecordEnumeration。這個(gè)接口從 RecordStore.enumerateRecords()方法調(diào)用中返回并且被用于遍歷一組從記錄存儲(chǔ)器中返回的記錄。它包含 nextRecord()、 previousRecord()、 numRecords()和 hasNextElement()等方法。
二、使用RecordStore類訪問記錄存儲(chǔ)
RecordStore類是開發(fā)者開發(fā)基層 RMS的接口,記錄儲(chǔ)存是在一個(gè)平臺(tái)--midlet環(huán)境依賴的方式--上創(chuàng)建的。信息的實(shí)際的位置和存儲(chǔ)細(xì)節(jié)應(yīng)用程序開發(fā)者其實(shí)并不知道,記錄存儲(chǔ)可以使用一種簡(jiǎn)單的命名規(guī)則來訪問:名稱最多可以到32個(gè)Unicode字符長(zhǎng)度,區(qū)分大小寫和必須在一個(gè) midlet套件內(nèi)唯一。在一個(gè) midlet套件內(nèi)的所有 midlet都有讀/寫一個(gè)記錄存儲(chǔ)的權(quán)限,只要它們知道正確的名稱。一旦這個(gè) midlet套件被從該設(shè)備上刪除,所有與這個(gè)套件關(guān)聯(lián)的記錄存儲(chǔ)也將被刪除。
比如說,為了打開一個(gè)名為 TestRecordSet的記錄存儲(chǔ),你可以調(diào)用 RecordStore.openRecordStore()方法。這個(gè)方法使用兩個(gè)參數(shù):一個(gè)字符串,表示記錄存儲(chǔ)的名稱;一個(gè)布爾值,如果為真的話,就會(huì)在紀(jì)錄存儲(chǔ)不存在時(shí)創(chuàng)建一個(gè)。我們使下列方法調(diào)用創(chuàng)建新的 TestRecordSet記錄存儲(chǔ):
| RecordStore rs = null; rs = RecordStore.openRecordStore("TestRecordSet", true); |
記錄存儲(chǔ)被創(chuàng)建好后,我們可以通過調(diào)用 RecordStore.addRecord()方法來向這個(gè)記錄存儲(chǔ)添加數(shù)據(jù)。addRecord()接受三個(gè)參數(shù):
| 參數(shù) | 描述 |
| byte[] data | 一個(gè)儲(chǔ)存在記錄中的字節(jié)數(shù)據(jù)數(shù)組,通過 java.io.ByteArrayOutputStream和 java.io.DataOutputStream類把數(shù)據(jù)添加到這個(gè)字節(jié)數(shù)組。 |
| int offset | 進(jìn)入這個(gè)記錄第一個(gè)關(guān)聯(lián)字節(jié)數(shù)據(jù)緩沖區(qū)的索引。 |
| int numBytes | 用于記錄的數(shù)據(jù)緩沖區(qū)的字節(jié)數(shù) |
一旦成功完成 addRecord()調(diào)用 ,這個(gè)方法就返回一個(gè)整數(shù)指定這個(gè)記錄在記錄存儲(chǔ)中的標(biāo)識(shí)號(hào)。 RecordStore還規(guī)定另外一個(gè)數(shù)據(jù)編輯方法,包括 setRecord()和 deleteRecord(),但是我在例子中不會(huì)使用它們。
三、構(gòu)建一個(gè)用于J2ME設(shè)備的通訊錄
這個(gè)例子構(gòu)造一個(gè)基本的通訊錄應(yīng)用程序,使用它用戶就可以從一個(gè)移動(dòng)設(shè)備上查看聯(lián)絡(luò)資料�,F(xiàn)在我只介紹從本地設(shè)備中存儲(chǔ)的數(shù)據(jù)中讀出相關(guān)的聯(lián)絡(luò)資料,在本文稍后的部分,你將看到如何使用J2ME網(wǎng)絡(luò)功能從一個(gè) Web服務(wù)器取回?cái)?shù)據(jù)文件!用戶將能查看一個(gè)地址列表和從這個(gè)列表選擇一個(gè)地址。為了實(shí)現(xiàn)這個(gè)目標(biāo),我們要?jiǎng)?chuàng)建兩個(gè)類,從用戶界面邏輯中把數(shù)據(jù)存取邏輯分開的: AddressDB類封裝所有的 RMS代碼; AddressBookMIDLet類封裝 GUI代碼。AddressDB類的代碼如下:
| import javax.microedition.rms.*;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; public class AddressDB { private static RecordStore rs = null; public AddressDB() { try { rs = RecordStore.openRecordStore("addressbook", true); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public void addAddress(String Name, String Address) { ByteArrayOutputStream os = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(os); try { output.writeUTF(Name "," Address); } catch (IOException e) { System.out.println(e); e.printStackTrace(); } byte[] b = os.toByteArray(); try { rs.addRecord(b, 0, b.length); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public static String getName(int index) { int counter = 1; int commalocation = 0; String name = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); name = strTemp.substring(2, commalocation); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return name; } public static String getAddress(int index) { int counter = 1; int commalocation = 0; String address = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); address = strTemp.substring(commalocation 1); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return address; } public static int recordCount() { int count = 0; try { count = rs.getNumRecords(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return count; } } |
AddressDB類包含好幾個(gè) public訪問方法,它們都對(duì)來自外部調(diào)用者的訪問隱藏記錄存儲(chǔ)的細(xì)節(jié)。AddressDB()構(gòu)造程序調(diào)用 RecordStore.openRecordStore(),正如前面討論的那樣。我也創(chuàng)建了四個(gè)助手方法用于訪問基層記錄存儲(chǔ): recordCount()、 getAddress()、 getName()和 addAddress()。注意,在本例子中addAddress()方法只是在 name/address字段之間放了一個(gè)逗號(hào)。同樣地, getAddress()和getName()從記錄存儲(chǔ)中取回 name/address字段。
持久數(shù)據(jù)和記錄管理系統(tǒng)( Record Management System,簡(jiǎn)稱 RMS)
MIDP提供在移動(dòng)設(shè)備上存儲(chǔ)持久數(shù)據(jù)的支持,并且 MID簡(jiǎn)表還特意規(guī)定兼容的移動(dòng)設(shè)備必須提供至少 8KB的非動(dòng)態(tài)內(nèi)存用于數(shù)據(jù)存儲(chǔ)的用途,時(shí)式上,大多數(shù)的 MIDP Java設(shè)備提供的空間比這要求多得多。這就允許一個(gè)midlet充份利用應(yīng)用程序的持久數(shù)據(jù)。對(duì)于有 Java 2標(biāo)準(zhǔn)版開發(fā)經(jīng)驗(yàn)的開發(fā)者,應(yīng)該注意這種數(shù)據(jù)存儲(chǔ)能力與標(biāo)準(zhǔn)的 Java有區(qū)別。J2ME記錄管理系統(tǒng) ( RMS )允許數(shù)據(jù)流被儲(chǔ)存并且在一個(gè)記錄基礎(chǔ)上訪問數(shù)據(jù)。由應(yīng)用程序開發(fā)者把每個(gè)記錄解析到字段水平。RMS程序包內(nèi)部的接口支持一個(gè)應(yīng)用程序定義的基礎(chǔ)上的比較與檢索功能。
一、javax.microedition.rms程序包
通過 javax.microedition.rms包訪問 J2ME記錄管理系統(tǒng),這個(gè)包包括一個(gè)類, RecordStore,和好幾個(gè)有用的接口 (在下列表格中描述 ):
| 接口 | 描述 |
| RecordComparator | 一個(gè)接口,定義一個(gè)比較機(jī)制,比較兩個(gè)記錄(以一個(gè)實(shí)現(xiàn)定義的方式)看它們是否匹配或它們的相對(duì)排序次序是什么樣的。 |
| RecordEnumeration | 一個(gè)接口,一個(gè)雙向的紀(jì)錄模擬器 |
| RecordFilter | 一個(gè)接口,定義了一個(gè)過濾器用于檢查一個(gè)記錄,看其是否匹配 (基于一種應(yīng)用程序定義的標(biāo)準(zhǔn) )。 |
| RecordListener | 一個(gè)監(jiān)聽者接口,從一個(gè)記錄存儲(chǔ)器中接受記錄更改/添加/刪除事件。 |
這些接口對(duì)于實(shí)現(xiàn)自定義搜索和檢索功能很有用,這些接口中使用的最多的就是 RecordEnumeration。這個(gè)接口從 RecordStore.enumerateRecords()方法調(diào)用中返回并且被用于遍歷一組從記錄存儲(chǔ)器中返回的記錄。它包含 nextRecord()、 previousRecord()、 numRecords()和 hasNextElement()等方法。
二、使用RecordStore類訪問記錄存儲(chǔ)
RecordStore類是開發(fā)者開發(fā)基層 RMS的接口,記錄儲(chǔ)存是在一個(gè)平臺(tái)--midlet環(huán)境依賴的方式--上創(chuàng)建的。信息的實(shí)際的位置和存儲(chǔ)細(xì)節(jié)應(yīng)用程序開發(fā)者其實(shí)并不知道,記錄存儲(chǔ)可以使用一種簡(jiǎn)單的命名規(guī)則來訪問:名稱最多可以到32個(gè)Unicode字符長(zhǎng)度,區(qū)分大小寫和必須在一個(gè) midlet套件內(nèi)唯一。在一個(gè) midlet套件內(nèi)的所有 midlet都有讀/寫一個(gè)記錄存儲(chǔ)的權(quán)限,只要它們知道正確的名稱。一旦這個(gè) midlet套件被從該設(shè)備上刪除,所有與這個(gè)套件關(guān)聯(lián)的記錄存儲(chǔ)也將被刪除。
比如說,為了打開一個(gè)名為 TestRecordSet的記錄存儲(chǔ),你可以調(diào)用 RecordStore.openRecordStore()方法。這個(gè)方法使用兩個(gè)參數(shù):一個(gè)字符串,表示記錄存儲(chǔ)的名稱;一個(gè)布爾值,如果為真的話,就會(huì)在紀(jì)錄存儲(chǔ)不存在時(shí)創(chuàng)建一個(gè)。我們使下列方法調(diào)用創(chuàng)建新的 TestRecordSet記錄存儲(chǔ):
| RecordStore rs = null; rs = RecordStore.openRecordStore("TestRecordSet", true); |
記錄存儲(chǔ)被創(chuàng)建好后,我們可以通過調(diào)用 RecordStore.addRecord()方法來向這個(gè)記錄存儲(chǔ)添加數(shù)據(jù)。addRecord()接受三個(gè)參數(shù):
| 參數(shù) | 描述 |
| byte[] data | 一個(gè)儲(chǔ)存在記錄中的字節(jié)數(shù)據(jù)數(shù)組,通過 java.io.ByteArrayOutputStream和 java.io.DataOutputStream類把數(shù)據(jù)添加到這個(gè)字節(jié)數(shù)組。 |
| int offset | 進(jìn)入這個(gè)記錄第一個(gè)關(guān)聯(lián)字節(jié)數(shù)據(jù)緩沖區(qū)的索引。 |
| int numBytes | 用于記錄的數(shù)據(jù)緩沖區(qū)的字節(jié)數(shù) |
一旦成功完成 addRecord()調(diào)用 ,這個(gè)方法就返回一個(gè)整數(shù)指定這個(gè)記錄在記錄存儲(chǔ)中的標(biāo)識(shí)號(hào)。 RecordStore還規(guī)定另外一個(gè)數(shù)據(jù)編輯方法,包括 setRecord()和 deleteRecord(),但是我在例子中不會(huì)使用它們。
三、構(gòu)建一個(gè)用于J2ME設(shè)備的通訊錄
這個(gè)例子構(gòu)造一個(gè)基本的通訊錄應(yīng)用程序,使用它用戶就可以從一個(gè)移動(dòng)設(shè)備上查看聯(lián)絡(luò)資料。現(xiàn)在我只介紹從本地設(shè)備中存儲(chǔ)的數(shù)據(jù)中讀出相關(guān)的聯(lián)絡(luò)資料,在本文稍后的部分,你將看到如何使用J2ME網(wǎng)絡(luò)功能從一個(gè) Web服務(wù)器取回?cái)?shù)據(jù)文件!用戶將能查看一個(gè)地址列表和從這個(gè)列表選擇一個(gè)地址。為了實(shí)現(xiàn)這個(gè)目標(biāo),我們要?jiǎng)?chuàng)建兩個(gè)類,從用戶界面邏輯中把數(shù)據(jù)存取邏輯分開的: AddressDB類封裝所有的 RMS代碼; AddressBookMIDLet類封裝 GUI代碼。AddressDB類的代碼如下:
| import javax.microedition.rms.*;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; public class AddressDB { private static RecordStore rs = null; public AddressDB() { try { rs = RecordStore.openRecordStore("addressbook", true); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public void addAddress(String Name, String Address) { ByteArrayOutputStream os = new ByteArrayOutputStream(); DataOutputStream output = new DataOutputStream(os); try { output.writeUTF(Name "," Address); } catch (IOException e) { System.out.println(e); e.printStackTrace(); } byte[] b = os.toByteArray(); try { rs.addRecord(b, 0, b.length); } catch (RecordStoreException e) { System.out.println(e); e.printStackTrace(); } } public static String getName(int index) { int counter = 1; int commalocation = 0; String name = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); name = strTemp.substring(2, commalocation); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return name; } public static String getAddress(int index) { int counter = 1; int commalocation = 0; String address = null; try { RecordEnumeration enumRec = rs.enumerateRecords(null, null, false); while ((counter <= index) && (enumRec.hasNextElement())) { String strTemp = new String(enumRec.nextRecord()); commalocation = strTemp.indexOf(','); address = strTemp.substring(commalocation 1); counter ; } } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return address; } public static int recordCount() { int count = 0; try { count = rs.getNumRecords(); } catch (Exception e) { System.out.println(e); e.printStackTrace(); } return count; } } |
AddressDB類包含好幾個(gè) public訪問方法,它們都對(duì)來自外部調(diào)用者的訪問隱藏記錄存儲(chǔ)的細(xì)節(jié)。AddressDB()構(gòu)造程序調(diào)用 RecordStore.openRecordStore(),正如前面討論的那樣。我也創(chuàng)建了四個(gè)助手方法用于訪問基層記錄存儲(chǔ): recordCount()、 getAddress()、 getName()和 addAddress()。注意,在本例子中addAddress()方法只是在 name/address字段之間放了一個(gè)逗號(hào)。同樣地, getAddress()和getName()從記錄存儲(chǔ)中取回 name/address字段。
分享:J2ME基礎(chǔ)知識(shí)一、J2ME中需要的Java基礎(chǔ)知識(shí) 現(xiàn)在有大部分人,都是從零開始學(xué)J2ME的,學(xué)習(xí)J2ME的時(shí)候,總是從Java基礎(chǔ)開始學(xué)習(xí),而且現(xiàn)在講Java基礎(chǔ)的書籍中都是以J2SE來講基礎(chǔ),這就給學(xué)習(xí)造成
- jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
- JSP指令元素(page指令/include指令/taglib指令)復(fù)習(xí)整理
- JSP腳本元素和注釋復(fù)習(xí)總結(jié)示例
- JSP FusionCharts Free顯示圖表 具體實(shí)現(xiàn)
- 網(wǎng)頁模板:關(guān)于jsp頁面使用jstl的異常分析
- JSP頁面中文傳遞參數(shù)使用escape編碼
- 基于jsp:included的使用與jsp:param亂碼的解決方法
- Java Web項(xiàng)目中連接Access數(shù)據(jù)庫的配置方法
- JDBC連接Access數(shù)據(jù)庫的幾種方式介紹
- 網(wǎng)站圖片路徑的問題:絕對(duì)路徑/虛擬路徑
- (jsp/html)網(wǎng)頁上嵌入播放器(常用播放器代碼整理)
- jsp下顯示中文文件名及絕對(duì)路徑下的圖片解決方法
- 相關(guān)鏈接:
- 教程說明:
JSP教程-J2ME的重要功能簡(jiǎn)介1
。