程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用Eclipse、WTP和Derby構建Web應用程序

用Eclipse、WTP和Derby構建Web應用程序

編輯:關於JAVA

簡介

Eclipse 是使用 Java 技術開發 Web 應用程序的理想平台。動態 Web 應用程序的 3 層設計非常適合與運行在 servlet 容器(例如 Apache Jakarta Tomcat)中的 JSP 和 Servlet 相結合。持久數據層可以適當地由 Derby 數據庫提供。用於開發 J2EE 和 Web 應用程序的 Eclipse Web Tools Platform (WTP) 項目工具集,加上 Derby Eclipse 插件,可以提供快速而簡便的 Web 開發。

本文討論 WTP 提供的一些功能、Derby 數據庫插件以及一個完整的示例應用程序,該應用程序使用了 JSP、JavaServer Pages Standard Tag Library (JSTL) 和 Servlets。這個示例應用程序是一個虛擬的、經過簡化的航線機票預訂系統。

為了更好地利用本文,您應該理解 JSP、JSTL 和 Servlet 技術的基本知識,理解簡單的 SQL,並對 Eclipse 有一定的了解。本文中還使用了 WTP 的一些特性,但本文不是關於 WTP 工具的全面教程。如果您已經知道 WTP 的一些背景,並且想直接開始下載所有必需的軟件,那麼請略過 軟件需求 小節。否則,請閱讀下一小節,以了解 WTP 是什麼,以及如何在 Eclipse 中使用其中一些組件來開發示例應用程序。

IBM Cloudscape 是 Apache Derby 開放源碼數據庫的商業發行版。如果沒有引用特定的文件或名稱,那麼這兩個名稱在本文中可以互換使用。

Eclipse WTP 項目

Eclipse Web Tools Platform (WTP) 項目允許 Eclipse 用戶開發 J2EE Web 應用程序。這個平台中包括了多個編輯器、圖形編輯器、特性、構建器、一個 Web 服務向導、數據庫訪問和查詢工具以及其他組件。該項目提供了大量的工具。而在使用 Derby 作為後台數據庫構建一個 Web 應用程序時,只會演示其中有限的幾種工具。

在 www.eclipse.org/webtools 上 WTP 的特許權定義如下:“... 構建有用的工具和一個通用的、可擴展的且基於標准的工具平台,在這個平台上,軟件供應商可以創建用於產生支持 Web 的應用程序的專門的、不同的解決方案。”本文不討論為這個平台構建新的工具,而是使用它作為一個開放的平台,以便使用開放源碼組件構建 Web 應用程序。

Web Standard Tools 和 J2EE Standard Tools

WTP 分為兩個子項目,Web Standard Tools 和 J2EE Standard Tools。Web Standard Tools (WST) 項目為多層 Web 應用程序提供公共基礎設施。它提供了一個服務器視圖,使您可以發布在 Eclipse 中創建的資源,並且在一個服務器上運行它們。WST 不包括用於 Java 語言的特定工具,也不包括用於特定於 Web 框架的技術的特定工具。

J2EE Standard Tools (JST) 項目提供工具,用於簡化包括 EJB、Servlet、JSP、JDBC、 Web 服務等等在內的 J2EE API 的開發。J2EE Standard Tools 項目以 Web Standard Tools 項目提供的 Server Tools 支持為基礎,包括 servlet 和 EJB 容器。

下一節討論在構建和運行示例應用程序時所需的軟件組件。

Web 應用程序的組件

示例應用程序使用了以下軟件組件和技術:

Eclipse

使用 IDE 編寫和運行示例應用程序。它是開發和構建 Java 應用程序的基礎。

使用 Eclipse 附帶的 Java Development Tools (JDT) 編譯屬於應用程序一部分的 Java 類。

WTP

使用編輯器創建 JSP 文件。該編輯器包括 JSP 語法的內容輔助。

使用 Servers 視圖啟動和停止外部的 Jakarta Tomcat servlet 引擎。

使用 J2EE 透視圖創建動態 Web 應用程序,這個動態 Web 應用程序裝配和配置 J2EE Web 應用程序,包括與所有 J2EE Web 應用程序相同的標准結構和部署描述符。

通過 Database Explorer 視圖創建一個到 Derby 數據庫的連接。

Derby 插件

添加 Derby 特性到動態 Web 項目,以便將 JAR 文件包括在項目中。

在應用程序開發期間啟動和停止 Derby 網絡服務器。

使用 ij SQL 查詢工具運行 SQL 查詢。

將項目的 derby.system.home 屬性設置為指向數據庫。

JavaServer Pages Standard Tag Library (JSTL)

這個標記庫使基於 JSP 的應用程序可以使用一個標准標記庫來執行常見的任務。示例應用程序使用這些標記來執行諸如迭代和數據庫訪問之類的任務。在 JSP 中還使用了 EL(Expression Language,表達式語言),這是一種腳本語言。

Apache Jakarta Tomcat servlet 引擎

運行由 JSP 和 Servlet 組成的 Web 應用程序。

提供對 Servlet 2.4 和 JSP 2.0 API 的支持,包括對 EL 的支持。

提供對在 Web 應用程序的部署描述符中將 Derby 數據庫定義為一個 Data Source 的支持。

軟件需求

本節中描述的軟件可以免費下載,在運行例子和構建示例 Web 應用程序之前,必須安裝這些軟件。

以下兩種 Java 開發工具箱 之一:

IBM SDK version 1.4.2 或更高版本。

Sun JDK version 1.4.2 或更高版本。

Eclipse 和 WTP。您可以下載一個包括 Eclipse SDK、所有 WTP 先決條件以及 WTP 本身的 zip 文件。在 Windows 上,這個文件的文件名為 wtp-all-in-one-0.7-win32.zip。如果您喜歡下載 Linux 上的版本,那就是 wtp-all-in-one-0.7-linux-gtk.tar.gz 文件。您可以從 eclipse.org 下載其中任何一個文件。

如果您已經安裝了 Eclipse,或者安裝了 WTP 的一些先決條件,那麼您可以比較下面列出的 wtp-all-in-one zip 文件中包含的插件版本。而且, Download 頁面也列出了 0.7 WTP 的先決條件,所以您要確保安裝的組件至少能跟上這裡列出的版本。如果可供下載的版本不同於下面列出的版本,那麼請下載 WTP 站點上建議的版本。

Eclipse 3.1, for Windows:eclipse-SDK-3.1-win32.zip

EMF SDK:emf-sdo-xsd-SDK-2.1.0.zip

