本文是有關Java服務程序的三組系列文章之二
上個月( JDJ
第
卷
第
期)
我向大家介紹了Java服務程序技術
以及如何將您現有的CGI程序移植到Java服務程序的方法
本文將不再重復以前介紹的內容
我先假定大家對Java Servlet API (應用程序設計接口)和Java數據庫連接API的基本知識已經比較熟悉
在本文中
我將介紹如何利用Java服務程序(Servlet)和Java數據庫連接(JDBC) 技術創建三層次數據庫應用程序
您將了解每一層的創建方法以及采用數據庫連接來創建Java服務程序所使用的技術
挑 戰
某著名公眾演說家對參加她舉辦的因特網講座的學生進行跟蹤調查
每次講座結束後
她都會與感興趣的學生交換名片
然後
把學生數據輸入她的數據庫程序
她並非把每張名片的數據依次輸入計算機
而是借助萬維網應用程序來完成這項工作
在每次舉辦講座時
她都在若干萬維網終端上設立萬維網應用程序
每位學生都在萬維網終端登記
輸入各自的姓名
所在公司
電子郵件(e
mail)地址
課程名稱和對課程的期望
萬維網應用程序還可顯示所有學生的最新名單
三層解決方案
這個萬維網應用程序由三部分組成
浏覽器
服務程序中間件和數據庫服務程序
這三層如圖
所示
圖
三層次解決方案
第一層使用浏覽器
可充分發揮這一通用客戶端巨大的用戶安裝數的優勢
用一個HTML表格作為用戶輸入界面
而數據庫查詢結果用HTML頁面返回
采用HTML頁面作為用 戶輸入和數據顯示的界面可降低對客戶端浏覽器版本的要求
這種萬維網應用程序並不要求必須采用具有最新JDK修補程序的Java使能的浏覽器
第二層采用運行Java服務程序的Web服務器
Java服務程序可訪問 菘猓⒎禱亓杏惺莸腍TML頁面
請注意
Java服務程序不只運行於Sun Microsystems公司的Java Web Server上
您也可在下列服務器上使用Java服務程序
Microsoft IIS
Netscape FastTrack Server及Enterprise Server以及O?Reilly公司的WebSiteProfessional
在Live Software公司的JRun產品()上也可實現Java服務程序的功能
Sun公司的Java Server主頁上列有支持Java服務程序的Web服務器列表
第三層是後端數據庫服務器
只要計算機安裝了JDBC驅動程序
那麼Java服務程序就能從數據庫中提取數據
在本文所討論的情形裡
公眾演說家的數據庫是MS
Access
所以
我們可以使用與Java Development Kit
版或更高版本捆綁在一起的JDBC
ODBC驅動程序
應用程序的交互過程
您可以看到
應用程序被劃分成三個不同的層次
圖
表示應用程序不同層次之間的交互過程
圖
應用程序的交互過程
下面介紹交互過程的每個步驟
第一步
用戶將信息輸入HTML表格
表格的數據被傳輸到在Web服務器上運行的Java服務程序中
第二步
Java服務程序對表格的數據進行分析
並創建一條SQL語句
然後
通過Java數據庫接口(JDBC)將該SQL語句傳輸到數據庫服務器
第三步
數據庫服務器執行該SQL語句
並將一組結果返回給Java服務程序
第四步
Java服務程序對這組結果進行處理
並用其中的數據創建一個HTML頁面
隨後
該HTML頁面被返回到用戶的Web浏覽器
對數據庫模式進行分析
本文的公眾演說家正在將學生信息存入MS Access數據庫
該數據庫包括一個名為
Students
的數據表
表
定義了數據字段
表
數據庫結構
設計Web浏覽器界面
浏覽器界面包括一個主菜單頁面
用戶使用該頁面可選擇學生注冊
或顯示數據庫中的學生
列表
提供了主菜單的HTML代碼
學生注冊表
學生使用HTML表格進行注冊
該表格采集姓名
電子函件地址
公司名稱和其它與課程相關的信息
圖
為學生注冊表
圖
學生登記注冊表
開發服務程序中間件
服務程序中間件封裝了應用程序的業務邏輯
服務程序對表格中的數據進行分析
並構造一條SQL語句
隨後
該SQL語句被傳送到數據庫服務器
在SQL語句執行完畢後
數據庫服務器將結果集返回給服務程序
至此
服務程序對結果集進行處理
並為用戶構造一個HTML頁面
被創建的服務程序稱作StudentDBServlet
StudentDBServlet有執行下列功能的方法
初始化
對請求的服務
對學生數據的顯示和對學生的登記
下面詳細介紹這些功能
服務程序的初始化
在服務程序的生命周期內
當服務程序第一次被調用時
首先調用init()方法
列表
為init()方法的代碼清單
StudentDBServlet服務程序來說
一個數據庫連接被打開
並創建用於顯示學生列表或進行學記的預先准備好的SQL語句(Prepared Statement)
這個數據庫連接在服務程序的整個生命周期內都將保持打開的狀態
根據用戶的設計
用戶可以為每個SQL查詢打開或關閉一個連接
但在此應用中
數據庫連接僅打開一次
對用戶請求提供服務
每次服務程序被調用時
service()方法會被調用
service()方法是服務程序的主要入口點(Entry Point)
但是
如果這是服務程序第一次被調用
那麼就會先調用init()方法
然後再調用service()方法
本應用中的service()方法系用來將請求轉移給相應的處理方法
學生登記表中有一個名為
Register
的隱含字段
service()方法核對
Register
字段的值
如果該值非空(null)
則registerStudent()方法就被調用
如果HTML頁面不存在該字段
則返回一個空值(null)
如果返回空值(null)
則會執行displayStudent()方法
顯示學生名單
displayStudent()方法包括訪問數據庫和顯示學生名單的業務邏輯
這是通過使用輔助的Student (學生)類實現的
列表
給出了Student類的代碼
Student類有為每位學生保持信息的數據成員
Student類還有能根據表格數據或一組數據庫結果創建對象的構造程序
下列語句表示學生的姓是如何從表格數據中獲取 的
lastName = request
getParameter (
LastName
);
請求對象是HttpServletRequest的一個實例
請求對象包含表格數據
表格數據可通過調用getParameter( )方法並提供表格字段的名稱獲得
學生注冊表中包含有一個LastName字段
(請參考我以前發表在JDJ的文章
其中詳細討論了服務程序如何獲取表格數據)
Student類有存取其數據成員並以字符串方式表示其數據的方法
列表
中包括了Student類的方法代碼清單
toString()方法以普通的字符串格式返回數據成員
toWebString( )方法以HTML無序列表的格式返回數據
toTableString( )方法以HTML表格的格式返回數據
這些方法被用來創建學生名單
構造一個HTML頁面後就創建了學生名單
在列表
中的displayStudents()方法中
創建了HTML頁面的標題
隨後再創建顯示下列信息的表格標題
服務程序向數據庫服務器發出請求
獲得學生的名單
在init()方法中准備了下列SQL語句
select * from Students order by LastName;
SQL語句將根據姓氏並按照字母順序返回學生的名單
這組結果被用來創建HTML表格的主體
通過創建while循環語句
處理這組結果的每個記錄
該while循環語句的 部分代碼如下
int rowNumber =
; while (dataResultSet
next( ) ) { aStudent = new Student(dataResultSet); tableBody += aStudent
toTableString(rowNumber); rowNumber++; }
每個記錄都被用來創建一個新的Student對象
toTableString()方法被調用
以獲得學生數據的字符串表示
前面談到
toTableString( )方法以HTML表格的格式返回數據
在構造了表格主體後
結果集就被關閉
在主頁的底部
還提供了至主菜單頁面的浏覽鏈接
在服務程序方面進行了大量的處理工作
但我們到現在還沒有結束
必須將HTML頁面返回給Web浏覽器
這是通過在響應對象上打開一個輸出流實現的
響應對象是HttpServletResponse的一個實例
將HTML頁面返回給用戶的語句如下
PrintWriter outputToBrowser = new PrintWriter(response
getOutputStream()); response
setContentType(
text/html
) ; outputToBrowser
println(htmlPage); outputToBrowser
close( );
為HTML設置了內容類型(content
type)後
用println()方法將htmlPage串返回給浏覽器
圖
為StudentDBSServlet所返回的學生名單樣本
圖
學生名單
學生的登記處理
registerStudent()方法根據HTML表格數據創建一個新的Student對象
這個Student對象被用來作為在init( )方法已經准備好的SQL語句中的參數
下列語句表示參數是如何設置的
registerStatement
setString(LAST_NAME_POSITION
aStudent
getLastName())
所有參數設置完畢後
就執行SQL語句
該語句執行完畢後
新的學生數據就成功地插入到數據庫中了
此外
還為用戶構造了確認頁面
確認頁面包含成功地插入數據庫的數據列表
Student
toWebString()方法被調用
為無序列表提供一個HTML字符串
合
至此
應用程序的全部三層均已構造完畢
用戶界面由在浏覽器中顯示的HTML頁面組成
對浏覽器的唯一要求就是必須能顯示HTML表格
Microsoft (微軟)公司和Netscape(網景)公司所提供的兩種主要浏覽器均可輕松地滿足這一要求
所以能保證Web應用程序對浏覽器是友好的
後端數據庫是采用Microsoft Access創建的
但只要存在相應的JDBC驅動程序
就可使用任何一種數據庫
在我們所討論的情形裡
公
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26178.html