逢 甲 大 學
資訊工程學系專題報告
PDA 檔案備份
學生:吳健銘(四乙)
指導老師:賴坤助
中華民國九十一年十二月
目錄
圖表目錄‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.Ⅲ 摘要‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 1 第一章 導論‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 2 1.1 動機‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥. 2 1.2 目標‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥2 1.3 架構‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥3 1.4 系統開發工具與平台‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥5 1.5 為何選擇 J2ME‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥6 1.6 資料庫表格‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥6 第二章 J2ME 簡介‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥7 2.1 J2ME 程式的開發‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥9 2.2 J2ME 規格‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥10 2.3 CLDC、CDC 相關的 Profile‥‥‥‥‥‥‥‥‥‥‥‥‥ 12 2.4 MIDlet 程式結構‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥13 2.5 MIDlet 生命週期‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥13 第三章 網站使用架構背景‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥15 3.1 JSP 簡介‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 15 3.2 選用平台‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.15 3.3 相關服務‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.16 3.4 網站執行‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.17 第四章 Programming‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.20 4.1 PDA 端‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 20 4.1.1 開發工具簡介‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 20 4.1.2 程式設計簡介‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥204.1.3 程式執行相關畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥23 4.2 Server 端‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥25 4.2.1 開發工具簡介‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥25 4.2.2 程式設計簡介‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥26 4.2.3 Server 端執行畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥29 第五章 心得與結論‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥31 5.1 結論‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.31 5.2 心得‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.31 5.3 遇到的問題與解決方法‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥31 參考書目‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥.33
圖表目錄 圖 1 系統架構圖‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 3 圖 2 Connection 相關類別繼承體系‥‥‥‥‥‥‥‥‥‥‥‥‥ 4 圖 3 Server 端訊息接收相關流程‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 5 圖 4 Java 各版本關係‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 7 圖 5 Java 各版本虛擬機器架構‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 8 圖 6 Java 各版本之間關係‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 9 圖 7 J2ME 執行步驟‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 10 圖 8 CLDC 與 CDC 的範圍‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 11 圖 9 Profile、Configuration、作業系統、硬體之間關係‥‥‥ 12 圖 10 MIDlet 生命週期‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥13 圖 11 JSP 執行流程‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 15 圖 12 存取資料庫流程‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥16 圖 13 帳號註冊‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥17 圖 14 登入畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥17 圖 15 資料修改‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥18 圖 16 檔案管理畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥18 圖 17 會員基本資料畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥19 圖 18 MessageDialog 執行畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 20 圖 19 Login 畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 23 圖 20 錯誤訊息畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥23 圖 21 主選單畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥23 圖 22 Get File 執行畫面一‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥24 圖 23 Get File 執行畫面二‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥24 圖 24 List File 執行畫面一‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 24
圖 25 List File 執行畫面二‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 24 圖 26 Backup File 執行畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 25 圖 27 Delete File 執行畫面一‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 25 圖 28 Delete File 執行畫面二‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 25 圖 29 Server 端執行畫面‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 29 表 1 登入者基本資料‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 6 表 2 登入者活動紀錄‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 6 表 3 CLDC 與 CDC 最小需求配備‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 12 表 4 Profile 最小需求配備‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 13
摘要
這幾年的手持裝置迅速發展不管是手機或 PDA,功能越來越強大 和傳統的個人電腦比較起來它有以下優點: 多功能性:雖然手持裝置的各項效能、硬體都比不上 PC 或 NoteBook, 可是它的多功能性也不差,在手持裝置上的功能都是我們 日常生活都會用到的,符合我們大眾需求排除一些不必要 的東西,例如記事本、鬧鐘、計算機、遊戲、甚至有些有 數位相機、撥放影像、MP3 的功能等等…. 方便輕巧:因為手持裝置不像 NoteBook 那樣笨重攜帶起來比較方便 機動性也較高,而且它又有上述的多項功能也得我們的生 活更便利。 也因為這些原因所以我選擇了 PDA 作為這一次專題的對象,這一 次的專題分成三個部分 Palm 端、Server 端、Web 部分。各 章 節 簡 介 第一章 導論:專題動機、目標、系統架構、系統開發平台等介紹 第二章 J2ME 簡介:介紹 J2ME 的相關概念 第三章 網站使用架構背景:JSP、使用平台介紹、網站執行畫面 第四章 Programming:Client、Server 端程式簡介和相關執行畫面 第五章 結論:結論、心得、遇到的問題與解決
第一章 導論
隨著行動通訊時代的來臨,過去的桌上型個人電腦帶給人們極大 的方便和好處,可是由於體積過於龐大、笨重無法隨身攜帶使用,所 以就有了輕巧、容易攜帶、各項的功能又可符合個人需求且擁有可儲 存大量資料的行動手持裝置,如手機或 PDA。 由於手機的普及每人人手一機確實也帶給我們極大的便利,相對 的人們對於手機上的功能和需求也要求的更嚴格,因此有更多的廠商 相繼投入行動通訊裝置的生產與開發,功能也越來越強大,如有些手 機可以聽 MP3 甚至可以撥放視訊影像使我們的生活更多采多姿。 PDA 也是如此。相信在不久的將來 PDA 也可以和手機一樣普及, 因為它的可攜帶性和多功能性確實也帶給我們生活上的許多便利,而 且 PDA 擁有傳統工具的優點:例如可以當記事本、計算機、時鐘、遊 戲、收發 E-Mail、電話簿等等;卻少了傳統工具的缺點:如記事本 會掉頁,還必須要額外多帶計算機、時鐘、遊戲機所帶來的不便。 由於以上的種種可知 PDA 是未來的趨勢,所以這就是我選擇 PDA 的原因。 1.1 動 機 因為自己有在 yahoo 的網站有一個帳號,該網站都會提供一些相 關的服務如收發 E-Mail,其中還有檔案管理的部分,你可以上傳檔 案達到檔案備份的效果或者和別人共享。所以我在想是否 PDA 也可以 達到此效果,把檔案上傳在 PDA 端可以列出所有的檔案、刪除檔案、 下 command 把檔案傳到另一個 Server,以達到檔案備份的效果以提 高檔案的安全性。 1.2 目 標 1、 PDA 端能夠上傳下載檔案,還有能夠列出檔案、刪除檔案、 下 command 把檔案備份到另一個 Server 2、 Server 端能夠接受 Client 端的請求、管理所有的帳號如刪 除某一人的帳號或者刪除檔案、新增新的帳號、查看某一帳號 的個人紀錄等 3、在 Web 方面,有帳號註冊者可以上網登入到檔案管理員管理 自己的檔案而有管理員帳號的人登入可以管理帳號如刪除帳號1.3 架 構 PC 端 網站 註冊 相關查詢 服務 登入 PDA 端 Server1 Server2 登入 下載 備份 備份檔案 查詢 圖1 系統架構圖
Connection
Stream
ConnectionNoifiter
InputConnection OutputConnection Datagram Connection StreamConnection Content Connection Client 端 : 因為需要對外界溝通,所以連線是由 Connector 類別的 open() 方法所開始,我使用 Socket 方法和外界溝通所以在 Connector.open() 之中使用 Socket 當作通訊協定。如果 Connector.open() 與伺服器 連線成功,Connector.open()會傳回被上轉型之後的 StreamConnection 物件。 程式碼為: StreamConnection con=(StreamConnection)Connector.open(“socket://127.0.0.1:8 0”); 其他相關的連線功能他們的繼承體系如下: 在利用 StreamConnection 的 openOutputStream 開啟輸出資料 流,才能傳送命令給伺服器,送出命令之後,要利用StreamConnection 的 openInputStream 開啟輸出資料流,才能接收伺服器傳送過來的資 料 Server 端 :
Server 端的部分是利用 ServerSocket 類別來產生一個 Socket 傾聽 port number 是否有請求進來,程式碼為 serverSocket=new ServerSocket(port);在利用 ServerSocket 類別的 accept()方法來 接收請求,回傳 Socket 類別。程式碼為 Socket
ServerSocket=new ServerSocket Note:Listenning to the port
Socket
newConnection=serverSocket.accept( )
Note:Accept a request
ServerThread t=new ServerThread (newConnection)
New Thread(t).start(); Note:create a thread
newConnection=serverSocket.accept();每接收一個請求就產生一 個 Thread 來作相關應的請求服務,程式碼為 ServerThread t=new ServerThread(newConnection); new Thread(t).start(); 相關流程架構: request Server 端還會連到資料庫的部分需先載入 JDBC 的 driver,程式 碼為 Class.forName("org.gjt.mm.mysql.Driver");在連線到資料庫 作相關的資料存取,程式碼為 Connection conn=null; conn=DriverManager.getConnection(mysql,p); 1. 4 系 統 開 發 工 具 及 平 台
Palm 端:因為我是使用 Java(J2ME)語言在移植到 PDA 上,所以開
發工具為 J2ME Wireless Toolkit,轉換成 Palm 執行檔的 工具為 MIDP for Palm OS,Java Virtual Machine- KVM
Server 端:開發工具為 Java 2 SDK1.4.0 利用 JDBC 連線到資料庫,
而資料庫的部分是使用 MySQL 3.23,平台為 Windows2000
網 站 :使用 JSP 的技術來作網頁的設計,平台為 Windows2000
1.5 為 何 選 擇 J2ME
陸陸續續有許多的手持裝置支援 Java 程式,不管是手機或者是
PDA,也由於 Java 可以在不同平台上執行(只要有符合規格的 Java Virtual Machine),移植性相當高,相對也減輕程式設計師的負擔, 這也是我選擇 J2ME 的原因。 1.6 資 料 庫 表 格 登入者基本資料: 紀錄登入者活動: 名稱 MySql 型態 描述 id varchar(15) 使用者 ID password varchr(20) 使用者 pass name varchar(20) 名字 tel varchar(15) 電話 email varchar(20) 電子郵件 名稱 MySql 型態 敘述 id varchar(15) 登入者 ID op_code varchar(2) 登入者做的動 作 time 時間 時間 num varchar(3) 流水號 表1 登入者基本資料 表2 登入者活動紀錄
第二章 J2ME 簡介
Java 規格之中有一組所謂的核心類別函式庫(Core Class,即 java.*),在核心類別之外還有所謂的擴充類別函式庫(Extended Class,即 javax.*)。根據對這兩種類別所支援的程度,Sun Microsystems 進而區分出四種不同的 java 版本,如圖所示: J2EE J2SE J2ME 上圖只是針對各種不同 Java 版本所支援之核心類別函式庫的範 圍來作描述,並無法針對這些版本所支援的擴充類別函式庫做說明。 另外,圖也說明了這些版本所支援的 Java 基本型別(primitive type,即 boolean、byte、short、int、long、float、double 這些 型別)之範圍。同心圓的越外面,所支援的核心類別函式庫就越完整。 反之,位於同心圓內部的 Java 版本,所支援的就只是核心類別函式 庫的子集合,而且越往裡面,所支援的核心類別函式庫子集合就越 小。同理,越在同心圓的外部,所支援的 Java 基本型別就越少。
J2SE(Java 2 Standard Edition)定位在用戶端的(client-side) 程式的應用上。從 J2SE 往外延伸,其外頭的同心圓為 Java 2 Enterprise Edition(J2EE),此版本除了支援所有的標準核心類別 函式庫之外,而且還增加了許多支援企業內部使用的擴充類別函式 庫,比方說支援 Servlet/JSP 的 javax.servlet.*類別函式庫、支援 Enterprise Java Bean 的 java.ejb.*類別函式庫。當然,J2EE 必定 支援所有的 Java 基本型別。J2EE 定位在伺服器端(server-side) 程式的應用上。
從 J2SE 往內看,首先會看到 Java 2 Micro Edition(J2ME), 它所支援的只有標準核心類別函式庫的子集合,比方說 J2ME CLDC 的
Java2 Enter pise Editio n Java2 Stand ard Editio n Java TV API RMI Profil e Fou ndat ion Prof ile Pers onal Prof ile MID Profil e Java2 CDC Java2 CLDC Java Card Tec Java Phon e PDA Profil e Java Language Hotspot VM KVM Card VM 規格之中,只支援 java.lang.*、java.io.*、以及 java.util.*這些 類別函式庫。J2ME 加入了一些支援嵌入式系統的擴充類別函式庫, 如 javax.microedition.io.*類別函式庫。然而,此版本並不支援所 有的 Java 基本型別,就標準 J2ME CLDC 的參考實作,也就是能在 PalmOS 上執行的 KVM(K Virtual Machine)來說,它就不支援屬於 浮點數的 Java 基本型別。J2ME 定位在嵌入式系統的應用上。
在以上每一種 Java 版本之中,都有屬於他們自己的虛擬機器 (VM),在 J2ME 的世界裡,期標準參考實作-KVM 及 CVM,KVM 用來 執行下載至較低階(硬體功能不強)的嵌入式裝置上的 Spotlet 或 MIDlet,而 CVM 用來執行較高階(硬體功能相對較強)的嵌入式裝置 上的 Java 程式;在 J2SE 與 J2EE 之中,有 Classic VM 與 HotSpot VM 負責執行 Java Applet、Java Servlet 或 Java Application。因此 所有 Java 版本與其所依據的虛擬機器所堆積起來的架構如下圖:
以上所敘述的虛擬機器都只是 Sun Microsystems 根據 Java 虛擬
機器規格的標準實作,實際上還有許多家公司都有自己所開發出來的 虛擬機器,而且也符合 Java 虛擬機器的規格。
JVM (CVM)
(Subset)
J2ME J2EE J2SE 2.1 J2ME 程 式 的 開 發 各種不同的 Java 版本,在其支援的核心類別函式庫之完整性以 及所支援的 Java 基本型別這兩件事情上都有所差異,但這些版本之 間的關係如下圖: 也就是說,不管開發的是企業所使用的 Java 程式、嵌入式裝置 上執行的 Java 程式、瀏覽器上執行的 Applet,或是在 PC 甚執行的 應用程式。都必須在電腦上先安裝 J2SE,然後在安裝各種版本的核 心類別函式庫以及額外的擴充類別函式庫,如此才能成功開發各種不 同目的的 Java 程式。 J2SE 所提供的編譯器(javac.exe)可以幫助我們編譯各種不同 平台上的 Java 程式,而 J2SE 所提供的 Java 虛擬機器(java.exe) 則可以幫助我們在 PC 上先行測試這些程式執行的結果的正確與否。 在不同版本的開發套件中,有些會內附檢查器(hecker)或者預先審 核器(preverifier),這兩個工具可以幫助將程式放在目標平台之前 先做好檢查和預先審核的工作。 檢查器會幫你找出類別檔之中不合目標平台規格的部分,並提醒 你這些地方可能無法在目標平台上執行。因此只要有檢查器的協助, 大致上就可以確定程式可以符合目標平台的規定並順利執行。 預先審核器除了做檢查器做的工作之外,還有一項額外的工作, 就是減輕目標平台上虛擬機器的負擔,傳統的 Java 程式 (Application、Servlet、Applet)的之中,為了安全上的考量,任 何進入執行環境的類別檔,都必須先經過 Byte Code 審核器(Byte
Test.java Test.class Test.class 類別載入器 輕量Byte Code 審核器 KVM Runtime 硬體設施 code verifier)的驗證,以防止程式在傳送途中遭到惡意的修改, 而使得 Java 程式在執行時對系統有不良影響。經過審核之後,該類 別檔才能開始被 Java 虛擬機器所執行。 如果這個審核的動作在一般的 PC 上執行,速度倒是還能夠接 受,可是一旦放到如 Palm 或是手機這些 CPU 較慢、記憶體也較少的 機器上面就顯得十分吃力了。為了節省寶貴的 CPU 運算時間和電力, 因此,在程式產生能夠讓某些特定平台執行的類別檔之前,程式必須 先在 PC 上使用預先審核器做一些前置的審核工作,預先審核器會再 類別檔之中加入一些特殊標記或符號。如此一來,當這些程式放到目 標平台上執行時,就可以大幅減少再目標平台上做審核時的時間,藉 而加速程式的啟動及執行速度。因此在 J2ME 之下的程式(Spotlet、 MIDlet),其執行步驟如下圖: 編譯 執行 預先審核 從上圖就可以看到,因為預先審核的關係,執行時 Byte Code 審 核器的工作就變少了,也因此從程式載入到開始執行之間的時間因而 縮短。 2.2 J2ME 規 格 J2ME 將所有的嵌入式裝置大體上區分為兩種:一種是運算功能 有限、電力供應也有限的嵌入式裝置(如 PDA、手機);另外一種則 是運算能力相對較佳、並在電力供應上相對比較充足的嵌入式裝置 圖7 J2ME 執行步驟
(如電冰箱、冷氣機)。因為這兩種型態的嵌入式裝置,所以 Java 引 入了一個叫做 Configuration 的概念,然後把上數運算功能有限、電 力有限的嵌入式裝置定義在 Connected Limited Device
Configuration(CLDC)規格之中;而另一種裝置則規範為 Connected Device Configuration(CDC)規格。也就是說,J2ME 先把所有的嵌 入式裝置利用 Configuration 的概念區隔成兩種抽象的型態。如果引 入之前描述的各種 Java 版本對於核心類別函式庫與擴充類別函式庫 的概念,則 CLDC 與 CDC 的範圍如圖: J2SE J2ME CDC J2ME CLDC 可以把 Configuration 當作是 J2ME 對於兩種類型嵌入式裝置的 規格,而這些規格之中定義了這些裝置至少要符合的運算能力、供電 能力、記憶體大小等規範,同時也定了一組在這些裝置上執行的 Java 程式所使用的類別函式庫、這些規範之中所定義的類別函式庫為 Java 標準核心類別函式庫的子集合以及與該型態裝置特性相符的擴充類 別函式庫。 區分出兩種主要的 Configuration 之後,J2ME 接著在定義出 Profile 的概念。Profile 式架構在 Configuration 之上的規格。之 所以有 Profile 的概念,是為了要更明顯的區分出各種嵌入式裝置上 Java 程式該如何開發以及它們應該具有哪些功能。因此 Profile 之 中定義了與特定嵌入式裝置非常相關的擴充類別函式庫,而 Java 程 式在各種嵌入式裝置上的使用者介面該如何呈現就是定義在 Profile 裡頭。Profile 之中所定義的擴充類別函式庫是根據底層 Configuration 內所定義的核心類別函式庫所建立。 嵌入式系統上的 Java 程式、Profile、Configuration、虛擬機 圖8 CLDC 與 CDC 的範圍
Profile Application OEM Application OEM Specific API Configuration/VM Profile 作業系統 硬體 器、作業系統、以及實體裝置之間的關係圖如下: 2.3 CLDC、 CDC 相 關 的 Profile Sun Microsystems 官方將所有的嵌入式裝置區分為 CLDC 與 CDC 兩種,這兩種 Configuration 之中定義的皆為這兩種型態的嵌入式裝 置要執行 Java 程式所需要的最小配備需求,表是 CLDC 與 CDC 各自的 最小配備需求: 建構在 Configuration之上的 Profile 之中也定義了特定種類嵌 入式裝置的最小配備需求,Profile 是建構在 Configuration 之上 的,所以配備需求不可能比 Configuration 要低 配備\Configuration CLDC CDC
RAM RAM 與 ROM 再加上快閃記憶
體要為 128k-512k
大於等於 256k
ROM RAM 與 ROM 加上快閃記憶體
要為 128k-512k 大於等於 512k 電源 通常是使用電池,所以電 源有限 不設限 圖9 Profile、Configuration、作業系統、硬體之間關係 表3 CLDC 與 CDC 最小需求配備
停止狀態 (Paused) 運作狀態 (Action) 消滅狀態 (Destroyed) 2.4 MIDlet 程 式 結 構
要寫能夠在手機或 PDA 上能執行的 Java MIDlet 必須要繼承自 javax.microedtion.midlet.MIDlet 類別,該類別中定義了三個抽象 方法他們分別為:startApp()--至運作狀態、pauseApp()--至停 止狀態、destoryApp()--至消滅狀態,MIDlet 中不應該有 public static void main(String[] args)這個方法。
2.5 MIDlet 生 命 週 期
當 MIDlet 成功的初始化之後,就開始展開了它的生命週期。 MIDlet 的生命週期完全由 Java Application Manager 控制,也就是 說,當 MIDlet 要從一個狀態變成另一個狀態時,Java Application Manager 會呼叫對應的函式。MIDlet 生命週期如下圖: 呼叫 MIDlet
startApp() pauseApp() destroyApp()
destroyApp()
配備\Profile Personal Profile MIDP
RAM 至少 1MB RAM 或 ROM 至少要為 512k
ROM 至少 2.5MB RAM 或 ROM 至少要為 512k
電源 不設限 通常是使用電池,所以電 力有限 網路連線能力 部分功能 具有低頻寬的無線通訊能 力 其他 要額外的 RAM 或 ROM 提供 應用程式執行 要有額外的 RAM 或 ROM 提 供應用程式執行並儲存資 料 表4 Profile 最小需求配備 圖10 MIDlet 生命週期
只有當 Java Application Manager 認為 MIDlet 的狀態必須改變 時,才會呼叫圖中的相關函式,這些函式呼叫成功之後,Java Application Manager 才會改變 MIDlet 的狀態,只要 MIDlet 進入了 毀滅狀態,就無法再回頭。
網頁瀏覽器
第三章 網站使用架構背景
3.1 JSP 簡 介
JavaServer Pages,簡稱 JSP,是一種用來建立互動性、動態網 站的技術,其以 Java 程式語言為基礎。JSP 執行在 Server 端,可以 結合 HTML 網頁,它也包含 Scripting Language 如 JavaScript。 JSP 的執行流程:
HTTP 要求
HTTP 回應
網頁瀏覽器向 Server 要求服務,Servlet Container(擁有網頁伺服 器的功能)會載入相關的 JSP 和程式碼執行並產生結果。
JSP 程式是以「*.jsp」結尾,而嵌在 HTML 的部分是用「 <% %>」 包起來的。JSP 的特點為如果使用「檢視原始碼」或「FrontPage」 並不會顯示其原始碼,User 端只看的到 HTML 碼。
要編輯 JSP 程式可以使用一般的文字編輯器就可以了,有了工具 就需要架設 Web Server。Web Server 可以架設在以下的環境: Windows95/98/2000 和 Unix 系統。所需要安裝的體:Java 體開發工 具套件「Java 2 SDK」、Servlet Container「Tomcat」,在不同的環 境下只要作相關的設定即可。
3.2 選 用 平 台
本次專題選用 Windows2000 平台、Java 2 SDK 1.4.0、Tomcat 4.1.12,因為使用者需要先註冊後在登入所以使用者相關的資訊都會 紀錄到 DataBase,還需要一個 SQL Server,我選用的是 MySQL Server。我選用的原因是 MySQL 可以在許多平台上運作,容量小,功 能精簡,所以資料庫伺服器主機的硬體要求也相對降低,所以 MySQL Server 完全符合 Java 跨平台的要求。 在存取資料庫方面則是透過 JDBC 連到資料庫,使用 JDBC 只要載 Servlets JSPs Servlet Container HTML 檔案 圖11 JSP 執行流程
Client 端提出要求 JSP 應用程式 載入JDBC Connection 物件 存取各項資料 入 Driver 而且要取得 Connection 連線物件。存取資料庫的架構: 3.3 相 關 服 務 本網站主要是針對有註冊的一般使用者和管理者。 帳號管理功能:只要管理者輸入管理帳號和密碼就會出現另一個視 窗,要求輸入使用者帳號,如果帳號不存在就會出現新增帳號的網 頁,帳號存在就會出現相關的基本資料,如果要刪除帳號只要按下「刪 除帳號」即可。 檔案管理:這一個功能主要是針對一般使用,使用者只要輸入正確的 帳號和密碼就會出現檔案管理員的網頁,使用者可以上傳和刪除檔案 時間標示:每一個使用者的檔案都會標示最後一次修改的時間 圖12 存取資料庫流程
登入者修改基本資料:如果登入者有發現資料錯誤,可以做資料修改 3.4 網 站 執 行 就如同現在許多的網站一樣,必須先上網註冊一個帳號,有了帳 號就可以提供相關的服務,註冊完後 Server 端會以 User 的帳號名稱 產生一個相對應的資料夾提供檔案存放空間,以下為註冊的登入畫 面: 註冊之後就可以登入相關的服務,以下為登入的畫面: 圖13 帳號註冊 圖14 登入畫面
如果使用者有要修改資料,就按下修改資料的服務,資料修改的 登入畫面如下:
如果使用者輸入正確的帳號就進入檔案管理的登入畫面,使用者 可以做相關的檔案管理,如檔案的上傳、檔案的刪除,和檔案的相關 訊息如 Last Modified time、file Size 等,檔案管理登入畫面如下:
圖15 資料修改
如果是管理者輸入管理者帳號,輸入正確後就會出現另一個視 窗,要求管理者輸入要管理的帳號,如果該帳號不存在,就會出現註 冊登入畫面來增加新的帳號;如果該帳號存在,就會出現會員基本資 料畫面,管理者可以查看該會員基本資料或刪除該名會員,達到帳號 管理的目的。會員基本資料畫面如下: 圖17 會員基本資料畫面
第四章 Programming
4.1 PDA 端
4.1.1 開 發 工 具 簡 介
J2ME Wireless Toolkit 是 Sun 所發表的官方版 MIDlet 開發工
具,該開發工具並不是一個整合式的工具,他僅能做程式的編譯、包 裝、預先審查等,功能很陽春,但是版本也在不斷的更新與改版。如 果較喜歡整合的開發環境(IDE),那 Forte for Java CE(Community Edition)就提供一個這樣的整合開發環境。Forte for Java CE 把 Wireless Toolkit 整合到一個特殊的模組裡,使得開發完整 MIDP 的 整個系列動作不用離開整合開發環境就可以完成。
4.1.2 程 式 設 計 簡 介 自 訂 類 別
自訂交談視窗類別:public abstract class Dialog 定義介面:public interface DialogListener
{
void dialogDismissed(Dialog Dialog,int code); } 判斷視窗:ConfirmationDialog 訊息視窗:MessageDialog 說明:ConfirmationDialog、MessageDialog 分別繼承 Dialog 類別,ConfirmationDialog 視窗的出現是當要做一個決定的 時候,如是否要刪除一個檔案的視窗會出現 Yes or No 來做 確定;而 MessageDialog 視窗是當有錯誤訊息的時候,如登 入密碼輸入錯誤等 ConfirmationDialog、MessageDialog 分 別執行的畫面如下: 圖18 MessageDialog 執行畫面
相 關 程 式 碼
方法:public void login(String id,String pass)
public void login(String id,String pass) { try { StreamConnection conn=(StreamConnection)Connector.open(url); DataOutputStream out=new DataOutputStream(conn.openOutputStream()); out.write(Integer.toString(Login).getBytes()); out.write("&".getBytes()); out.write(id.getBytes()); out.write("&".getBytes()); out.write(pass.getBytes()); out.write("\n".getBytes()); out.flush(); DataInputStream in=new DataInputStream(conn.openInputStream()); 、、、、 }
說明:public void login(String id,String pass)方法主要 是做 Login 的動作,Connector.open(url)跟 Server 做 聯繫,打開輸出資料流,送出 Login 的 op code 和 id、 password,並開啟輸入資料流,接收相關訊息判斷是否 login 成功。
方法:public void list(String path,String url)
public void list(String path,String url) { try { StreamConnection conn=(StreamConnection)Connector.open("socket://"+url+":4004" ); OutputStream out=conn.openOutputStream(); out.write(Integer.toString(ListFile).getBytes()); out.write("&".getBytes()); out.write(path.getBytes());
說明:public void list(String path,String url)方法主要 是列出使用者有哪些檔案,根據使用者輸入的 url 並跟該 Server 取得連線,傳出 ListFile 的 op code 和檔案的路 徑名稱之後,開啟輸入資料流取得相關訊息。
方法:public void back_file(String ser1,String ser2,String filename)
public void back_file(String ser1,String ser2,String filename) { try { StreamConnection conn=(StreamConnection)Connector.open("socket://"+ser1+":4004"); OutputStream out=conn.openOutputStream(); out.write(Integer.toString(BackupFile).getBytes()); out.write("&".getBytes()); out.write(ser2.getBytes()); out.write("&".getBytes()); out.write(filename.getBytes()); out.write("\n".getBytes()); out.flush(); 、、、 }
說明:使用者輸入 Server1 和 Server2 的 url 之後,並取得和 Server1 的連線,送出 Server2 的 url 和要備份的檔案 或資料夾名稱,Server1 在根據 Server2 的位置取得和 Server2 的連線,在送出檔案以達到備份的效果。
方法:public void delete_file(String filename,String url)
public void delete_file(String filename,String url) { try { StreamConnection conn=(StreamConnection)Connector.open(url); OutputStream out=conn.openOutputStream(); out.write(Integer.toString(deletefile).getBytes()); out.write("&".getBytes());
out.write(id.getBytes()); out.write("&".getBytes()); out.write(filename.getBytes()); out.write("\n".getBytes());
說明:public void delete_file(String filename,String url) 方法是根據使用者輸入 Server1 或 Server2 的 url 並取 得連線,送出 deletefile 的 op code 和要刪除的檔案或 資料夾名稱。 4.1.3 程 式 執 行 相 關 畫 面 使 用 者 登 入 程式執行時會要求使用者做登入的動作,如果輸入是正確的 ID 和 Password 就能進入主選單的畫面,進而做相關的服務;如果輸入 不正確的 ID 和 password Server 端會做 Check 的動作並做出回應, 進而出現 Error 的畫面,相關畫面如下圖:
主 選 單
如果使用者輸入正確的 ID 和 Password 就會進入主選單的畫面, 進而進行相關的服務選項,主選單畫面如下:
相 關 服 務 Get File
當按下 Get File 時就會出現另一個畫面,要求使用者輸入
Server1 或 Server2 的 url,如果在該空間有存放檔案就會顯示所有 的檔案,使用者就可以選擇要下的檔案,執行畫面如下圖:
List File
當按下 List File 時就會出現另一個畫面,要求使用者輸入 Server1 或 Server2 的 url,如果在該空間有存放檔案就會顯示所有 的檔案或資料夾,執行畫面如下圖:
Backup File
當按下 Backup File 時就會出現另一個畫面,要求使用者輸入 Server1 和 Server2 的 url,並且輸入要備份到 Server2 的檔案或資
圖22 Get File 執行畫面一 圖23 Get File 執行畫面二
料夾,執行畫面如下圖:
Delete File
當按下 Delete File 時就會出現另一個畫面,要求使用者輸入 Server1 或 Server2 的 url,並且輸入要刪除的檔案或資料夾,執行 畫面如下圖: 4.2 Server 端 4.2.1 開 發 工 具 簡 介 Server 端的開發工具為 J 2 SDK1.4.0,在視窗設計方面是使用 Java Swing 的視窗設計技術,因為使用者需要先註冊後在登入所以 使用者相關的資訊都會紀錄到 DataBase,還需要一個 SQL Server, 我選用的是 MySQL Server,本次專題選用 Windows2000 平台。我選
圖26 Backup File 執行畫面
用的原因是 MySQL 可以在許多平台上運作,容量小,功能精簡,所以 資料庫伺服器主機的硬體要求也相對降低,所以 MySQL Server 完全 符合 Java 跨平台的要求,在存取資料庫方面則是透過 JDBC。 4.2.2 程 式 設 計 簡 介 程 式 使 用 類 別 類別:ServerSocket 程式碼:serverSocket=new ServerSocket(port);
說明:利用 ServerSocket 類別來產生一個 Socket 傾聽 port number 是否有請求進來。在利用 ServerSocket 類別的 accept()方法來接收請求,程式碼為 Socket newConnection=serverSocket.accept()。 類別:Class 程式碼:Class.forName("org.gjt.mm.mysql.Driver"); 說明:Server 端還會連到資料庫的部分需先載入 JDBC 的 driver,程式碼為 Class.forName("org.gjt.mm.mysql.Driver");在連線 到資料庫作相關的資料存取,程式碼為 Connection conn=null; conn=DriverManager.getConnection(mysql,p); 相 關 程 式 碼 接 收 請 求
public void acceptConnection()
{ try { serverSocket=new ServerSocket(port); }catch(IOException e){ System.err.println("ServerSocket failure"); e.printStackTrace(); System.exit(0); } while(true)
{ try { Socket newConnection=serverSocket.accept(); mess.append("accepted connection"); mess.append("\n");
ServerThread t=new ServerThread(newConnection); new Thread(t).start();
}catch(IOException e){
System.err.println("server accept failed"); }
} }
說明:利用 ServerSocket 類別來產生一個 Socket 傾聽 port number 是否有請求進來。在利用 ServerSocket 類別的 accept()方法來接收請求,因為 Server 端要處理多人的 連線,所以每接收到請求就產生一個 Thread 來做相對應 的服務,程式碼為 ServerThread t=new ServerThread(newConnection); new Thread(t).start(); 相 對 應 的 服 務
class ServerThread implements Runnable
{
private Socket socket; private DataInputStream in; private DataOutputStream out; boolean exit=false; int op; int ch; String files=""; String Dir=""; String content=""; String inf=""; String ID=""; String PASSWORD=""; String ser="";
public ServerThread(Socket socket) {
this.socket=socket; }
public void run() { try { in=new DataInputStream(new BufferedInputStream(socket.getInputStream())); out=new DataOutputStream(new BufferedOutputStream(socket.getOutputStream())) ; }catch(IOException e){ } try { while((ch=in.read())!=-1) { if(ch=='&') break; content=content+(char)ch; } op=Integer.parseInt(content.toString()); switch(op) { case Login: 、、、break; case ListFile: 、、、 break; case GetFile: 、、、break; case BackupFile: 、、、break; case deletefile: 、、、break; case Exit: 、、、 } }catch(IOException e){ } try{ //mess.append("closing socket"); in.close(); out.close();
socket.close(); }catch(IOException e){ } } 說明:接收到使用者的請求之後產生相對應的 Thread,在抓取 傳過來的 op code 程式碼為 op=Integer.parseInt(content.toString());利用 switch-case(op)判斷請求哪一項服務,在依相關的 服務做相對應的處理。 4.2.3 Server 端 執 行 畫 面 說明:程式執行畫面的左上方 Connected User 是當有使用者連 線登入到該 Server 時,該名使用者會出現在劃框裡,而 執行畫面的右上方 user information 是顯示登入使用者 的基本資料,只要在 ID 的欄位輸入登入者的 ID,按下 中間 User Inf 的按鈕就會出現該名登入者的基本資料; 按下中間 User File 的按鈕就會在右下方的 user file folder 顯示登入者的檔案,如果要刪除登入者的檔案, 只要在中間的欄位輸入檔案或資料夾名稱,按下 Delete
File 的按鈕,就能刪除檔案,而左下方的 Message 是顯 示登入者所做的一切活動。
第五章 結論
5.1 結 論
由於 Java 可以在不同的平台上執行,可攜帶性相當高,陸陸續
續有許多手持裝置會相繼支援,也因如此,這一次的專題利用 Java 在 PDA 端開發出檔案備份程式,利用 PDA 端 Socket 連線到 Server1, 做相關的服務,如下載、查詢、傳檔案到 Server2 以達到檔案備份的 目的。使用者也可以利用 PC 端連線到網站做相關的查詢、上下傳檔 案,而管理者也可做到帳號管理的目的。
在 Server 端則是利用 ServerSocket 類別的方法 Accept(),來 接收來自 Client 的請求,並產生 Thread 來做相對應的要求,Server2 則接收 Server1 傳送過來的檔案做備份。 5.2 心 得 這一次的專題其實對我來說是一個很難忘的經驗,因為要一個人 包辦全部的事情,不管在資料的收集整理或寫程式等等,說實在也漫 累人的,不過也學到了漫多的知識,如對 J2ME 的了解,也知道一份 報告寫作過程,如何去排版去修改使得報告更好更完整、程式的開 發、和環境的架設等等,對我來說是一次寶貴的經驗。在這也感謝老 的執導,我覺得賴老師對於一件事情很有它自己的看法,讓我覺得原 來同一件事情也可以從另一個方向看過來,這對我來說是很有幫助 的。 5.3 遇 到 的 問 題 與 解 決 方 法 這一次專題比較有問題的地方是在檔案傳輸部分,不論是在
Client 對 Server 之間的傳送或者是 Server1 備份檔案到 Server2, 都花較長的時間在上頭。
在 Client 端對 Server 之間的傳送,因為 J2ME 沒有提供對 File 處理的相關函式,File inputStream、File OutputStream 或者 File 的類別,所以一直無法對裝置上的檔案做處理,下載下來的檔案也一 直無法儲存,我在相關的書籍和網站也都沒找到解答,在我和老師討 論的結果之下決定利用 Client 端對 Server 端下達指令把檔案傳到 Server2 也能達到檔案備份的效果,而下載檔案的部分我則把它顯示 出來,如下載一個圖形檔並把圖形顯示出。而 Server 之間的檔案傳 送讓我覺得較困難的地方是要傳送整個資料夾,因為它整個的結構是 一個樹狀,要知道資料夾底下還有哪些檔案有可能還有另一個資料 夾,所以要記住整個的結構並把它傳送到 Server2,我也花了一段時
間,我實做了兩個方法 getFileList(path)與 getFileObjList (path),相關的程式碼如下:
public String[] getFileList(String path) {
String[] f1;
File f=new File(path); f1=f.list();
return f1; }
public File[] getFileObjList(String path) {
File[] f1;
File f=new File(path); f1=f.listFiles(); return f1;
}
利用 getFileList 從樹狀結構的最上層往下找,找出每一層有哪 些檔案和資料夾,getFileObjList 回傳該層所有檔案的 File 物件, 在利用 File 類別的 isFile()和 isDirectory()方法來判斷哪些 是檔案哪些是資料夾,並把檔案傳送出去,在繼續的往下一層進行, 就完成檔案的備份。
參 考 書 目
【1】 王森編著,Java 手機程式設計入門,知城出版
【2】 Paul Tremblett,譯者:賴俊安、王人傑,開發無線 Java 應用 程式,麥格羅希爾國際出版公司
【3】 Jayson Falkner、Ben Galbraith、Romin Irani、Casey Kochmer、 Meeraj Moidoo Kunnumpurath、Sathya Narayana Panduranga、 Krishnaraj Perrumal、John Timney,譯者:夏雲浩、林清烈, JSP 教學手冊 BEGINNING Jsp Web Development,碁? 資訊股份 有限公司
【4】 http://forum.java.sun.com/wireless/ Java Wireless Technology Discussions
【5】 黃國欽 著,Java 資料庫程式設計入門與實作,松崗
【6】 http://www.ericgiguere.com/microjava/ 【7】 http://www.javamobile.org/