GEF SDK:GEF-SDK-3.1.zip

Java EMF Model Runtime:JEM-SDK-1.1.zip

Web Tools Platform:wtp-0.7.zip

Derby 數據庫 Eclipse 插件。Apache Derby 數據庫最近發布了數據庫引擎的 10.1 版。為了在 Eclipse 3.1 上運行,需要以下版本的插件:

Derby Core 插件,Version 10.1.1

Derby UI 插件,Version 1.1.0

Apache Jakarta Tomcat。下載 Version 5.0.28 。

JavaServer Pages Standard Tag Library (JSTL)。從 Apache Jakarta Project 下載 Standard 1.1 Taglib,jakarta-taglibs-standard-1.1.2.zip。

示例應用程序源代碼和 WAR 文件:

WAR 文件就是 Web Application Archive,它是打包和部署 J2EE Web 應用程序的標准單元。所有遵從 J2EE 的 servlet 容器都接受 WAR 文件,並且可以部署這些文件。請下載 LowFareAir.war 文件到您的文件系統中(見 下載)。

下載 zip 文件 LowFareDataSQL.zip,該文件包含 Derby 數據庫和訪問 airlinesDB 數據庫的示例 SQL 文件(見 下載)。

軟件配置

下載了所有必需的軟件之後,便需要配置它們,以便可以構建應用程序。

安裝 JDK

如果還沒有安裝 1.4.2 或更高版本的 JDK,那麼安裝它。這裡需要的是 JDK,而不是 JRE。

安裝 Eclipse 和 WTP

通過將 wtp-all-in-one-0.7-win32.zip 解壓到一個您想放置 Eclipse 的目錄中,便可以安裝 Eclipse。如果已經安裝了 Eclipse,並且您下載了前面列出的各個組件,那麼將那些組件解壓到 Eclipse 主目錄,因為它們都是插件,這些組件將安裝到 Eclipse 的插件目錄。

安裝和配置 Jakarta Tomcat

將 Jakarta Tomcat 解壓或安裝到與 Eclipse 安裝目錄不同的一個目錄。

現在需要配置 Eclipse,以便在使用 WTP 的 Eclipse 中運行 Tomcat 作為服務器。為此:

訪問 http://www.eclipse.org/webtools/ 並選擇 WTP Community 下的教程鏈接。

在 Tutorials 頁面,選擇名為“Building a School Schedule Web Application”的教程。

遵循該教程“Installing the Tomcat Runtime in Eclipse”小節中的所有說明。對於這個示例 Web 應用程序,不需要完成整個教程。

安裝 Derby 插件

將兩個文件(Derby Core 和 UI 插件的 zip 文件)都解壓到 Eclipse 主目錄下的插件目錄。Derby 插件附帶了關於如何使用這些插件的所有功能的完整的教程和例子。為了訪問幫助,請選擇 Help > Help Contents > Derby Plug-ins User Guide。

應用程序設計

LowFareAir Web 應用程序遵從標准的 3 層設計模型,由表示層、業務邏輯和控制層和數據或持久層組成。JSP 包括 JSTL 標記庫,提供了 UI 或表示層。Servlets 和 java 支持類提供應用程序的業務邏輯和流控制。而 Derby 數據庫及 JavaBeans 則提供數據層。下面的圖說明了這一點。

圖 1. 示例應用程序設計

關於從表示層訪問數據層的注意事項

以 JSP 表示的表示層通常不應該直接與數據層交互,因此也不應該進行數據庫查詢。該應用程序的設計遵從公認的范例,只有第一個 JSP 除外。為了快速開發原型,將數據庫訪問合並到視圖層, 打破數據與視圖嚴格分離的限制,這是可以接受的。第一個 JSP,即 Welcome.jsp, 使用 JSTL SQL 庫從該頁面發出一個 SQL 查詢,因而同時占據了表示層和數據層。

其他 JSP 僅僅充當表示層,它們將所有的數據處理任務都遞交給 Servlet,由這些 Servlet 與 Derby 數據庫交互。如果您有興趣在將來的 Web 應用程序的原型開發中使用這種方法學,那麼這裡展示了一個 JSTL SQL 庫的例子,但是對於生產環境,不建議這麼做。

LowFare Air 示例應用程序

這個示例應用程序允許新用戶的注冊,並允許已有用戶登錄到這個應用程序。用戶登錄以後,應用程序展示出很多的航班,以供用戶訂票。由於只提供直達航班,所以要檢查用戶所選的航班,看出發地與目的地之間是否有直達航班。如果有這樣的航班,那麼用戶就可以選擇預訂這個航班的機票。最後,用戶可以看到通過 LowFare Air 預訂的所有航班的歷史記錄。

示例應用程序的流程由以下步驟組成:

用戶注冊或驗證

用於應用程序這一部分的 JSP 是 Welcome.jsp、Login.jsp 和 Register.jsp。

LoginServlet 擔任控制器 —— 或者在 Derby 數據庫的 APP.USERS 表中驗證用戶的名稱,或者將用戶的名稱插入到這個表中。

注冊成功之後,設置一個持久的 cookie;登錄成功後,將客戶機的用戶 ID 添加到會話中。

檢索和選擇航班

Welcome.jsp 用於選擇航班,而 GetFlights.jsp 則用於檢索航班。

CheckFlightsServlet 擔任控制器。如果在選擇的兩個城市之間存在航班,那麼將航班信息傳遞給 GetFlights.jsp。否則,讓用戶返回到 Welcome.jsp 頁面,以便選擇其他航班。

如果有航班,那麼 DerbyDatabase 類將從數據庫檢索到的航班信息放入到名為 FlightsBean 的 JavaBean 中。

通過更新 Flight History 預訂用戶的航班

這裡使用的 JSP 是 BookFlights.jsp 和 GoodBye.jsp。BookFlights.jsp 請求用戶對他們預訂的航班作最後的確認。GoodBye.jsp 顯示用戶通過 Derby Airlines 預訂的所有航班。

UpdateHistoryServlet 以用戶名和用戶剛預訂的航班更新 APP.FlightHistory 表。然後請求被重定向到 GoodBye.jsp。

用戶退出

應用程序的最後階段是退出應用程序,或者預訂其他航班。這裡使用的 JSP 是 LoggedOut.jsp,或者,如果用戶還想預訂其他的航班,則使用 Welcome.jsp。

如果用戶選擇退出,則從 Session 對象中刪除用戶 ID。因此,當該用戶下一次重返站點時,雖然保留了一個持久 cookie,但用戶 ID 不在 Session 對象中,因此用戶必須再次登錄。

