使用何種技術
我使用Tomcat 4的Servlet/JPS容器技術實現一個Web應用程序。這個過程中仍然有許多不確定的事,在多種可行的技術中選一種可不是一件容易的事。這篇文章中,我選擇盡量簡單的解決方案,混合使用Java Server Pages(JSPs)以及Java。
應當盡量避免使用JSPs實現復雜邏輯;那種程序也許容易寫,但難以調試而且幾乎不可能被理解和維護。好的解決方案是用JSPs負責Web頁面的顯示(這正是JSPs擅長的),把復雜邏輯的實現交給Java,如對數據庫的訪問。這樣,程序不但比較容易實現和調試,而且易于理解和維護。
這個Web應用程序可以運行在專用Web服務器或者是個人電腦上,操作系統可以是Windows,Linux,或者Mac OS。所需的軟件包有Java運行時環境(JDK1.2或以上版本),Tomcat最新版本(Tomacat 4或以上版本),以及Ant開發工具(Ant 1.4或以上版本)。Ant用于創建Web應用程序包(WAR),以及在Tomcat上安裝部署WAR文件,配置關系數據庫接口javax.sql.DataSource。所有以上提到的軟件包都可以通過Internet免費獲得。
這個Web應用程序還需要一個數據庫。幾乎所有支持SQL而且有JDBC驅動的關系數據庫都可以。MySQL是一個符合條件的不錯選擇。從MySQL.com可以得到MySQL的最新版本以及它的JDBC驅動Connector/J。
為了讓Ant與Tomact管理軟件協同工作,需要將catalina-ant.jar從Tomcat的server/lib目錄拷貝到Ant的lib目錄下。將你的數據庫JDBC驅動程序復制到Tomcat的common/lib目錄下使Tomcat和其上的Web應用程序可以訪問數據庫。最后,必須建立Tomcat的admin和manager角色(roles),及其用戶名和密碼,編輯Tomcat的conf目錄下的tomcat-user.xml文件如下:
我的開發環境是Apple Cube,運行Mac OS X 10.2.1操作系統,軟件包JDK 1.3.1,Tomcat 4.1.12,Ant1.5.1,MySQL 3.23.52,及Connector/J 3.0.1-beta。操作系統升級到Mac OS X 10.2.2未出現任何問題。同樣Tomcat升級到4.1.17也沒出現問題。
Web應用程序
本文通過一個叫做AddressBook的簡單地址簿程序來說明如何應用將要介紹的技術。這個應用程序的目的不是建立一個地址簿的正式版本,它僅僅是一個例子。
AddressBook中的Java程序: AddressBook中包含三個Java程序。圖1顯示了他們在Tomcat中的是如何使用的。
Home.jsp: Home.jsp是AddressBook的主頁,也就是用戶使用AddressBook時見到的第一個頁面。它用一個表顯示Address庫中的所有地址。表中的每一行顯示一個地址,以及刪除或修改地址的連接。頁面底部有一個添加新地址的連接。配置信息見web.xml notes。
添加地址連接將控制權交給RequestAdd.jsp
刪除地址連接將控制權交給RequestDelete.jsp,同時將要刪除的地址id傳遞給該頁
修改地址連接將控制權交給RequestModify.jsp,同時將要修改的地址id傳遞給該頁
細節請看Home.jsp的完整的帶有注釋的源代碼。
RequestAdd.jsp: RequestAdd.jsp提供一個地址表單用于輸入新地址。頁面底部的取消連接可以取消這次操作。
提交表單將新的地址域值以及控制權交給DoAdd.jsp
取消操作將控制權交給Home.jsp。細節請看RequestAdd.jsp的完整的,帶有注釋的源代碼。
DoAdd.jsp: DoAdd.jsp顯示接收到的地址域值。然后將新地址添加到數據庫并顯示是否成功的信息。頁面底部有一個繼續連接。
點擊繼續連接回到Home.jsp。細節請看DoAdd.jsp的完整的,帶有注釋的源代碼。
RequestDelete.jsp: RequestDelete.jsp讀取得到的id相應的地址。該頁面在表中顯示地址域以便讓你確認刪除的是正確的地址。頁面底部的兩個連接分別是繼續請求的繼續連接和取消請求的取消連接。
選擇繼續連接將轉到DoDelete.jsp并傳遞要刪除的地址id
選擇取消連接回到Home.jsp。細節請看RequestDelete.jsp的完整的帶有注釋的源代碼。
DoDelete.jsp: DoDelete.jsp讀取傳遞給它的id。在表中顯示該id對應的地址,從數據庫中刪除它,并顯示是否成功。頁面底部是繼續連接。
選擇繼續連接回到Home.jsp。細節請看DoDelete.jsp的完整的,帶有注釋的源代碼。
RequestModify.jsp: RequestModify.jsp顯示一個表單并填入當前的地址,同時提供提交按鈕和取消連接。
提交表單將新的地址域值以及控制權交給DoModify.jsp
選擇取消連接回到Home.jsp。細節請看RequestModify.jsp的完整的,帶有注釋的源代碼。
DoModify.jsp: DoModify.jsp顯示接收到的修改的地址域值。然后修改數據庫中的地址記錄,并返回成功與否。頁面底部是繼續連接。
選擇繼續連接回到Home.jsp。細節請看DoModify.jsp的完整的,帶有注釋的源代碼。
AddressBook的Addresses數據庫表: 如何建立數據庫取決于所用的數據庫軟件。若你用的不是MySQL以下的步驟就需要根據情況修改。AddressBook只有一個表Addresses,保存在數據庫Public中。表Addresses有七個域:
id,主鍵,自動增長的數據域
surname,長度為24的字符域,保存聯系人的姓
firstname,長度為24的字符域,保存聯系人的名
street,長度為80的字符域,保存地址的第一行
district,長度為80的字符域,保存地址的第二行
city,長度為40的字符域,保存城市名
postcode,長度為10的字符域,保存郵政編碼
首先建立MySQL數據庫(Mac OS X 10.2.1)。用管理員權限啟動mysql命令行工具,需要的話輸入密碼。創建Public數據庫,以及賬號mysqlusername密碼mysqlpassord。命令如下:
# mysql -u root -pmysql> create database Public;mysql> grant all privileges on Public.* to mysqlusername@localhostidentified by 'mysqlpassword' with grant option;mysql> flush privileges;
然后,在Public數據庫中創建Addresses表。
mysql> create table Addresses ( id int(8) primary key auto_increment, surname varchar(24) not null, firstname varchar(24) not null, street varchar(80) not null, district varchar(80) not null, city varchar(40) not null, postcode varchar(10) not null );
用命令Commit;提交。要檢查對表的操作是否正確,鍵入命令describe Addresser;,將得到如下結果:
+-----------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+-----------+-------------+------+-----+---------+----------------+| id | int(8) | | PRI | NULL |auto_increment|| surname | varchar(24) | | | | || firstname | varchar(24) | | | | || street | varchar(80) | | | | || district | varchar(80) | | | | || city | varchar(40) | | | | || postcode | varchar(10) | | | | |+-----------+-------------+------+-----+---------+----------------+
現在可以插入一行來測試數據庫
mysql> insert into Addresses (surname, firstname, street, district,city, postcode) values ("Smith", "John", "1, The High Street,","Downtown,", "Metropolis.", "X99 9XX");mysql> commit;mysql> select * from Addresses;
結果如下:
注意地址的id被自動賦予值1。至此AddressesBook的數據庫創建完成。
配置AddresBook的開發目錄
現在我們配置存放AddressBook源文件的目錄,以及Web應用程序的war目錄,它也是存放Web應用程序包的目錄。下載AddressBook源程序壓縮包。解壓后將得到Ant能夠處理的源程序目錄結構,如圖3所示。不需要對AddressBook的開發目錄進行特殊改變?建議將其解壓至你的home目錄(Mac OS)。
讓我們看看這些文件:
AddressBook/build.properties: AddressBook/build.properties含有若干被AddressBook/build.xml讀取得設置信息。定制build過程時,盡量編輯較小的build.properties文件,而不要修改復雜的多的build.xml文件。
app.name=AddressBooktomcat.home=/usr/local/jakarta-tomcat-4.1.12manager.url=http://localhost:8080/managerusername=tomcatusernamepassword=tomcatpassword
app.name參數不需要修改。如果將來要重用這些文件創建新的Web應用程序時把該參數改為新的程序名。如果在本地機器上運行Tomcat 4,則manager.url參數也不必修改。
tomcat.home參數為Tomcat的安裝目錄,以上的設置表示Tomcat 4.1.12安裝在/url/local目錄下(Mac OS)。Ant將根據這個參數設置編譯AddressBook時的CLASSPATH變量,使它包含Tomcat的common/lib.jar文件。(這樣Tomcat 和Web應用程序都可以直接訪問這個文件,而不必將其復制到應用程序的WEB-INF/lib目錄下。)
Tomcat也有一個類似的目錄:shared/lib,給目錄下的.jar文件在運行時對于應用程序是可訪問的,但對Tomcat是不可訪問的。
參數tomcatusrename和tomcatpassword必須與Tomcat的配置文件conf/tomcat-users.xml中的設置一致。Ant使用它們以及manager.url取得在Tomcat環境中安裝AddressBook應用的權限。
細節請看build.properties的完整帶有注釋的源代碼。
AddressBook/build.xml: AddressBook/build.xml文件是Ant的配置文件,它使用許多Ant的標簽。以下是比較常用的:
? ant build 創建Web應用程序
? ant install 安裝Web應用程序用于測試
? ant remove 卸載Web應用程序
? ant deploy安裝部署Web應用程序
? ant undeploy卸載Web應用程序
細節請看build.xml的完整的帶有注釋的源代碼。
AddressBook/context.xml: AddressBook/context.xml是在Ant處理安裝、重新載入、刪除、部署、卸載請求時裝入Tomcat中的。給文件記錄的是AddressBook的上下文信息,或者是Tomcat運行AddressBook需要的參數。
Logger項定義了Tomcat用文本格式記錄AddressBook的事件日志,并存放于Tomcat的logs目錄下。以下Logger項定義了名為localhost_AddressBook_log.YYYY-MM-DD.txt的日志文件,其中YYYY-MM-DD為日志日期:
Resource和ResourceParams項定義Tomcat必須為AddressBook創建一個叫jdbc/Publicd的javax.sql.DataSource。以下設置創建了一個javax.sql.DataSource,其值為org.apache.commons.dbcp.BasicDataSourceFactory類,URL為jdbc:mysql://localhost:3306/Public?autoReconnect=true,JDBC驅動:org.gjt.mm.mysql.Driver,用戶名和密碼分別為:mysqlusername和mysqlpassword:
以上代碼將javax.sql.DataSource作為該Web應用程序的上下文變量。如果該變量不止被一個Web應用用到,可以將它定義為全局資源。細節請看context.xml的完整的帶有注釋的源代碼。
AddressBook/src/*.java: src目錄中存放Web應用的三個Java程序。見Address.java,AddressesDB.java和ContextListener.java的描述。
AddressBook/web/*.jsp: web目錄存放Web應用的七個JSP頁面。見Home.jsp, RequestAdd.jsp, DoAdd.jsp, RequestDelete.jsp, DoDelete.jsp, RequestModify.jsp, 和 DoModify.jsp的描述。
AddressBook/web/WEB-INF/web.xml: AddressBook/web/WEB-INF/web.xml是AddressBook的web應用部署描述文件。其中包含兩個主要參數:listener參數定義了Java類監聽器AddressBook.ContextListener,在程序啟動和關閉是被調用。
welcom-file-list參數定義了AddressBook的首頁。如下設置定義AddressBook的首頁為Home.jsp。
細節請看web.xml的完整的,帶有注釋的源代碼。
創建,安裝,部署和運行AddressBook: 安裝AddressBook是先將當前目錄改為AddressBook目錄,然后運行Ant的install命令:
$ cd AddressBook$ ant install
如果安裝失敗,檢查Tomcat的conf目錄下的tomcat-user.xml是否配置正確,以及catalina-ant.jar是否從Tomcat的server/lib目錄下拷貝到Ant的lib目錄。
注意ant install自動觸發運行Ant的若干個標簽,依次為ant int,ant prepare,ant build和ant package:
? ant init初始化時間戳
? ant prepare在AddressBook目錄下創建war目錄結構,包括:一個war目錄,一個war/WAR-INF目錄,一個war/WEB-INF/classes目錄,及一個war/WEB-INF/lib目錄。
? ant build創建Web應用程序,包括將jsp文件拷貝到war目錄下,將context.xml文件拷貝到war/META-INF目錄下,將web.xml文件拷貝到war/WEB-INF目錄下,并編譯Java文件結果存入war/WEB-INF/classes目錄下。
? ant package從war目錄創建Web程序包。Web程序包是由jar工具創建的.jar文件。
? 最后,ant install根據war/META-INF/context.xml的配置信息將Web程序包安裝到Tomcat中。你可能注意到不需要登陸root權限或Tomcat就可以安裝AddressBook,只要你的普通用戶賬號即可。Ant用定義在AddressBook/build.properties中的tomcatusername和tomcatpassword即可安全的執行以上過程。
安裝過程因配置選項不同而不同,配置信息具體見AddressBook/build.xml。圖4顯示了構成AddressBook Web應用程序的war目錄結構以及各種文件。
在瀏覽器地址欄中輸入地址http://localhost:8080/AddressBook測試AddressBook程序。應該得到如圖5的顯示結果。如果應用程序沒有正確運行,先檢查Tomcat的common/lib目錄下有沒有數據庫的JDBC驅動程序。如果數據庫驅動正確應用程序仍然不正確運行,則檢查Tomcat的log目錄下的日志文件,這些文本格式的日志文件將幫助你發現錯誤。
添加地址,然后修改它,再刪除它,再添加一個地址。你將看到id持續自動增加。
開發過程
AddressBook安裝成功之后,Tomcat調用AddressBook.ConextListener.contextInitialized創建AddressBook.AddressesDB的一個實例。AddressBook.AddressesDB通過jdbc/Public DataSource建立數據庫連接。AddressBook.ConextListener.contextInitialized將AddressBook.AddressesDB的實例作為一個servlet屬性(addressesDB)保存。
當AddressBook的Home.jsp第一次被調用,Tomcat編譯并執行它。Home.jsp通過servlet屬性addressesDB取得AddressBook.AddressesDB的實例,然后從數據庫中讀取地址并顯示。其他JSP頁面在第一次被使用時也要先編譯再執行,讀取數據庫的方法同Home.jsp。
ant stop用于停止AddressBook程序。Tomcat自動調用AddressBook.ContextListener.contextDestroyed取得上面提到的servlet屬性addressesDB和AddressBook.AddressesDB的實例,關閉數據庫連接并刪除servlet屬性addressesDB。
ant start用于啟動AddressBook程序。Tomcat自動調用AddressBook.ConextListener.contextInitialized重復啟動過程。
整個Web應用程序的開發過程是這樣的:修改程序;用ant install創建并安裝;在瀏覽器中鍵入地址http://localhost:8080/applicationName(或點擊刷新按鈕)以測試Web程序;用ant remove刪除Web應用程序的上下文信息;重復整個過程,直到調試完畢。當程序調試完畢后,使用ant deploy正式將你的程序配置到服務器上。在重起Tomcat或者重起服務器后,你的應用程序就開始運行了。要將Web應用程序從你的服務器徹底刪除用ant undeploy命令。
Tomcat Manager
使用Tomcat Manager可以替代Ant。在瀏覽器中鍵入地址http://localhost:8080/manager/html/list,將出現如圖6所示的Tomcat Manager Web頁面。
或者,直接使用以下地址:
http://localhost:8080/manager/list
http://localhost:8080/manager/resources
http://localhost:8080/manager/roles
http://localhost:8080/manager/start?path=/AddressBook
http://localhost:8080/manager/stop?path=/AddressBook
http://localhost:8080/manager/remove?path=/AddressBook
http://localhost:8080/manager/sessions?path=/AddressBook
Tomcat Administrator
要登陸Tomcat的基于Web的administrator,使用地址http://localhost:8080/admin。在登陸畫面中輸入Tomcat”admin”角色的用戶名和密碼,與”manager” 角色的相同為tomcatusername和tomcatpassword。Tomcat-users.xml文件為admin,manager以及provider角色建立了相同的賬號。為每個Tomcat角色建立不同的賬號是不必要的。
控制頁面分為三個面板:頭面板,樹面板和數據面板。如圖7所示:
樹的分支可被展開和選定。依次展開Service{Tomcat-Standalone} ->Host{localhost}->Context{/AddressBook},最后AddressBook的Resource分支。注意不要將樹底部的全局Resource分支與AddressBook的Resource分支混淆。全局Resource分支可以用來定義任何Web應用程序都可用的全局資源。
AddressBook的上下文面板
選擇Context{/AddressBook}分支,將看到AddressBook的上下文面板(如圖8)。
你可以隨意改變該面板的參數,主要是三種不同的Debug Level參數。要保存設置點擊Save按鈕然后點擊頭面板中的Commit Changes按鈕。
AddressBook的Data Source面板
選擇Context{/AddressBook}的Resource分支中的Data Source分支,你將看到AddressBook的Data Source面板。選擇數據源jdbc/Public顯示javax.sql.DataSource(如圖9)。
你可以隨意改變該面板的參數,包括Data Source URL, JDBC Driver Class, User Name, Password, Max. Active Connections, Max. Idle Connections和 Max. Wait for Connection參數。要保存設置點擊Save按鈕然后點擊頭面板中的Commit Changes按鈕。
如果你在你的個人電腦上運行Web應用程序,這也許不重要,但是如果在作為公司產品的Web服務器,這就很重要。這些參數可以被安全的改變,而且不是只有程序員能夠更改,Tomcat administrator同樣可以。作為一個程序員我要記住許多賬號和密碼,我不想知道公司的產品數據庫的賬號和密碼。本來這個賬號和密碼是必要的,但是有了javax.sql.DataSource和Tomcat 4的administrator服務,我就不必知道它們了。
Ant用于在開發軟件時建立Web應用程序上下文,而Tomcat administrator服務用在產品環境中。
AddressBook的日志面板
選擇樹中的Context{/AddressBook}分支的Logger for Context{/AddressBook}分支,將看到如圖10所示的AddressBook的日志面板
你可以隨意改變該面板的參數,主要是Debug Level和Verbosity Level參數。要保存設置點擊Save按鈕然后點擊頭面板中的Commit Changes按鈕。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com