要掌握J(rèn)ava Web開(kāi)發(fā),首先就要學(xué)會(huì)編寫(xiě)Servlet,而要運(yùn)行Servlet,則需要一個(gè)Servlet容器,本書(shū)選用的是Tomcat。下面讓我們來(lái)了解一下Servlet和Tomcat。 1.1 Web技術(shù)的發(fā)展隨著Internet的發(fā)展,基于HTTP協(xié)議和HTML標(biāo)準(zhǔn)的Web應(yīng)用呈幾何數(shù)量級(jí)的增長(zhǎng),人們的生活在不知不覺(jué)中已經(jīng)被網(wǎng)絡(luò)悄悄地改變了。在網(wǎng)絡(luò)普及之前,我們購(gòu)買(mǎi)圖書(shū)要去書(shū)店,給親人匯錢(qián)要去郵局或者銀行……而現(xiàn)在,一切都是這么便捷,你可以在網(wǎng)上購(gòu)買(mǎi)圖書(shū)、匯款、繳納電話費(fèi),你甚至可以為遠(yuǎn)在他鄉(xiāng)的女朋友訂購(gòu)一束玫瑰。各種各樣的網(wǎng)上業(yè)務(wù)豐富了我們的生活,節(jié)省了我們的時(shí)間,提高了我們的工作效率,改善了我們的生活品質(zhì)。支撐這些網(wǎng)上業(yè)務(wù)的就是各種各樣的Web應(yīng)用,而這些Web應(yīng)用又是用各種Web技術(shù)開(kāi)發(fā)的。 早期的Web應(yīng)用主要是靜態(tài)頁(yè)面的瀏覽(如新聞的瀏覽),這些靜態(tài)頁(yè)面使用HTML語(yǔ)言來(lái)編寫(xiě),放在服務(wù)器上;用戶(hù)使用瀏覽器通過(guò)HTTP協(xié)議請(qǐng)求服務(wù)器上的Web頁(yè)面,服務(wù)器上的Web服務(wù)器軟件接收到用戶(hù)發(fā)送的請(qǐng)求后,讀取請(qǐng)求URI所標(biāo)識(shí)的資源,加上消息報(bào)頭發(fā)送給客戶(hù)端的瀏覽器;瀏覽器解析響應(yīng)中的HTML數(shù)據(jù),向用戶(hù)呈現(xiàn)多姿多彩的HTML頁(yè)面。整個(gè)過(guò)程如圖1-1所示。 圖1-1 瀏覽器請(qǐng)求靜態(tài)頁(yè)面 隨著網(wǎng)絡(luò)的發(fā)展,很多線下業(yè)務(wù)開(kāi)始向網(wǎng)上發(fā)展,基于Internet的Web應(yīng)用也變得越來(lái)越復(fù)雜,用戶(hù)所訪問(wèn)的資源已不僅僅局限于在服務(wù)器硬盤(pán)上存放的靜態(tài)網(wǎng)頁(yè),更多的應(yīng)用需要根據(jù)用戶(hù)的請(qǐng)求動(dòng)態(tài)生成頁(yè)面信息,復(fù)雜一些的還需要從數(shù)據(jù)庫(kù)中提取數(shù)據(jù),經(jīng)過(guò)一定的運(yùn)算,生成一個(gè)頁(yè)面返回給客戶(hù)。例如,筆者通過(guò)Web瀏覽器想要查詢(xún)本公司一年的銷(xiāo)售報(bào)表,這個(gè)銷(xiāo)售報(bào)表是根據(jù)一年的銷(xiāo)售數(shù)據(jù)得出的,而這一年的銷(xiāo)售數(shù)據(jù)非常多,通常都是存儲(chǔ)在數(shù)據(jù)庫(kù)中,當(dāng)Web服務(wù)器端軟件接收到客戶(hù)端的請(qǐng)求,就需要從數(shù)據(jù)庫(kù)中提取一年的數(shù)據(jù),然后按照一定的統(tǒng)計(jì)規(guī)則,通過(guò)計(jì)算生成報(bào)表頁(yè)面,發(fā)送到請(qǐng)求者的Web瀏覽器端。類(lèi)似于上述的應(yīng)用還有很多,要為用戶(hù)提供各種各樣的增強(qiáng)功能,就需要我們?cè)赪eb服務(wù)端通過(guò)軟件來(lái)實(shí)現(xiàn)??墒沁@種實(shí)現(xiàn),如何才能完成呢? 了解HTTP協(xié)議的讀者,可能會(huì)想到,可以遵循HTTP協(xié)議實(shí)現(xiàn)一個(gè)服務(wù)器端軟件,提供增強(qiáng)功能。想法本身沒(méi)有錯(cuò)誤,但是由于HTTP協(xié)議服務(wù)器端的實(shí)現(xiàn)較為復(fù)雜,需要考慮很多方面,而且由于應(yīng)用的廣泛性,不可能針對(duì)每一種應(yīng)用都去實(shí)現(xiàn)這樣的一個(gè)HTTP服務(wù)器,所以這種方法在現(xiàn)實(shí)中不太可行。還有一種方法,就是利用已經(jīng)實(shí)現(xiàn)HTTP協(xié)議的服務(wù)器端軟件,而這些軟件預(yù)先為我們留出了擴(kuò)展的接口,我們只需要按照一定的規(guī)則去提供相應(yīng)的擴(kuò)展功能。當(dāng)這類(lèi)Web服務(wù)器接收到客戶(hù)請(qǐng)求后,判斷請(qǐng)求是否是訪問(wèn)我們提供的擴(kuò)展功能,如果是,就將請(qǐng)求交由我們所編寫(xiě)的程序去處理。當(dāng)處理完成后,程序?qū)⑻幚斫Y(jié)果交回Web服務(wù)器軟件,Web服務(wù)器軟件拿到結(jié)果信息后,再將結(jié)果作為響應(yīng)信息返回給客戶(hù)端。第二種方式的好處在于,我們不需要對(duì)HTTP協(xié)議有過(guò)多的了解,HTTP協(xié)議服務(wù)器端的實(shí)現(xiàn)已經(jīng)由Web服務(wù)器軟件完成了,我們只需要根據(jù)我們的應(yīng)用去開(kāi)發(fā)相應(yīng)的功能模塊,然后將這些功能模塊按照你所采用的Web服務(wù)器軟件的要求,部署到Web服務(wù)器中進(jìn)行集成。在用戶(hù)看來(lái),Web服務(wù)器端就是一個(gè)整體,在為他/她提供服務(wù)。 早期使用的Web服務(wù)器擴(kuò)展機(jī)制是CGI,它允許用戶(hù)調(diào)用Web服務(wù)器上的CGI程序。CGI的全稱(chēng)是Common Gateway Interface,即公共網(wǎng)關(guān)接口。大多數(shù)的CGI程序使用Perl來(lái)編寫(xiě),也有使用C、Python或PHP來(lái)編寫(xiě)的。用戶(hù)通過(guò)單擊某個(gè)鏈接或者直接在瀏覽器的地址欄中輸入U(xiǎn)RL來(lái)訪問(wèn)CGI程序,Web服務(wù)器接收到請(qǐng)求后,發(fā)現(xiàn)這個(gè)請(qǐng)求是給CGI程序的,于是就啟動(dòng)并運(yùn)行這個(gè)CGI程序,對(duì)用戶(hù)請(qǐng)求進(jìn)行處理。CGI程序解析請(qǐng)求中的CGI數(shù)據(jù),處理數(shù)據(jù),并產(chǎn)生一個(gè)響應(yīng)(通常是HTML頁(yè)面)。這個(gè)響應(yīng)被返回給Web服務(wù)器,Web服務(wù)器包裝這個(gè)響應(yīng)(例如添加消息報(bào)頭),以HTTP響應(yīng)的形式發(fā)送給Web瀏覽器。整個(gè)過(guò)程如圖1-2所示。 圖1-2 用戶(hù)訪問(wèn)CGI程序 然而CGI程序存在著一些缺點(diǎn),主要是CGI程序編寫(xiě)困難、對(duì)用戶(hù)請(qǐng)求的響應(yīng)時(shí)間較長(zhǎng)、以進(jìn)程方式運(yùn)行導(dǎo)致性能受限等。由于CGI程序的這些缺點(diǎn),開(kāi)發(fā)人員需要其他的CGI方案。1997年,SUN公司推出了Servlet技術(shù),作為Java陣營(yíng)的CGI解決方案。作為對(duì)微軟ASP技術(shù)(1996年推出)的回應(yīng),SUN公司于1998年推出了JSP技術(shù),允許在HTML頁(yè)面中嵌入Java腳本代碼,從而實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè)功能。與ASP、JSP類(lèi)似的服務(wù)器端頁(yè)面編寫(xiě)技術(shù)還有Rasmus Lerdorf于1994年發(fā)明的PHP技術(shù)。
Servlet與Servlet容器
Java Servlet(Java服務(wù)器小程序)是一個(gè)基于Java技術(shù)的Web組件,運(yùn)行在服務(wù)器端,由Servlet容器所管理,用于生成動(dòng)態(tài)的內(nèi)容。Servlet是平臺(tái)獨(dú)立的Java類(lèi),編寫(xiě)一個(gè)Servlet,實(shí)際上就是按照Servlet規(guī)范編寫(xiě)一個(gè)Java類(lèi)。Servlet被編譯為平臺(tái)獨(dú)立的字節(jié)碼,可以被動(dòng)態(tài)地加載到支持Java技術(shù)的Web服務(wù)器中運(yùn)行。目前Servlet規(guī)范最新的版本是2.5。 在上文中,出現(xiàn)了一個(gè)概念“Servlet容器”。那么什么是Servlet容器呢?Servlet容器有時(shí)候也叫做Servlet引擎,是Web服務(wù)器或應(yīng)用程序服務(wù)器的一部分,用于在發(fā)送的請(qǐng)求和響應(yīng)之上提供網(wǎng)絡(luò)服務(wù),解碼基于MIME的請(qǐng)求,格式化基于MIME的響應(yīng)。Servlet不能獨(dú)立運(yùn)行,它必須被部署到Servlet容器中,由容器來(lái)實(shí)例化和調(diào)用Servlet的方法,Servlet容器在Servlet的生命周期內(nèi)包容和管理Servlet。 在JSP技術(shù)推出后,管理和運(yùn)行Servlet/JSP的容器也稱(chēng)為Web容器。在本書(shū)中,Servlet容器、JSP容器,以及Web容器是同義的。 用戶(hù)通過(guò)單擊某個(gè)鏈接或者直接在瀏覽器的地址欄中輸入U(xiǎn)RL來(lái)訪問(wèn)Servlet,Web服務(wù)器接收到該請(qǐng)求后,并不是將請(qǐng)求直接交給Servlet,而是交給Servlet容器。Servlet容器實(shí)例化Servlet,調(diào)用Servlet的一個(gè)特定方法對(duì)請(qǐng)求進(jìn)行處理,并產(chǎn)生一個(gè)響應(yīng)。這個(gè)響應(yīng)由Servlet容器返回給Web服務(wù)器,Web服務(wù)器包裝這個(gè)響應(yīng),以HTTP響應(yīng)的形式發(fā)送給Web瀏覽器。整個(gè)過(guò)程如圖1-3所示。
圖1-3 用戶(hù)訪問(wèn)Servlet 與CGI程序相比,Servlet具有以下優(yōu)點(diǎn): — Servlet是單實(shí)例多線程的運(yùn)行方式,每個(gè)請(qǐng)求在一個(gè)獨(dú)立的線程中運(yùn)行,而提供服務(wù)的Servlet實(shí)例只有一個(gè)。 — Servlet具有可升級(jí)性,能響應(yīng)更多的請(qǐng)求,因?yàn)镾ervlet容器使用一個(gè)線程而不是操作系統(tǒng)進(jìn)程,而線程僅占用有限的系統(tǒng)資源。 — Servlet使用標(biāo)準(zhǔn)的API,被更多的Web服務(wù)器所支持。 — Servlet使用Java語(yǔ)言編寫(xiě),因此擁有Java程序語(yǔ)言的所有優(yōu)點(diǎn),包括容易開(kāi)發(fā)和平臺(tái)獨(dú)立性。 — Servlet可以訪問(wèn)Java平臺(tái)豐富的類(lèi)庫(kù),使得各種應(yīng)用的開(kāi)發(fā)更為容易。 — Servlet容器給Servlet提供額外的功能,如錯(cuò)誤處理和安全。
Servlet容器的分類(lèi)
根據(jù)Servlet容器工作模式的不同,可以將Servlet容器分為以下三類(lèi): Ø 獨(dú)立的Servlet容器當(dāng)我們使用基于Java技術(shù)的Web服務(wù)器時(shí),Servlet容器作為構(gòu)成Web服務(wù)器的一部分而存在。然而大多數(shù)的Web服務(wù)器并非基于Java,因此,就有了下面兩種Servlet容器的工作模式。 Ø 進(jìn)程內(nèi)的Servlet容器Servlet容器由Web服務(wù)器插件和Java容器兩部分的實(shí)現(xiàn)組成。Web服務(wù)器插件在某個(gè)Web服務(wù)器內(nèi)部地址空間中打開(kāi)一個(gè)JVM(Java虛擬機(jī)),使得Java容器可以在此JVM中加載并運(yùn)行Servlet。如有客戶(hù)端調(diào)用Servlet的請(qǐng)求到來(lái),插件取得對(duì)此請(qǐng)求的控制并將它傳遞(使用JNI技術(shù))給Java容器,然后由Java容器將此請(qǐng)求交由Servlet進(jìn)行處理。進(jìn)程內(nèi)的Servlet容器對(duì)于單進(jìn)程、多線程的服務(wù)器非常適合,提供了較高的運(yùn)行速度,但伸縮性有所不足。 Ø 進(jìn)程外的Servlet容器Servlet容器運(yùn)行于Web服務(wù)器之外的地址空間,它也是由Web服務(wù)器插件和Java容器兩部分的實(shí)現(xiàn)組成的。Web服務(wù)器插件和Java容器(在外部JVM中運(yùn)行)使用IPC機(jī)制(通常是TCP/IP)進(jìn)行通信。當(dāng)一個(gè)調(diào)用Servlet的請(qǐng)求到達(dá)時(shí),插件取得對(duì)此請(qǐng)求的控制并將其傳遞(使用IPC機(jī)制)給Java容器。進(jìn)程外Servlet容器對(duì)客戶(hù)請(qǐng)求的響應(yīng)速度不如進(jìn)程內(nèi)的Servlet容器,但進(jìn)程外容器具有更好的伸縮性和穩(wěn)定性。
Tomcat簡(jiǎn)介
學(xué)習(xí)Servlet技術(shù),首先需要有一個(gè)Servlet運(yùn)行環(huán)境,也就是需要有一個(gè)Servlet容器,本書(shū)采用的是Tomcat。 Tomcat是一個(gè)免費(fèi)的開(kāi)放源代碼的Servlet容器,它是Apache軟件基金會(huì)(Apache Software Foundation)的一個(gè)頂級(jí)項(xiàng)目,由Apache、Sun和其他一些公司及個(gè)人共同開(kāi)發(fā)而成。由于有了Sun的參與和支持,最新的Servlet和JSP規(guī)范總是能在Tomcat中得到體現(xiàn),Tomcat 6支持最新的Servlet 2.5和JSP 2.1規(guī)范。因?yàn)門(mén)omcat技術(shù)先進(jìn)、性能穩(wěn)定,而且免費(fèi),因而深受Java愛(ài)好者的喜愛(ài),并得到了部分軟件開(kāi)發(fā)商的認(rèn)可,成為目前比較流行的Web服務(wù)器。 Tomcat和IIS、Apache等Web服務(wù)器一樣,具有處理HTML頁(yè)面的功能,另外它還是一個(gè)Servlet和JSP容器,獨(dú)立的Servlet容器是Tomcat的默認(rèn)模式。不過(guò),Tomcat處理靜態(tài)HTML的能力不如Apache,我們可以將Apache和Tomcat集成在一起使用,Apache作為HTTP Web服務(wù)器,Tomcat作為Web容器。 下面給出Tomcat服務(wù)器接受客戶(hù)請(qǐng)求并做出響應(yīng)的圖例,如圖1-4所示。 圖1-4 Tomcat服務(wù)器接受客戶(hù)請(qǐng)求并做出響應(yīng)的過(guò)程 ① 客戶(hù)端(通常都是瀏覽器)訪問(wèn)Web服務(wù)器,發(fā)送HTTP請(qǐng)求。 ② Web服務(wù)器接收到請(qǐng)求后,傳遞給Servlet容器。 ③ Servlet容器加載Servlet,產(chǎn)生Servlet實(shí)例后,向其傳遞表示請(qǐng)求和響應(yīng)的對(duì)象。 ④ Servlet實(shí)例使用請(qǐng)求對(duì)象得到客戶(hù)端的請(qǐng)求信息,然后進(jìn)行相應(yīng)的處理。 ⑤ Servlet實(shí)例將處理結(jié)果通過(guò)響應(yīng)對(duì)象發(fā)送回客戶(hù)端,容器負(fù)責(zé)確保響應(yīng)正確送出,同時(shí)將控制返回給Web服務(wù)器。
Tomcat的安裝與配置
安裝Tomcat之前要先安裝JDK,本書(shū)中,筆者所用的JDK版本為1.6.0_05。 JDK的下載地址是:http://java./javase/downloads/?intcmp=1281,下載頁(yè)面如圖1-5所示。 圖1-5 JDK的下載頁(yè)面 要下載Tomcat,首先訪問(wèn)Tomcat項(xiàng)目的網(wǎng)址:http://tomcat./,如圖1-6所示。 圖1-6 Tomcat項(xiàng)目的首頁(yè) 在頁(yè)面左邊的下載鏈接中選擇要下載的Tomcat版本,在這里,我們選擇“Tomcat 6.x”下載,單擊這個(gè)鏈接,進(jìn)入Tomcat 6.x的下載頁(yè)面,如圖1-7所示。 本書(shū)使用的Tomcat版本是6.0.16。對(duì)于Windows操作系統(tǒng),Tomcat還提供了可執(zhí)行的安裝程序的下載,即“Windows Service Installer”鏈接。通過(guò)安裝程序安裝Tomcat,將把Tomcat安裝為Windows的服務(wù)。 筆者建議讀者下載zip壓縮包,通過(guò)解壓縮的方式來(lái)安裝Tomcat,因?yàn)榻鈮嚎s的方式也適用于其他的操作系統(tǒng)(如Linux系統(tǒng)),并且更容易與其他的開(kāi)發(fā)環(huán)境集成。對(duì)于初學(xué)者來(lái)說(shuō),也能更好地學(xué)習(xí)Tomcat的啟動(dòng)過(guò)程。 圖1-7 Tomcat 6.x的下載頁(yè)面 單擊“zip”鏈接,下載apache-tomcat-6.0.16.zip。使用WinZip或WinRAR等解壓縮工具將apache-tomcat-6.0.16.zip解壓縮到指定的驅(qū)動(dòng)器和目錄中。筆者是在D:\OpenSource目錄下直接解壓,產(chǎn)生了目錄apache-tomcat-6.0.16,解壓后的文件夾和文件存放于D:\OpenSource\apache-tomcat-6.0.16目錄下。 Tomcat 6.x需要的J2SE版本最低為5.0。Tomcat 6.x不再需要JDK的支持,只需要安裝JRE就可以了,這是因?yàn)門(mén)omcat 6.x使用Eclipse JDT Java編譯器來(lái)編譯JSP頁(yè)面,而不再使用JDK中的編譯器。Eclipse JDT Java編譯器已經(jīng)綁定到Tomcat的發(fā)行版中。如果你使用Tomcat 5.0.x或者Tomcat 5.5.x,那么仍然需要安裝JDK。 1.5.1 Tomcat的目錄結(jié)構(gòu)Tomcat安裝后的目錄層次結(jié)構(gòu)如圖1-8所示。 圖1-8 Tomcat 6.0.16目錄層次結(jié)構(gòu) 各目錄的用途如表1-1所示。 表1-1 Tomcat的目錄結(jié)構(gòu)及其用途
從表1-1中可以看到,lib目錄下存放的JAR文件可以被所有的Web應(yīng)用程序所訪問(wèn),如果多個(gè)Web應(yīng)用程序需要訪問(wèn)相同的JAR文件,那么可以將這些JAR文件放到Tomcat的lib目錄下。此外,對(duì)于后面將要介紹的Java Web應(yīng)用程序,在它的WEB-INF目錄下,也可以建立lib子目錄,在lib子目錄下可以存放各種JAR文件,這些JAR文件只能被當(dāng)前Web應(yīng)用程序所訪問(wèn)。 Tomcat 6.x修改了5.x版本的目錄結(jié)構(gòu),刪除了common、server和shared目錄,將common/lib、server/lib和shared/lib中的JAR文件統(tǒng)一放到了lib目錄下。 1.5.2 運(yùn)行Tomcat在Tomcat安裝目錄下的bin子目錄中,有一些批處理文件(以.bat作為后綴名的文件),其中的startup.bat就是啟動(dòng)Tomcat的腳本文件,用鼠標(biāo)雙擊這個(gè)文件,你將看到一個(gè)窗口一閃而過(guò),之后就什么也沒(méi)有了,這說(shuō)明Tomcat的啟動(dòng)出錯(cuò)了。 單擊Windows的【開(kāi)始】菜單,選擇【所有程序】→【附件】→【命令提示符】,打開(kāi)“命令提示符”窗口,進(jìn)入Tomcat的bin目錄中,在“命令提示符”窗口中輸入startup,你將看到如圖1-9所示的畫(huà)面。 圖1-9 運(yùn)行Tomcat提示出錯(cuò)信息 筆者以前碰到過(guò)很多學(xué)員,在初次運(yùn)行Tomcat時(shí),看到如圖1-9所示的信息就不知所措了。有的學(xué)員以前還配置過(guò)Tomcat,但是再次使用的時(shí)候,由于忘記了上次是如何配置的,同樣感覺(jué)無(wú)從下手。 我們?cè)趯W(xué)習(xí)軟件開(kāi)發(fā)時(shí),一定要養(yǎng)成查看錯(cuò)誤提示信息,進(jìn)而根據(jù)錯(cuò)誤提示解決問(wèn)題的良好習(xí)慣。筆者第一次配置Tomcat時(shí),就是根據(jù)錯(cuò)誤提示信息一步一步配置成功的。當(dāng)看到錯(cuò)誤信息時(shí),首先不要慌張和無(wú)所適從,要仔細(xì)看清楚錯(cuò)誤提示,弄明白錯(cuò)誤的原因。 圖1-9中的錯(cuò)誤提示信息,已經(jīng)很明確地告訴你了錯(cuò)誤的原因。我們看圖1-9中的錯(cuò)誤信息,如下所示: Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program 這個(gè)錯(cuò)誤信息是告訴你要配置JAVA_HOME或者JRE_HOME環(huán)境變量,以便Tomcat能夠找到JDK或JRE的安裝目錄。從環(huán)境變量的名字,我們可以猜測(cè)到JAVA_HOME是配置JDK的安裝目錄,JRE_HOME是配置JRE的安裝目錄。 由于Tomcat 6.x不再需要JDK的支持,所以才新增了JRE_HOME環(huán)境變量,對(duì)于6.0之前的Tomcat版本,沒(méi)有JRE_HOME環(huán)境變量,只能配置JAVA_HOME環(huán)境變量。 下面,我們?cè)赪indows XP Service Pack 2操作系統(tǒng)下設(shè)置JAVA_HOME環(huán)境變量,步驟如下。 ① 右鍵單擊“我的電腦”,選擇【屬性】,出現(xiàn)如圖1-10所示的畫(huà)面。 ② 單擊“高級(jí)”選項(xiàng)卡,選擇“環(huán)境變量(N)”,如圖1-11和圖1-12所示。 ③ 在“系統(tǒng)變量”下方單擊“新建”按鈕。在“變量名”中輸入“JAVA_HOME”,在變量值中輸入JDK所在的目錄“D:\Java\jdk1.6.0_05”(讀者可以根據(jù)自己機(jī)器上JDK的安裝目錄來(lái)修改這個(gè)值),然后單擊“確定”按鈕,如圖1-13所示。
圖1-10 “我的電腦”屬性 圖1-11 “高級(jí)”選項(xiàng)卡 ④ 最后在“環(huán)境變量”對(duì)話框上單擊“確定”按鈕,結(jié)束JAVA_HOME環(huán)境變量的設(shè)置。 我們?cè)僖淮无D(zhuǎn)到Tomcat的bin目錄下,用鼠標(biāo)雙擊startup.bat文件,可以看到如圖1-14所示的啟動(dòng)信息。 注意圖1-14中圓角矩形框中的文本,可以看到啟動(dòng)的是Tomcat 6.0.16。
圖1-12 “環(huán)境變量”對(duì)話框 圖1-13 新建JAVA_HOME系統(tǒng)變量 圖1-14 Tomcat啟動(dòng)信息 然后,打開(kāi)瀏覽器,在地址欄中輸入http://localhost:8080/(localhost表示本地機(jī)器,8080是Tomcat默認(rèn)監(jiān)聽(tīng)的端口號(hào)),將出現(xiàn)如圖1-15所示的Tomcat頁(yè)面。 圖1-15 Tomcat的默認(rèn)主頁(yè) 注意圖1-15中鼠標(biāo)(小手形狀)指向的鏈接——“Tomcat Documentation”,單擊這個(gè)鏈接將進(jìn)入Tomcat的文檔頁(yè)面,有關(guān)Tomcat的幫助信息可以在文檔頁(yè)面中找到;讀者也可以直接訪問(wèn)Tomcat的文檔,文檔首頁(yè)的位置是Tomcat安裝目錄下的webapps\docs\index.html。如果要關(guān)閉Tomcat服務(wù)器,可以用鼠標(biāo)雙擊Tomcat bin目錄下的shutdown.bat文件。 如果你機(jī)器上的Tomcat啟動(dòng)失敗,有可能是因?yàn)門(mén)CP的8080端口被其他應(yīng)用程序所占用,如果你知道是哪一個(gè)應(yīng)用程序占用了8080端口,那么先關(guān)閉這個(gè)程序。如果你不知道或者不想關(guān)閉占用8080端口的應(yīng)用程序,那么你可以修改Tomcat默認(rèn)監(jiān)聽(tīng)的端口號(hào)。 前面介紹了,Tomcat安裝目錄下的conf子目錄用于存放Tomcat服務(wù)器的各種配置文件,其中的server.xml是Tomcat的主要配置文件,這是一個(gè)格式良好的XML文檔,在這個(gè)文件中可以修改Tomcat默認(rèn)監(jiān)聽(tīng)的端口號(hào)。用UltraEdit(你可以用“記事本”程序或其他的文本編輯工具)打開(kāi)server.xml,找到修改8080端口的地方。讀者也許要問(wèn)了,“這個(gè)配置文件,我都不熟悉,怎么知道在哪里修改端口號(hào)呢?”對(duì)于初次接觸server.xml的讀者,確實(shí)不了解這個(gè)文件的結(jié)構(gòu),但是我們應(yīng)該有一種開(kāi)放的思路,既然Tomcat的監(jiān)聽(tīng)端口號(hào)是在server.xml中配置,那么只要我們?cè)谶@個(gè)文件中查找“8080”這樣的數(shù)字字符序列,不就能找到修改端口號(hào)的地方了嗎!在UltraEdit中,同時(shí)按下鍵盤(pán)上的“Ctrl”和“F”鍵,出現(xiàn)如圖1-16所示的“查找”對(duì)話框。 圖1-16 UltraEdit的查找對(duì)話框 然后在“查找”文本框中輸入“8080”,單擊“下一個(gè)”按鈕。重復(fù)這一過(guò)程,直到找到如圖1-17所示的在server.xml中配置端口號(hào)位置。 圖1-17 server.xml中配置端口號(hào)的位置 找到后,如果我們不能確定此處就是修改端口號(hào)的地方,也沒(méi)有關(guān)系,可以先嘗試著修改一下端口號(hào),然后啟動(dòng)Tomcat。如果啟動(dòng)成功并且能夠在修改后的端口號(hào)上訪問(wèn)到Tomcat的默認(rèn)主頁(yè),那就證明了我們修改的地方是正確的。學(xué)習(xí)時(shí),我們應(yīng)該養(yǎng)成這種探索并不斷實(shí)驗(yàn)的精神。在這里,我們可以修改端口號(hào)為8000(讀者可以根據(jù)自己機(jī)器的配置選擇一個(gè)端口號(hào)),然后保存。再次啟動(dòng)Tomcat,在Tomcat啟動(dòng)完畢后,打開(kāi)瀏覽器,在地址欄中輸入http://localhost:8000/(讀者根據(jù)自己設(shè)置的端口號(hào)做相應(yīng)的修改),就可以看到Tomcat的默認(rèn)主頁(yè)了。關(guān)閉Tomcat服務(wù)器時(shí),執(zhí)行bin目錄下的shutdown.bat文件。 如果你想將Tomcat安裝為Windows的服務(wù),以便在Windows系統(tǒng)啟動(dòng)時(shí)即運(yùn)行Tomcat,那么可以打開(kāi)“命令提示符”窗口,進(jìn)入Tomcat安裝目錄下的bin子目錄,然后執(zhí)行下面的命令: service.bat install 這樣將會(huì)在Windows系統(tǒng)中安裝一個(gè)Tomcat6服務(wù),要啟動(dòng)這個(gè)服務(wù),可以執(zhí)行下面的命令: net start Tomcat6 要停止Tomcat6服務(wù),可以執(zhí)行下面的命令: net stop Tomcat6 要?jiǎng)h除Tomcat6服務(wù),可以執(zhí)行下面的命令: service.bat remove 要提醒讀者的是:net命令是Windows自帶的命令,而service.bat是Tomcat提供的批處理文件。 1.5.3 Tomcat啟動(dòng)分析在本節(jié)中我們將通過(guò)對(duì)Tomcat啟動(dòng)過(guò)程的分析,來(lái)幫助讀者更好地理解和掌握Tomcat。 用文本編輯工具打開(kāi)用于啟動(dòng)Tomcat的批處理文件startup.bat,仔細(xì)閱讀。在這個(gè)文件中,首先判斷CATALINA_HOME環(huán)境變量是否為空,如果為空,就將當(dāng)前目錄設(shè)為CATALINA_HOME的值。接著判斷當(dāng)前目錄下是否存在bin\catalina.bat,如果文件不存在,將當(dāng)前目錄的父目錄設(shè)為CATALINA_HOME的值。根據(jù)筆者機(jī)器上Tomcat安裝目錄的層次結(jié)構(gòu),最后CATALINA_HOME的值被設(shè)為T(mén)omcat的安裝目錄。如果環(huán)境變量CATALINA_HOME已經(jīng)存在,則通過(guò)這個(gè)環(huán)境變量調(diào)用bin目錄下的“catalina.bat start”命令。通過(guò)這段分析,我們了解到兩個(gè)信息,一是Tomcat啟動(dòng)時(shí),需要查找CATALINA_HOME這個(gè)環(huán)境變量,如果在Tomcat的bin目錄下調(diào)用startup.bat,Tomcat會(huì)自動(dòng)并正確設(shè)置CATALINA_HOME;二是執(zhí)行startup.bat命令,實(shí)際上執(zhí)行的是“catalina.bat start”命令。 如果我們不是在Tomcat的bin目錄作為當(dāng)前目錄時(shí)調(diào)用startup.bat,就會(huì)出現(xiàn)如圖1-18所示的錯(cuò)誤信息(在bin目錄的父目錄下調(diào)用除外)。 圖1-18 在其他目錄下啟動(dòng)Tomcat出錯(cuò) 如果要想在任意目錄下都能啟動(dòng)Tomcat,就需要設(shè)置CATALINA_HOME環(huán)境變量,你可以將CATALINA_HOME添加到Windows XP系統(tǒng)的環(huán)境變量中,其值就是Tomcat的安裝目錄。在筆者的機(jī)器上,Tomcat的安裝目錄是D:\OpenSource\apache-tomcat-6.0.16。添加CATALINA_HOME環(huán)境變量的過(guò)程和前述添加JAVA_HOME環(huán)境變量的過(guò)程是一樣的。如果你不想在系統(tǒng)的環(huán)境變量中添加,也可以直接在startup.bat文件中進(jìn)行設(shè)置。下面是在startup.bat文件中設(shè)置CATALINA_HOME后的文件片段: … rem $Id: startup.bat 562770 2007-08-04 22:13:58Z markt $ rem -------------------------------------------------------------------- set CATALINA_HOME=D:\OpenSource\apache-tomcat-6.0.16 rem Guess CATALINA_HOME if not defined set CURRENT_DIR=%cd% if not "%CATALINA_HOME%" == "" goto gotHome set CATALINA_HOME=%CURRENT_DIR% … 注意以粗體顯示的這句代碼的作用就是設(shè)置CATALINA_HOME環(huán)境變量,在它的下面是判斷CATALINA_HOME是否為空的語(yǔ)句。如果找不準(zhǔn)位置,干脆將設(shè)置CATALINA_HOME環(huán)境變量的這句代碼放到文件的第一行。JAVA_HOME環(huán)境變量也可以采用同樣的方式進(jìn)行設(shè)置。不過(guò),如果要在其他目錄下利用shutdown.bat來(lái)關(guān)閉Tomcat服務(wù)器,則需要在shutdown.bat文件中設(shè)置CATALINA_HOME和JAVA_HOME這兩個(gè)環(huán)境變量,設(shè)置變量的位置和startup.bat文件一樣,都是在判斷CATALINA_HOME是否為空之前。當(dāng)然,為了一勞永逸,避免重裝Tomcat后還要進(jìn)行設(shè)置(需要是同一版本的Tomcat安裝在同一位置),我們最好還是將CATALINA_HOME和JAVA_HOME這兩個(gè)環(huán)境變量添加到Windows XP系統(tǒng)的環(huán)境變量中。 有的讀者可能會(huì)對(duì)Tomcat安裝目錄的環(huán)境變量的名字是CATALINA_HOME而感到奇怪,按照其他環(huán)境變量的設(shè)置來(lái)看,JAVA_HOME表示JDK的安裝目錄,那么應(yīng)該用TOMCAT_HOME來(lái)表示Tomcat的安裝目錄,可為什么要使用CATALINA_HOME呢?實(shí)際上,在Tomcat 4以前,用的就是TOMCAT_HOME來(lái)表示Tomcat的安裝目錄,在Tomcat 4以后,采用了新的Servlet容器Catalina,所以環(huán)境變量的名字也改為了CATALINA_HOME。 在Windows系統(tǒng)下環(huán)境變量的名字是與大小寫(xiě)無(wú)關(guān)的,也就是說(shuō),JAVA_HOME和java_home是一樣的。 了解了startup.bat文件以后,我們?cè)賮?lái)看看真正負(fù)責(zé)啟動(dòng)Tomcat服務(wù)器的catalina.bat文件。通過(guò)分析catalina.bat文件,我們發(fā)現(xiàn)它還調(diào)用了一個(gè)文件setclasspath.bat。在setclasspath.bat文件中,它檢查JAVA_HOME環(huán)境變量是否存在,并通過(guò)JAVA_HOME環(huán)境變量,找到j(luò)ava.exe,用于啟動(dòng)Tomcat。在這個(gè)文件中,還設(shè)置了其他的一些變量,代表調(diào)用Java的標(biāo)準(zhǔn)命令,有興趣的讀者可以自行分析一下這個(gè)文件。在執(zhí)行完setclasspath.bat之后,catalina.bat剩下的部分就開(kāi)始了Tomcat服務(wù)器的啟動(dòng)進(jìn)程。 直接執(zhí)行catalina.bat時(shí),需要帶上命令行的參數(shù)。讀者可以在命令提示符窗口下,執(zhí)行catalina.bat,就會(huì)打印出catalina.bat命令的各種參數(shù)及其含義,如圖1-19所示。 圖1-19 catalina.bat的各參數(shù)信息 其中常用的參數(shù)是start、run和stop。參數(shù)start表示在一個(gè)單獨(dú)的窗口中啟動(dòng)Tomcat服務(wù)器,參數(shù)run表示在當(dāng)前窗口中啟動(dòng)Tomcat服務(wù)器;參數(shù)stop表示關(guān)閉Tomcat服務(wù)器。我們執(zhí)行startup.bat,實(shí)際上執(zhí)行的就是“catalina.bat start”命令;執(zhí)行shutdown.bat,實(shí)際上執(zhí)行的是“catalina.bat stop”命令。“catalina.bat run”命令有時(shí)候是非常有用的,特別是當(dāng)我們需要查看Tomcat的出錯(cuò)信息時(shí)。 在開(kāi)發(fā)JSP程序時(shí),經(jīng)常會(huì)碰到自己機(jī)器上的8080端口號(hào)被別的應(yīng)用程序占用,或者在配置server.xml時(shí)出現(xiàn)錯(cuò)誤,當(dāng)通過(guò)startup.bat(相當(dāng)于執(zhí)行“catalina.bat start”)啟動(dòng)Tomcat服務(wù)器時(shí),如果啟動(dòng)過(guò)程中出現(xiàn)嚴(yán)重錯(cuò)誤,由于是在單獨(dú)的窗口中啟動(dòng)Tomcat服務(wù)器,所以一旦啟動(dòng)失敗,命令提示符窗口就自動(dòng)關(guān)閉了,程序運(yùn)行中輸出的出錯(cuò)信息也隨之消失,而且沒(méi)有任何的日志信息,這就使得我們沒(méi)有辦法找出錯(cuò)誤原因。當(dāng)出現(xiàn)錯(cuò)誤時(shí),我們可以換成“catalina.bat run”命令再次啟動(dòng),一旦啟動(dòng)失敗,僅僅是Tomcat服務(wù)器異常終止,但是在當(dāng)前的命令提示符窗口下仍然保留了啟動(dòng)時(shí)的出錯(cuò)信息,這樣我們就可以查找啟動(dòng)失敗的原因了。 |
|