下面的圖生動地展示了這一流程。

圖 2. 示例應用程序的流程

從 WAR 創建 Web 項目

為了理解如何使用隨 WTP 附帶的不同工具以及 Derby 插件,請將應用程序作為 WAR 文件導入,WAR 是 Web 應用程序的標准打包單元,其文件格式為 JAR。

構建任何使用 JSP 或 Servlet 的 Web 應用程序的第一步是創建一個動態 Web 應用程序。您可以使用 WTP 的一組工具創建這樣一個動態 Web 應用程序,它將為 J2EE Web 應用程序自動創建適當的目錄結構。將 WAR 文件導入到 Project Explorer 視圖的 Dynamic Web Project 文件夾中,以便創建一個新的 Web 項目。

啟動 Eclipse,遵循以下步驟導入 WAR 文件,以創建一個新的動態 Web 項目:

打開 J2EE 透視圖。

在 Project Explorer 視圖中,右鍵單擊 Dynamic Web Projects 文件夾。

選擇 Import,然後在 Import 窗口中,選擇 WAR file 並單擊 Next。

在 WAR Import 窗口中,浏覽到早先下載的 LowFareAir.war 文件(見前面的 軟件需求)。將項目命名為 LowFareAir,並確保 Target server 是 Apache Tomcat V5.0(這是您早先作了配置的,見前面的 軟件配置)。單擊 Finish。

圖 3 展示了這個過程的最後一步。

圖 3. 導入 WAR 文件以創建動態 Web 項目

您還需要導入三個上述 WAR 文件中沒有的 JAR 文件:jstl.jar 和早先下載的 Jakarta taglibs 包中的 standard.jar,以及 Derby 核心插件中的 derbyclient.jar 文件。通常,一個完整的 WAR 文件會包括這些 JAR 文件,但出於演示的目的,您應該知道如何將它們導入到動態 Web 項目中。

為了獲得 Jakarta 包中的這幾個 JAR 文件,請解壓 jakarta-taglibs-standard-1.1.2.zip 文件。jstl.jar 和 standard.jar 文件在新創建的 jakarta-taglibs-standard-1.1.2/lib 目錄中。為了導入這幾個 JAR 文件:

打開 Dynamic Web Projects 文件夾。這時將出現剛才導入的 LowFareAir 項目。展開這個文件夾,然後展開 WebContent 文件夾。

右鍵單擊 WebContent/WEB-INF/lib 文件夾並選擇 Import。在 Import 窗口中,選擇 File System,然後單擊 Next。

浏覽至子目錄 jakarta-taglibs-standard-1.1.2/lib,您曾經將 taglibs 解壓至該目錄,然後選擇 jstl.jar 和 standard.jar。確保導入到 LowFareAir/WebContent/WEB-INF/lib 目錄。然後單擊 Finish。

現在需要將 derbyclient.jar 文件添加到 Web 應用程序可用的庫中。您的 Web 應用程序將使用 derbyclient.jar 中的 JDBC 來建立到數據庫的連接。

為了導入 derbyclient.jar:

右鍵單擊 WebContent/WEB-INF/lib 文件夾並選擇 Import。在 Import 窗口中,選擇 File System,然後單擊 Next。

浏覽至 Eclipse 主目錄下的插件目錄,然後打開 org.apache.derby.core_10.1.1 目錄。選擇 derbyclient.jar。確保導入到 LowFareAir/WebContent/WEB-INF/lib 目錄。然後單擊 Finish。

這樣便完成了 Web 組件的導入,包括 Java 源文件和用於應用程序的所有庫。接下來,導入裝有示例數據的 Derby 數據庫 airlinesDB。

配置數據層

為了配置數據層以及應用程序用於訪問數據庫的工具:

將 Apache Derby Nature 添加到 LowFareAir 項目中。

將 LowFareAirData.zip 文件導入到項目中。該 zip 文件包含 airlinesDB Derby 數據庫,其中包含所有用於應用程序的數據以及一些示例 SQL 腳本。

配置 Web 應用程序部署描述符 web.xml,以包含一個指向 airlinesDB 數據庫的數據源。

將 Derby 屬性 derby.system.home 設置為指向 airlinesDB 數據庫的完整路徑。通過設置這個屬性,在 JDBC 連接 URL 中所有對 airlinesDB 數據庫的引用都只需引用“airlinesDB”,而不必引用完整的文件系統路徑。

添加 Apache Derby 特性

該 Web 應用程序使用一個 Derby 數據庫來為虛擬的 LowFareAir 航空公司存儲和查詢航班信息。在 Eclipse 中訪問和使用 Derby 數據庫的一種簡便方法是通過 Derby 插件。

Derby 插件允許添加 Derby 特性到任何 Eclipse 項目中。將一種特性添加到一個項目(包括動態 Web 項目),意味著該項目將“繼承”某些功能和行為。而添加 Derby 特性則意味著將與 Derby 捆綁的 Derby 數據庫 JAR 文件和命令行工具添加到 Eclipse 環境中。

Project Explorer 視圖現在將顯示剛才創建的 LowFareAir 項目。

為了添加 Derby 特性到 LowFareAir 項目中,在它上面單擊右鍵並選擇菜單項 Apache Derby > Add Apache Derby nature。

導入 LowFareAirData.zip

源代碼中包括了 airlinesDB,這是用於 Web 應用程序的示例數據庫。這個數據庫和其他一些示例 SQL 都需要導入到 LowFareAir 項目中。為此:

展開 Dynamic Web Projects 文件夾。右鍵單擊 LowFareAir 文件夾並選擇 Import。在 Import 窗口中,選擇 Archive file,然後單擊 Next。

浏覽至 LowFareAirData.zip,確保選擇了左框中的 / 目錄。這裡包括 data 和 sql 文件夾。選擇 LowFareAir 作為 Into 文件夾的名稱。然後單擊 Finish。

如果導入成功,LowFareAir 文件夾應該包含兩個新的子文件夾:data 和 sql。data 文件夾將包含 airlinesDB 目錄(數據庫)。

sql 目錄包含三個 SQL 文件,分別是 airlinesDB.sql、flights.sql 和 flighthistory_users.sql。

現在 Web 應用程序所需的所有文件都已導入完畢,LowFareAir 項目的結構現在看上去應該如圖 4 所示。

圖 4. LowFareAir 項目的 Project Explorer 視圖

用 Derby 數據源配置 web.xml

