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