周 永 岳 靜
文章編號:1672-5913(2009)02-0127-03
摘要:本文講述了在面向?qū)ο缶幊陶Z言Java的教學(xué)中,如何通過使用有效的教學(xué)方法和技巧,讓學(xué)生從理論上能夠很好地理解三層架構(gòu),從實踐上能夠很好地運用三層架構(gòu)進行網(wǎng)絡(luò)及數(shù)據(jù)庫程序開發(fā)。
關(guān)鍵詞:Java教學(xué);三層架構(gòu);網(wǎng)絡(luò)程序
中圖分類號:G642
文獻標識碼:B
Java是近年來非常流行的編程語言,其安全性和可移植性是兩個最大的優(yōu)點,并且是純粹的面向?qū)ο笳Z言。因為Java語言的實用和受歡迎程度,越來越多的高校都選擇了Java這門編程語言給學(xué)生講授。雖然Java摒棄了C和C++語言中一些復(fù)雜的語法格式,不少人認為它是簡單的,但實際上,對于沒有面向?qū)ο罄碚摰膶W(xué)生,仍然需要花費比較多的時間才能入門。筆者已連續(xù)七年從事Java教學(xué),并在教學(xué)中不斷地探索和總結(jié),找出了一些很好的、能引導(dǎo)學(xué)生進入Java殿堂的方法。下面以Java教學(xué)中較困難的三層架構(gòu)為例進行說明。
1概述
三層架構(gòu)是目前流行的架構(gòu)設(shè)計模式,它由表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層三個層次結(jié)構(gòu)組成。通常情況下我們所說的三層架構(gòu),實際上并不是指確定的數(shù)值“三”,三代表“多”,三層架構(gòu)實際上叫做多層架構(gòu)。在本文中,只論述真正只有三層的架構(gòu),即“客戶端—中間層服務(wù)—后臺數(shù)據(jù)庫服務(wù)器”這樣的架構(gòu),主要探討在Java這門特定的語言中如何更好地向?qū)W生傳授三層架構(gòu)的編程理念與方法。
2讓學(xué)生從感性上認識三層架構(gòu)
Java是面向?qū)ο蟮恼Z言,但很多教師在教學(xué)的時候卻忽略了他們“面向的對象”,即坐在教師面前的學(xué)生,不注意因材施教。如果是對于已經(jīng)具有面向?qū)ο笏枷氲膶W(xué)生,在講解很多的內(nèi)容時可以比較輕松的帶過;但對于初次碰到面向?qū)ο缶幊陶Z言的學(xué)生,在講授過程中,教師必須要讓他們先理解面向?qū)ο?,然后才能講在Java中的對象是怎么樣的。同樣的道理,在進行三層架構(gòu)編程的教學(xué)時,如果學(xué)生連三層架構(gòu)都認識不清,如何能學(xué)好這方面的編程呢?
教師首先可以通過“問答式教學(xué)”讓學(xué)生了解,傳統(tǒng)的兩層架構(gòu)的缺點??梢赃@樣引導(dǎo)學(xué)生:將大家已經(jīng)編寫好的訪問數(shù)據(jù)庫的程序,轉(zhuǎn)換成Applet在網(wǎng)頁中運行。已知在本地計算機測試能夠成功運行,那么,當(dāng)把Applet傳到Web服務(wù)器上,其他的用戶通過你編寫的網(wǎng)頁能否正常的訪問數(shù)據(jù)庫呢?學(xué)生思考一下便知道,在本地計算機上能夠成功是因為正確的配置了ODBC數(shù)據(jù)源。但是,瀏覽網(wǎng)頁的用戶并沒有相應(yīng)的配置數(shù)據(jù)源,也沒有訪問數(shù)據(jù)庫的驅(qū)動程序。在這些計算機上,就無法連接到后臺數(shù)據(jù)庫。
教師在講授比較復(fù)雜的內(nèi)容的時候,最好不要先講一大堆理論,而是最好先讓學(xué)生建立一種感性上的認識。教師要么通過生動的語言,要么通過形象的比喻,讓學(xué)生建立感性認識。對于三層架構(gòu),可以這樣比喻:兩層架構(gòu)是學(xué)生直接把作業(yè)交給教師;三層架構(gòu)是學(xué)生把作業(yè)交給課代表,之后由課代表交給教師。在兩層的情形中,每一個學(xué)生都要知道老師的辦公室在什么地方;而在三層的情形中,普通學(xué)生無需知道老師的辦公室在什么地方,只需課代表知道就可以了。
3讓學(xué)生從理論上認識三層架構(gòu)
在傳統(tǒng)的兩層架構(gòu)中,只有客戶端和后臺數(shù)據(jù)庫,這就要求兩點:一是客戶端必須具有數(shù)據(jù)訪問的引擎,這樣才能連接數(shù)據(jù)庫;二是每一個客戶端都需要知道后臺數(shù)據(jù)庫的位置。而對于三層架構(gòu),客戶端把數(shù)據(jù)發(fā)送到中間層服務(wù)器,中間層服務(wù)器再負責(zé)和后臺數(shù)據(jù)庫之間的數(shù)據(jù)傳遞。顯然地,三層模型具有很大的優(yōu)點。對客戶端而言,它不需要數(shù)據(jù)訪問引擎,它也不需要知道后臺數(shù)據(jù)庫在什么地方。客戶只需要知道中間層服務(wù)器在什么地方就可以了。這種實現(xiàn)方案,實際上提高了系統(tǒng)的安全性:對客戶端而言,服務(wù)器是隱藏的,客戶不知道服務(wù)器的具體位置。圖1是三層架構(gòu)程序的示意圖:
在讓學(xué)生從總體上了解了三層架構(gòu)之后,接下來,需要講解和三層架構(gòu)編程相關(guān)的一些概念。學(xué)生必須掌握這些知識,才能進行后續(xù)的實際編程。要給學(xué)生講解的幾個概念是:協(xié)議、套接字、IP地址和端口。
協(xié)議:當(dāng)計算機之間進行通訊的時候,需要遵循一定的規(guī)則。數(shù)據(jù)以包的形式從一臺機器發(fā)送到另一臺。這些規(guī)則管理數(shù)據(jù)的打包、數(shù)據(jù)傳輸速度,以及重新創(chuàng)建數(shù)據(jù)將其恢復(fù)成原始形式。這些規(guī)則被稱為網(wǎng)絡(luò)協(xié)議。網(wǎng)絡(luò)協(xié)議是通過網(wǎng)絡(luò)進行通訊的系統(tǒng)所遵循的一系列規(guī)則和慣例。網(wǎng)絡(luò)協(xié)議如TCP/IP、UDP、Apple Talk和NetBEUI。Java提供了一個豐富的、支持網(wǎng)絡(luò)的類庫,這些類使得應(yīng)用程序能方便地訪問網(wǎng)絡(luò)資源。Java提供了對用戶報文協(xié)議(UDP)及傳輸控制協(xié)議/因特網(wǎng)協(xié)議(TCP/IP)的支持。
套接字:傳輸控制協(xié)議(TCP)提供了一條可靠的、點對點的通訊通道,客戶機/服務(wù)器應(yīng)用程序可以用該通道相互通訊。要通過TCP進行通訊,客戶機和服務(wù)器程序建立連接并綁定套接字。套接字用于處理通過網(wǎng)絡(luò)連接的應(yīng)用程序之間的通訊??蛻魴C和服務(wù)器之間更深入的通訊通過套接字完成。Java被設(shè)計成一種網(wǎng)絡(luò)語言。它將連接功能封裝到套接字類里,而使得網(wǎng)絡(luò)編程更加容易。套接字類(即java.net.Socket類)用于創(chuàng)建一個客戶套接字,而服務(wù)器套接字類(即java.net.ServerSocket類)創(chuàng)建一個服務(wù)器套接字。
IP地址和端口:TCP協(xié)議需要兩個數(shù)據(jù)項:IP地址和端口號?;ヂ?lián)網(wǎng)設(shè)備都帶有一個稱為IP地址的邏輯地址。IP地址具有特定的形式,每個IP地址都是32位的數(shù)值,表示4個范圍在0到255之間的數(shù)值。目前采用的32個二進制位進行編碼的IP地址又被稱為IPv4標準,下一代編碼將采用IPv6標準,以128個二進制位進行編碼。端口號是一個邏輯概念,不同的端口用來響應(yīng)不同的服務(wù),常用的端口如21、80、110等??梢赃@樣理解:IP地址讓我們找到特定計算機,而端口號讓我們找到計算機上的程序進程。
4讓學(xué)生掌握Java中三層架構(gòu)程序開發(fā)的方法
下面以NIIT提供的Java教材為例,講解三層架構(gòu)程序的開發(fā)。軟件需求是:用戶在界面中輸入數(shù)據(jù),數(shù)據(jù)以對象的方式發(fā)送給中間層服務(wù)器,中間層服務(wù)器驗證數(shù)據(jù)后,連接到數(shù)據(jù)庫服務(wù)器并執(zhí)行存儲操作。以下是教學(xué)中的要點。
4.1了解要用到的相關(guān)類和方法
(1) 服務(wù)器使用的類:
創(chuàng)建服務(wù)器的過程就是創(chuàng)建在特定端口監(jiān)聽客戶機請求的ServerSocket對象的過程。當(dāng)收到一個合法請求時,服務(wù)器套接字獲得客戶機創(chuàng)建的Socket對象。服務(wù)器和客戶機之間的通訊通過套接字發(fā)生。服務(wù)器套接字等待來自整個網(wǎng)絡(luò)的請求。它根據(jù)請求完成操作,并將結(jié)果返回到客戶機。ServerSocket類在客戶機/服務(wù)器應(yīng)用程序中代表服務(wù)器。ServerSocket類提供在特定端口上創(chuàng)建套接字的構(gòu)造函數(shù)。如果傳入端口的參數(shù)值為0,則在自由端口上創(chuàng)建套接字。
ServerSocket的構(gòu)造方法:
public ServerSocket(int port) throws IOException
功能:創(chuàng)建服務(wù)器套接字,并綁定到指定的端口上。例如:ServerSocket server=new ServerSocket(5460);
注意:該類在構(gòu)造的時候,可能導(dǎo)致例外的發(fā)生。例如,指定的端口已經(jīng)被占用。
(2) 客戶端使用的類:
創(chuàng)建一個套接字客戶機的第一步是創(chuàng)建Socket對象。Socket類的構(gòu)造函數(shù)接收兩個參數(shù) IP地址和服務(wù)器監(jiān)聽的端口號。
Socket clientSocket =
new Socket(“202.202.96.35”,5460);
在上述代碼片段中,主機名是“202.202.96.35”,端口號5460是服務(wù)器監(jiān)聽所在的端口。
4.2了解封裝數(shù)據(jù)的方法
創(chuàng)建網(wǎng)絡(luò)服務(wù)器時,服務(wù)器程序如何與客戶進行交流?也就是服務(wù)器如何知道客戶所傳遞的數(shù)據(jù)到底是什么格式?客戶機與服務(wù)器的數(shù)據(jù)傳遞的前提包括:
(1) 二者在數(shù)據(jù)的發(fā)送和接收上必須保持一定的格式,相互間能識別;
(2) 要保持格式的一致性應(yīng)事先約定;
(3) 實現(xiàn)一致的方法是,客戶端在發(fā)送數(shù)據(jù)時,將數(shù)據(jù)封裝到一個類里面。服務(wù)器端接收到數(shù)據(jù)后,把收到的數(shù)據(jù)強制轉(zhuǎn)換為相應(yīng)類型;
(4) 要達到上述目的應(yīng)該使用java.io包下的ObjectInputStream、ObjectOutputStream類。
4.3 寫程序時的步驟
(1) 用來封裝要傳遞數(shù)據(jù)的類。下面是一個例子:
import java.io.*;
public class MyFriend extends Object
implements Serializable
{
String vName;
String cSex;
String dBirth;
String cPhone;
}
(2) 編寫接收和存儲數(shù)據(jù)的類(Connect)
用一個客戶請求套接字作為構(gòu)造參數(shù),之后讀取收到的數(shù)據(jù)并進行格式化(造型操作)。
ObjectInputStream streamClient= new ObjectInputStream(inFromClient.getInputStream())
MyFriend data=(MyFriend)
streamClient.readObject();
(3) 編寫監(jiān)聽端口、響應(yīng)客戶請求的類(AppServer)
服務(wù)器程序通過ServerSocket類監(jiān)聽客戶的請求,由于客戶不止一個,所以,服務(wù)器程序應(yīng)該是一個多線程的程序。通過extendsThread方法可以讓服務(wù)器類實現(xiàn)多線程。
(4) 編寫客戶端程序
4.4調(diào)試時的注意事項
對于客戶端而言,客戶程序中要指定中間層服務(wù)器的IP地址和端口,通過IP地址和端口連接到中間層服務(wù)器。對于中間層服務(wù)器而言,它要接受客戶端傳遞來的數(shù)據(jù),所以必須運行在和客戶端約定好的一個端口上。另外,中間層負責(zé)訪問后臺數(shù)據(jù)庫服務(wù)器,所以必須保證ODBC的成功配置。調(diào)試的時候必須注意啟動順序:第一,后臺數(shù)據(jù)庫(如SQL Server)正在運行;第二,中間層服務(wù)器啟動,開始偵聽來自客戶的請求;第三,運行客戶端。
5小結(jié)
以上以三層架構(gòu)為例,展示了如何更好地將知識傳授給學(xué)生。教師要很好地完成傳道授業(yè)的重任,除了在專業(yè)領(lǐng)域提高深度與廣度外,還需要相當(dāng)?shù)呢?zé)任感。要用心去準備每一堂課,要和學(xué)生換位,站在他們的角度,考慮選擇怎么樣的講授方法。此外,教師還應(yīng)該在自己的教學(xué)中不斷總結(jié),讓自己不斷提高。
參考文獻
[1] 張席,王志強. 國內(nèi)外Java教學(xué)模式的比較與探討[J]. 計算機教育,2007,(1).
[2] 王紅.“Java 語言程序設(shè)計”課學(xué)生能力的培養(yǎng)[J]. 計算機教育,2007,(8).
[3] 教育部人事司. 高等教育心理學(xué)[M]. 北京:高等教育出版社,2004.
[4] 覃昆,張蓉蓉. 基于B/S結(jié)構(gòu)、三層架構(gòu)和ASP.NET 2.0技術(shù)的基層黨組織協(xié)同管理系統(tǒng)設(shè)計與實現(xiàn)[J]. 貴州大學(xué)學(xué)報(自然科學(xué)版),2008,(1).
[5] 孫衛(wèi)琴. Java面向?qū)ο缶幊蘙M]. 北京:電子工業(yè)出版社,2008.