web.xml 文件包含關於使用 Derby airlinesDB 數據庫作為數據源的一個數據源條目。並不是每個連接到 Derby 數據庫的 Web 應用程序都需要如此。但是為了演示的目的,這個應用程序為第一個 JSP 頁面使用一個數據源。其他 JSP 不使用這個數據源,而 Servlet 使用一個標准的 Java 類,該類使用 JDBC 連接到數據庫。

為了確定 airlinesDB 在文件系統上的位置,右鍵單擊 LowFareAir 項目的 data 目錄下的 airlinesDB 文件夾,選擇 Properties。Properties 窗口顯示一個 Location 字段,其中有指向 airlinesDB 目錄的完整文件系統路徑。復制這個字符串,以便在下一步中使用。例如,這個路徑可能類似於 C:\eclipse\workspace\LowFareAir\data\airlinesDB。

打開 web.xml(在 WebContent/WEB-INF 目錄下),在以 Source 模式查看時浏覽至下面這一段(為了提高可讀性,param-value 部分中的條目加入了換行符,但是 URL 應該是連續的一行):

清單 1. Web.xml context-param 部分

<context-param>
 <param-name>javax.servlet.jsp.jstl.sql.dataSource</param-name>
  <param-value>
  jdbc:derby://localhost:1527/C:\eclipse\workspace\LowFareAir\data\ /
  airlinesDB;user=a;password=b;,
  org.apache.derby.jdbc.ClientDriver
 </param-value>
</context-param>

使用剛才復制的 airlinesDB 數據庫的完整路徑,將 <param-value> 部分中的值改為您環境中的數據庫 URL。如果這個路徑不正確,應用程序的第一個頁面(Welcome.jsp)將失敗。而且,在運行 Welcome.jsp 之前,需要啟動網絡服務器,因為前面顯示的 URL 嘗試使用 Derby Client 驅動程序訪問網絡服務器。

為項目設置 derby.system.home

在 Eclipse 中配置 Derby 數據庫環境的下一步是編輯名為 derby.system.home 的 Derby 系統屬性,使之指向 airlinesDB 數據庫的位置。這樣您便可以使用 Derby 插件連接到 airlinesDB,而不必指定到數據庫的完整文件系統路徑。在數據庫連接 URL 中只需列出名稱 airlinesDB。

使用之前復制的 airlinesDB 目錄的路徑設置 derby.system.home,只需做少量修改。

右鍵單擊 LowFareAir 項目並選擇 Properties。

在 Properties 窗口的左側(當前它提示 PropertyDialog.propertyMessage —— 看來是一個 bug)選擇 Apache Derby。

在右側是 Apache Derby 屬性,您可以更改該屬性。名為 derby.system.home 的 Derby System 屬性當前被設為默認值(.)。將其改為指向 airlinesDB 目錄所在目錄的完整路徑。注意:您也可以在 port 屬性中修改網絡服務器所偵聽的端口。
編輯 derby.system.home 屬性的值,將其設置為 data 目錄的完整路徑。粘貼您之前復制的字符串,然後去掉後面的 \airlinesDB。所以,derby.system.home 屬性將成為:C:\eclipse\workspace\LowFareAir\data。注意:不要輸入數據庫目錄本身的名稱 —— 它應該是數據庫目錄所在的目錄,在這裡就是 data 目錄,而不是 airlinesDB 目錄本身。

最後單擊 OK 保存對項目的設置。

接下來您將啟動 Derby Network Server,建立到 airlinesDB 數據庫的連接,並使用隨 Derby 插件附帶的 ij 工具發出 SQL。

啟動 Derby 網絡服務器並運行 ij

由於您要對 airlinesDB 中的表運行一些查詢,所以有必要知道有哪些表,這些表是如何定義的。下面就顯示了這些表。SQL 文件 airlinesDB.sql 用於創建數據庫。不要再次運行 airlinesDB.sql,除非您刪除了舊的數據庫,並希望在一個新的數據庫中重新創建所有的表。

清單 2. 在 airlinesDB 數據庫中創建表的語句

CREATE TABLE APP.CITIES 
(
 CITY_ID     INTEGER NOT NULL constraint cities_pk primary key,
 CITY_NAME    VARCHAR(24) NOT NULL,
 COUNTRY     VARCHAR(26) NOT NULL,
 AIRPORT     VARCHAR(26),
 LANGUAGE     VARCHAR(16),
 COUNTRY_ISO_CODE CHAR(2)
);

CREATE TABLE APP.FLIGHTS 
(
 FLIGHT_ID   CHAR(6) NOT NULL,
 SEGMENT_NUMBER INTEGER NOT NULL,
 ORIG_AIRPORT  CHAR(3),
 DEPART_TIME  TIME,
 DEST_AIRPORT  CHAR(3),
 ARRIVE_TIME  TIME,
 MEAL      CHAR(1) CONSTRAINT MEAL_CONSTRAINT
 CHECK (meal IN ('B', 'L', 'D', 'S')),
 FLYING_TIME  DOUBLE PRECISION,
 MILES     INTEGER,
 AIRCRAFT    VARCHAR(6),
 CONSTRAINT FLIGHTS_PK Primary Key (FLIGHT_ID, SEGMENT_NUMBER)
);

CREATE TABLE APP.FLIGHTAVAILABILITY
(
 FLIGHT_ID       CHAR(6) NOT NULL ,
 SEGMENT_NUMBER     INTEGER NOT NULL ,
 FLIGHT_DATE      DATE NOT NULL ,
 ECONOMY_SEATS_TAKEN  INTEGER DEFAULT 0,
 BUSINESS_SEATS_TAKEN  INTEGER DEFAULT 0,
 FIRSTCLASS_SEATS_TAKEN INTEGER DEFAULT 0,
 CONSTRAINT FLIGHTAVAIL_PK Primary Key
 (FLIGHT_ID, SEGMENT_NUMBER, FLIGHT_DATE),
 CONSTRAINT FLIGHTS_FK2 Foreign Key (FLIGHT_ID, SEGMENT_NUMBER)
 REFERENCES FLIGHTS (FLIGHT_ID, SEGMENT_NUMBER)
);

CREATE TABLE APP.FLIGHTHISTORY
(
 ID       INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
 USERNAME    VARCHAR(26) NOT NULL,
 FLIGHT_ID   CHAR(6) NOT NULL,
 ORIG_AIRPORT  CHAR(3) NOT NULL,
 DEST_AIRPORT  CHAR(3) NOT NULL,
 BEGIN_DATE   CHAR(12),
 CLASS     CHAR(12)
);

CREATE TABLE APP.USERS 
(
 ID       INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
 USERNAME    VARCHAR(40) NOT NULL,
 PASSWORD    VARCHAR(20)
);

現在右鍵單擊 LowFareAir 項目並選擇 Apache Derby > Start Derby Network Server,從而啟動 Derby 網絡服務器。控制台視圖應該會表示,服務器准備在 Derby 屬性 Network Server 設置中指定的端口上接受連接。打開 sql 文件夾並右鍵單擊 flights.sql 文件。選擇 Apache Derby > Run SQL Script using 'ij'。

控制台窗口將顯示 flights.sql 文件中包含的三條 SQL 語句的輸出。 如果沒有成功建立連接,那麼檢查網絡服務器是否已經啟動,以及 derby.system.home 是否被設為 LowFareAir 文件夾下 data 目錄的完整路徑。

WTP Data 工具 —— 一種替代方案

WTP 有一組豐富的數據庫工具,允許用戶連接到 Derby、DB2、Informix、MySql、Oracle、SQL Server 和 Sybase 數據庫,浏覽這些數據庫,以及對這些數據庫發出 SQL。在本節中,您將連接到使用 Derby Network Client 驅動程序的 Derby Network Server,並學習如何使用 WTP 的一些工具作為使用 Derby 插件的替代方案。

在 J2EE 透視圖中,選擇 Window > Show View > Other。在 Show View 窗口中,選擇 Data > Database Explorer 然後單擊 OK。Database Explorer 視圖將出現在工作區的右下端。在此視圖中單擊右鍵,並選擇 New Connection。

這時將出現 New Connection 向導。取消對 Use default naming convention 復選框的選擇,並將連接命名為 Derby 10.1。在 Select a database manager 區域,展開樹中的 Derby 項。注意,它列出 10.0 版的數據庫系統。

WTP 0.7 只直接支持 Derby 10.0,但是,最新版本的 Derby 是 10.1 版,而且您將在這裡與 Database Explorer 一起使用的 Derby JAR 文件是 10.1 版。在 10.1 版的 Derby 中,建議采用一種新的開放源碼客戶機驅動程序 —— derbyclient.jar —— 來連接到網絡服務器。

下圖展示了在我的環境中每個字段的值。下面的表還列出了示例設置。

圖 5. WTP Database Explorer 的 New Connection 向導

參數 值 Connection Name Derby 10.1 Database manager Derby 10.0 JDBC driver Other Database C:\eclipse\workspace\LowFareAir\data\airlinesDB JDBC driver class org.apache.derby.jdbc.ClientDriver Class location C:\eclipse\plugins\org.apache.derby.core_10.1.1\derbyclient.jar Connection URL jdbc:derby://localhost:1527/C:\eclipse\workspace\LowFareAir\data\airlinesDB User ID slc (any non-empty value) Password slc (any non-empty value)

對 Derby 數據庫是可以配置認證的,但是這裡還沒有為 airlinesDB 數據庫設置認證。使用任意(非空)值作為用戶 ID 和密碼,並單擊 Test Connection 按鈕。如果網絡服務器在端口 1527 上運行,那麼測試應該可以成功。否則,確保網絡服務器在連接 URL 指定的端口上運行,並確保所有的值都適合您的環境。

由於網絡服務器是用來連接到 airlinesDB 數據庫的,因此可以由多個 JVM 訪問它。這意味著 ij、Database Explorer 和 Eclipse 外部的客戶機應用程序都可以連接和查詢該數據庫中的表。

測試連接成功之後,單擊 Next 按鈕。

在 Specify Filter 窗口中,取消對 Disable filter 復選框的選擇,選擇 Selection 並選擇 APP 模式。然後單擊 Finish。

圖 6. 為 Derby 10.1 連接指定過濾器

現在,Database Explorer 視圖顯示到 airlinesDB 數據庫的連接。展開樹,浏覽至 APP 模式的 Tables 文件夾下的 FLIGHTS 表。右鍵單擊 FLIGHTS 表,並選擇 Data > Sample Contents。

圖 7. Database Explorer 中的示例連接

現在將出現 Data Output 視圖,其中包含 FLIGHTS 表中的行。

圖 8. Data Output 視圖

Database Explorer 視圖的另一個特性是可以插入、刪除和更新表中的行。Table Editor 提供了修改表中數據的能力。如果您想添加另一行到 FLIGHTS 表中,在 Database Explorer 視圖中右鍵單擊這個表,選擇 Data > Open。輸入一個新的行,在每個列中提供如下所示的值。注意 FLIGHTS 選項卡上單詞 FLIGHTS 之前的那個星號。這表明,自上次保存以來,編輯器已經被修改。

圖 9. Table Editor

為了插入行到表中,選擇 File > Save 或使用快捷鍵 Ctrl + S 保存編輯器。Data Output 視圖的 Messages 選項卡顯示數據插入成功。

圖 10. 成功地插入一行到 FLIGHTS 表中

Database Explorer 視圖的其他特性包括抽取和下載表的能力、打開 SQL Editor 以發出即席 SQL,以及 Generate DDL 選項,該選項在生成用於創建整個數據庫模式或模式的一個子集的 SQL 腳本時十分有用。您可以通過在模式對象(表、視圖、索引或模式)上單擊右鍵自己探索這些選項,看看對於特定的對象有哪些可用的選項。

探索視圖層和 JSP

現在可以開始查看應用程序中的 JSP。參考 圖 2 中的應用程序流程,第一個 JSP 頁面是 Welcome.jsp。在 Project Explorer 中,打開 WebContent 文件夾下的 Welcome.jsp 文件。下面的小節中將展示這個頁面的代碼。注意:有些代碼清單有反斜槓字符“\”,這表示代碼行是連續的,但為了可讀性,這裡對其格式作了調整。

清單 3. 在 Welcome.jsp 中導入 Core 和 SQL 標記庫

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>

前兩行包括可用於 JSP 頁面的 taglib 指令,這樣便可以使用 core 和 SQL JSTL 標記庫。

接下來這一段使用 core 標記庫來測試在用戶浏覽器中是否設置了 cookie。如果沒有 cookie,那麼將 JSP 頁面重定向到 Register.jsp。如果至少有一個 cookie,那麼檢查是否設置了名為 derbyCookie 的 cookie。如果存在 derbyCookie,那麼接下來的測試是檢查 Session 對象是否包含一個用戶 ID。如果沒有包括用戶 ID,那麼用戶進入 Login.jsp 頁面,以登錄到應用程序。

如果用戶在 Session 對象中有用戶 ID,那麼用戶可以繼續,處理仍停留在 Welcome.jsp 頁面。

清單 4. 測試 Welcome.jsp 中是否設置了 cookie

<HTML>
<HEAD>
<TITLE>Derby Airlines</TITLE>
</HEAD>
<BODY>

<c:choose>
 <c:when test="${empty cookie}">
 <jsp:forward page="Register.jsp" />
  </c:when>
 <c:otherwise>
<!-- if the derbyCookie has been set but the username is not in \ 
the session object -->
  <c:forEach var="cookieVal" items="${cookie}">
  <c:if test="${cookieVal.key == 'derbyCookie'}">
   <c:if test="${empty sessionScope.username}">
   <jsp:forward page="Login.jsp" />
   </c:if>
  </c:if>
  </c:forEach>
 </c:otherwise>
</c:choose>

下面的代碼檢查當 post 該頁面時,參數 nodirectflights 是否被設為 true。如果繼續查看該代碼,那麼可以發現,表單的動作是 post to the CheckFlightsServlet。根據用戶選擇的出發地和目的地,如果 CheckFlightsServlet 沒有任何直達航班,則參數 nodirectflights 被設為 true,用戶返回該頁面,這個代碼片段將顯示關於沒有直達航班的消息。

清單 5. 在 Welcome.jsp 中顯示關於是否有直達航班的消息

<c:if test="${nodirectflights == 'true'}" >
<p>
There were no direct flights between <font color="blue" size="5">
${cityNameFrom}</font> and <font color="blue" size="5">
${cityNameTo}</font>. <br>
Please select another flight. 
</p>
</c:if>

您可以使用 JSTL core out 標記來顯示傳遞給 JSP 的會話對象或請求對象中的參數。登錄成功之後,用戶 ID 被放入 Session 對象,並且在用戶訪問 Welcome.jsp 頁面時顯示在該頁面上。而且,注意用於包括 CalendarServlet 的 jsp:include 標記,CalendarServlet 用於顯示當前的月、日和年,並且有一個用於選擇出發日期的下拉框。

清單 6. 成功登錄之後

<H3>
Welcome to Derby Air, <c:out value="${username}" />!</H3>
<p>
Please proceed to select a flight. 
</p>
<form action="CheckFlightsServlet" method="post">

<table width="50%">
<tr>
 <td valign="top">
 <b>Departure Date:</b><br>
 <jsp:include page="/CalendarServlet">
  <jsp:param name="type" value="orig" />
 </jsp:include>
 </td>

下面這段代碼使用 JSTL SQL 庫。在像下面這樣使用 sql:query 標記之前,您已經在應用程序的 web.xml 文件中設置了 DataSource。以後將討論那個條目,但是現在請注意這個標記使用起來有多麼容易。代碼中發出對 CITIES 表的查詢,以返回 APP.CITIES 表的 city_name、country 和 airport 列中所包含的值。查詢的結果放在一個名為 cities 的變量中,這是一個 javax.servlet.jsp.jstl.sql.Result 對象。Result 對象有一個名為 getRows() 的方法,該方法返回對象中包含的所有行。這些行作為一個 java.util.SortedMap 對象數組返回。

清單 7. 使用 SQL 標記庫

<sql:query var="cities">
 SELECT CITY_NAME, COUNTRY, AIRPORT FROM APP.CITIES ORDER BY \ 
 CITY_NAME, COUNTRY
</sql:query>

下面展示了通過 forEach 標記對 cities Result 對象中包含的行的迭代。在對這個數組的每一次迭代中,變量 city 包含一個 SortedMap 對象。Expression Language 允許通過引用表示數據庫中一行的特定 SortedMap 對象中的列名,來訪問每個行中的每個列。

清單 8. 輸出 SQL 查詢的結果

<td>
 <b>Origin:</b><br>
 <select name="from" size="4">
 <c:forEach var="city" items="${cities.rows}">
 <option value="${city.airport}"> ${city.city_name}, ${city.country}\ 
 </option>
</c:forEach>
 </select>
 <br><br>
 </td>
</tr>

這裡不顯示該頁面的其他部分。這段代碼像前面生成 Origin 一樣輸出 Destination 下拉框,然後提供一個按鈕,以便用戶提交查詢來查看出發地(Origin)和目的地(Destination)之間的航班。

考察控制流並運行應用程序

在運行 LowFare Air 之前,如果 Derby Network Server 還沒有運行,那麼需要啟動它。右鍵單擊 LowFareAir 文件夾,然後選擇 Apache Derby > Start Derby Network Server。

現在右鍵單擊 Project Explorer 視圖中的 Welcome.jsp 文件。選擇 Run As > Run On Server。

圖 11. 在 Tomcat Server 上運行 Welcome.jsp

這樣將彈出 Run on Server 向導。按照下面的步驟完成該向導:

選擇 localhost 作為 Server 的主機名。對於服務器類型,展開 Apache 文件夾並選擇 Tomcat v5.0。 選中 Set server as project default 復選框。單擊 Next 按鈕。

在 Add and Remove Projects 窗口中,確信 LowFareAir 項目列出在 Configured Projects 區域中。如果 LowFareAir 項目沒有出現在那裡,而是出現在 Available Projects 類別中,那麼將它轉移到 Configured Projects 類別中。單擊 Finish。

這將啟動外部的 Tomcat 服務器,並打開一個浏覽器窗口,以便在這個窗口運行 JSP。在 Windows 中,默認情況是在 Eclipse 中打開一個內部浏覽器。而在 Linux 中,默認情況是打開外部浏覽器。

為了配置外部浏覽器的啟動:

選擇 Window > Preferences。

選擇 General 樹項,然後選擇 Web Browser。

選擇 Use external Web browser 按鈕,然後從列表中列出的可用浏覽器中選擇一個。

單擊 OK 設置首選項。

用不同的浏覽器檢查 Web 頁面總是一個很好的習慣。不同的浏覽器在呈現一些 HTML 元素以及處理 cookie 的默認方式上會有一些差異。

如前所述,第一次打開 Welcome.jsp 時,會轉入 Register.jsp 頁面。 由於還沒有設置 derbyCookie,所以 Welcome.jsp 會將您帶到 Register.jsp,以便創建一個用戶 ID 和密碼。見圖 12。

圖 12. 帶新用戶 ID 條目的 Register.jsp

當您輸入一個用戶 ID 和密碼,並單擊 Register New User 按鈕時,這些值被傳遞給 LoginServlet 類。現在打開這個 Java 類,這個類位於 LowFareAir > Java Resources > JavaSource > com.ibm.sample 文件夾和包結構下。

doPost 方法首先解析傳入的參數,包括您剛才在 Register.jsp 中設置的用戶 ID 和密碼。

清單 9. LoginServlet 類的 doPost 方法

protected void doPost(HttpServletRequest request,
 HttpServletResponse response) throws ServletException, IOException 
{ 
 String user = request.getParameter("username");
 String password = request.getParameter("password");
 // Register.jsp set the parameter newuser
 String newUser = request.getParameter("newuser");
 String loggedOut = request.getParameter("loggedOut");

然後,它通過調用 DerbyDatabase 類的 getConnInstance() 方法連接到 Derby 數據庫。getConnInstance 方法返回一個到數據庫的單態 java.sql.Connection。

清單 10. 將 conn 變量設置為 DerbyDatabase 類的單態 Connection 對象

Connection conn = DerbyDatabase.getConnInstance();

下面一段代碼確定用戶是否為新用戶,如果用戶 ID 已存在,那麼從數據庫中選擇用戶 ID,否則,將用戶 ID 添加到數據庫。

清單 11. 在 LoginServlet 類中處理新用戶

// the user is not new, so look up the username and password 
// in the APP.USERS table 

if (newUser == null || newUser.equals(""))
{ 
 sql = "select * from APP.USERS where username = '" + user
    + "' and password = '" + password + "'";
 String[] loginResults = DerbyDatabase.runQuery(conn, sql);

 // if the query was successful one row should be returned 
 if (loginResults.length == 1)
 { 
 validUser = true;
 }
}
// the user is new, insert the username and password into 
// the APP.USERS table 
else 
{ 
 sql = "insert into APP.USERS (username, password) values " + "('" 
 + user + "', '" + password + "')";
 int numRows = DerbyDatabase.executeUpdate(conn, sql);
 if (numRows == 1)
 { 
 validUser = true;
 }
}

為驗證用戶 ID Susan 是否被添加到 APP.USERS 表中,打開 Derby 插件中的 SQL 工具 ij,查詢 APP.USERS 表。

為了打開 ij,右鍵單擊 LowFareAir 文件夾,然後選擇 Apache Derby > ij (Interactive SQL)。 從 ij 中發出 connect 語句連接到 airlinesDB 數據庫,並運行查詢 select * from APP.USERS;,看看您輸入到浏覽器中的用戶 ID 是否出現在這裡。在這個例子中,用戶 ID 是 Susan。

注意:對於在控制台視圖中光標的位置,3.1 版的 Eclipse 與之前的版本相比有些不同。光標總是停留在一行的開始處。雖然看上去有些古怪,但是如果您開始在 ij 提示符下輸入內容,光標又會回到適當的位置,也就是在 ij 中的 'j' 之後。

清單 12. 連接到 airlinesDB 數據庫

connect 'jdbc:derby://localhost:1527/airlinesDB';
select * from APP.USERS;

ij 的輸出如下所示。

圖 13. 來自 APP.USERS 表的 ij 結果

Register.jsp 正確地傳遞這些值,而 LoginServlet.java 則將用戶 ID 和密碼正確地插入到表中。這樣,用戶 ID 'slc' 和密碼 'slc' 便已經在表中。

LoginServlet.java 中的其他代碼處理不正確的用戶 ID 和密碼,然後,如果一切沒問題,則將結果送到 Welcome.jsp。下圖展示了 Origin 為 Albuquerque、Destination 為 Los Angeles 時的 Welcome.jsp。注意,用戶 ID 被從 LoginServlet.java 傳遞到 Welcome.jsp,以便顯示。

圖 14. 成功登錄之後的 Welcome.jsp

Welcome.jsp post 到 CheckFlightsServlet.java。打開 CheckFlightsServlet.java。關於這個 servlet 要注意的一點是,在解析傳入的參數之後,它調用 DerbyDatabase 方法 origDestFlightList()。這個方法返回一個 FlightsBean 對象數組。

清單 13. CheckFlightsServlet 類

Connection conn = DerbyDatabase.getConnInstance();

FlightsBean[] fromToFlights = \ 
 DerbyDatabase.origDestFlightList(conn, from, to);

當 FlightsBean 數組填充了內容之後,CheckFlightsServlet 將結果放入變量名為 fromToFlights 的會話對象。

清單 14. 將 FlightsBean 數組放入會話對象

request.getSession().setAttribute("fromToFlights", fromToFlights);

現在打開 DerbyDatabase.java 類,看看這個方法做些什麼。為便於查看,其中部分代碼的格式稍微作了調整。

清單 15. 查看 DerbyDatabase 類中的 origDestFlightList 方法

public static FlightsBean[] origDestFlightList(Connection conn, \ 
 String origAirport, String destAirport)
{ 
 String query = "select flight_id, segment_number, orig_airport, " +
 "depart_time, dest_airport, arrive_time, meal, flying_time, miles," +
 "aircraft from app.flights where ORIG_AIRPORT = ? AND " +
 "DEST_AIRPORT = ?";
 List list = Collections.synchronizedList(new ArrayList(10));

 try
 {       
 PreparedStatement prepStmt = conn.prepareStatement(query);
 prepStmt.setString(1, origAirport);
 prepStmt.setString(2, destAirport);
 ResultSet results = prepStmt.executeQuery();

 while(results.next())
 { 
  String flightId = results.getString(1);
  String segmentNumber = results.getString(2);
  String startAirport = results.getString(3);
  String departTime = results.getString(4);
  String endAirport = results.getString(5);
  String arriveTime = results.getString(6);
  String meal = results.getString(7);
  String flyingTime = String.valueOf(results.getDouble(8));
  String miles = String.valueOf(results.getInt(9));
  String aircraft = results.getString(10);

  list.add(new FlightsBean(flightId, segmentNumber, startAirport,
  departTime, endAirport, arriveTime, meal, flyingTime, miles, aircraft));
 }
 results.close();
 prepStmt.close();
 }
 catch (SQLException sqlExcept)
 { 
 sqlExcept.printStackTrace();
 }

 return (FlightsBean[])list.toArray(new FlightsBean[list.size()]);
}

origDestFlightList 方法使用 PreparedStatement 發出一個 SQL 查詢,然後將結果放入一個 FlightsBean[] 數組。下面顯示了 FlightsBean 的一個構造函數。

清單 16. FlightsBean 的一個構造函數

public FlightsBean(String flight_id, String segNumber,
 String origAirport, String depart_time, String destAirport,
 String arrive_time, String food, String flying_time,
 String mile, String jet)
{ 
 flightId = flight_id;
 segmentNumber = segNumber;
 startAirport = origAirport;
 departTime = depart_time;
 endAirport = destAirport;
 arriveTime = arrive_time;
 meal = food;
 flyingTime = flying_time;
 miles = mile;
 aircraft = jet;
}

當 origDestFlightList 方法填充好 FlightsBean 數組後,CheckFlightsServlet servlet 繼續進行處理,結果被傳到 GetFlights.jsp 頁面。

在下一節中,您將使用 WTP 的 JSP 調試器來查看當選擇一個航班時 FlightsBean 中返回的值。

下一節將以 debug 模式啟動 Tomcat 服務器,所以這裡先停止 Tomcat 服務器。為此,選擇工作區右下角的 Servers view 選項卡。然後在 Tomcat Server 行單擊右鍵並選擇 Stop。

圖 15. 在 WTP Servers 視圖中停止 Tomcat 服務器

使用 JSP Debugger

對於代碼的研究先告一段落,這裡總結一下您通過探索和配置示例應用程序所看到的東西:

WTP

通過 Database Explorer 視圖配置到使用 Derby Client 驅動程序的 Derby 10.1 數據庫的連接。

從 Database Explorer 視圖抽取 FLIGHTS 表中的內容。

在 Database Explorer 視圖中,使用 Data > Open 菜單項插入一行到 FLIGHTS 表。

從一個 JSP 文件上使用 Run As > Run On Server 選項啟動 Tomcat 服務器。

在 JSP 編輯器中打開和查看 JSP。

使用 Servers 視圖停止 Tomcat 服務器。

Derby 插件

添加 Apache Derby 特性到動態 Web 項目中。

使用 Project Properties 菜單配置 Derby 系統屬性。

通過 ij 運行整個 SQL 腳本。

通過 ij 發出 SQL 命令。

啟動和停止 Derby Network Server。

現在讓我們來看 WTP 的 JSP 調試功能。

現在,在 Derby airlinesDB APP.USERS 表中至少有一個有效的用戶,您可能還添加了其他用戶。在運行整個應用程序之前,先在 GetFlights.jsp 頁面中設置一個斷點,然後以 debug 模式啟動 Tomcat 服務器。

為設置斷點,打開 GetFlights.jsp,在以 <c:set var="myradiobutton" 開始的那行代碼左邊的灰色區域單擊右鍵。選擇 Toggle Breakpoints,如下所示。

圖 16. 在 GetFlights.jsp 中設置斷點

這個斷點在左邊的灰色區域看上去像一個藍點。現在從 Project Explorer 中(確保 Derby Network Server 仍在運行),右鍵單擊 Welcome.jsp 並選擇 Debug As > Debug On Server。Tomcat Server 現在將以 Debug 模式啟動,並進入 Welcome.jsp 頁面,該頁面提示輸入用戶 ID 和密碼。

輸入您之前輸入過的用戶 ID 和密碼,或輸入 slc 作為用戶 ID,slc 作為密碼。如果您沒有刪除已經設置好的 cookie,那麼您不必再次登錄,就可以在 Welcome.jsp 中選擇航班。Origin to Destination 中列出的航班並不都是直達的。選擇 Albuquerque 作為 Origin,選擇 Los Angeles 作為 Destination,因為這個航班是直達的。然後單擊 Submit Query。

這時,Eclipse 應該提示您切換到 Debug 透視圖。確認切換透視圖。當出現 debug 透視圖時,在工作區的右上角將出現 Variables 視圖。在左下角,還將出現 GetFlights.jsp 編輯器視圖,這個視圖表明您設置斷點的位置。

Variables 視圖可能不會立即有值出現。您可能需要進入 Debug 視圖,並選擇已經被掛起的線程。如下所示,當您在 Debug 視圖中展開掛起的線程,並選擇 GetFlights.jsp 時,Variables 視圖中將出現值。

在 Variables 視圖中,查找您的 core JSTL when 標記。展開樹,找到 _jspx_th_c_when_0=WhenTag 項。見圖 17。

圖 17. 從 JSP Debug 透視圖中查看變量

注意 WhenTag 中對父標記 ChooseTag 的引用。展開父標記 ChooseTag,一起的還有父標記 ForEachTag。展開 ForEachTag,最後展開等於 FlightsBean 的變量。如果您成功地執行了這一系列動作,那麼 Variables 視圖看上去應該如下所示。

圖 18. Debug 模式下的 FlightsBean 值

這個視圖顯示 FlightsBean 對象中的值,這是在選擇啟程機場為 Albuquerque,目的機場為 Los Angeles 的情況下得到的。當為 Web 應用程序排除故障,特別是像這裡那樣查看變量時,JSP 調試器極為有用。

現在單擊左上角菜單項上的 Resume 按鈕(看上去像一個綠色的箭頭),以跳過斷點。浏覽器將顯示 GetFlights.jsp 頁面的輸出。在浏覽器中,選擇可用的航班(航班 AA1111),並單擊 Book Flight 按鈕。

接下來的頁面給您最後一次機會預訂當前航班或者查看其他航班。單擊 Book Flight 按鈕繼續。 接下來的頁面將如下所示。

圖 19. Flight History

當您在前一個屏幕上單擊 Book Flight 時,將有一行被插入到 APP.FLIGHTHISTORY 表中。由於您已經知道如何使用 ij 和 Database Explorer,您可以驗證這一行是否真的插入到了表中。

至此,用戶可以返回並選擇一個新的航班,或者退出應用程序。

結束語

在安裝和配置 WTP 平台的過程中,您使用了外部的 Tomcat 服務¡器,調試了一個 JSP 文件,使用 Database Explorer 配置了到 10.1 Derby 數據庫的一個連接,並使用了 Database Explorer 來浏覽一個表以及插入一行。

您學習了 Derby 插件的用法,包括添加 Apache Derby 特性,啟動和停止 Network Server,使用 ij 運行 SQL 腳本和發出即席 SQL,以及設置 derby.system.home 屬性。

您配置了 Web 應用程序的 web.xml 文件,以便使用 Derby 作為數據源。

最後,您使用 JSTL SQL 標記庫對被配置為數據源的 Derby 數據庫發出查詢。

本文有望為使用 WTP 和 Derby 插件中的多種工具提供一個堅實的基礎。以這些基礎為起點,您可以開發健壯的使用 Derby 作為數據源的 Web 應用程序。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved