自從J S P發布以后,推出了各式各樣的J S P引擎。作為世界上用得最多的We b服務器軟件—
A p a c h e的Apache Group也在進行J S P的實用研究。最初的軟件產品是在A p a c h e的Java Servlet引擎
即A p a c h e J S e r v的基礎上實現的G N U J S P,一直到G N U J S P 1 . 0,基本上實現了JSP 1.0標準。另外
還出現了一個被稱為G S P的產品,是作為G N U體系的一個服務器端的S c r i p t語言實現的。
G N U J S P基本上是一個A p a c h e J S e r v的附屬,它主要是利用S e r v l e t將J S P源文件翻譯為一個S e r v l e t
的J a v a語言源文件,然后經J a v a編譯器編譯后作為S e r v l e t執行,這樣做的好處前面已經說明了。
在完成G N U J S P 1 . 0的開發以后,開發組的成員開始考慮在S U N的J S W D K基礎上開發一個可
以直接提供We b服務的J S P服務器,當然同時也支持S e r v l e t。這樣,J a k a r t a - To m c a t就誕生了。
作為一個開放源代碼的軟件, J a k a r t a - To m c a t有著自己獨特的優勢:
首先,它容易得到。事實上,任何人都可以從互聯網上自由地這個軟件。無論從
h t t p : / / j a k a r t a . A p a c h e . o rg還是從其他網站。
其次,對于開發人員,特別是J a v a開發人員,To m c a t提供了全部的源代碼,包括S e r v l e t引擎、
J S P引擎、H T T P服務器. . . . . .,無論是對哪一方面感興趣的程序員,都可以從這些由世界頂尖的程
序員書寫的代碼中獲得收益。
最后,由于源代碼的開放及世界上許多程序員的卓有成效的工作, To m c a t已經可以和大部
分的主流服務器一起工作,而且是以相當高的效率一起工作。如:以模塊的形式被載入A p a c h e,
以I S A P I的形式被載入I I S或P W S,以N S A P I的形式被載入Netscape Enterprise Server. . . . . .。
接下來,讀者可以看到:
• 如何安裝To m c a t,讓它發揮作用。
• 如何讓To m c a t和A p a c h e、I I S等一起工作。
• 如何配置To m c a t,讓它符合自己的要求。
下面,先來建立一個試驗用的J S P頁面,讀者可以先將以下的代碼存為H e l l o Wo r l d . j s p。
<HTML>
<HEAD>
<TITLE>JSP測試頁面---HelloWorld!</TITLE>
</HEAD>
<BODY>
<%
out.println("<h1>Hello World!<br>世界,你好!</h1>");
%>
</BODY>
</HTML>
3.1 To m c a t的安裝和直接使用
在A p a c h e的j a k a r t a項目的主頁上,可以看到有To m c a t的超連接,在這里可以找到各種版本
的區域,包括當前的發布( R e l e a s e)版本、開發中的各種版本,其中又分為Wi n 3 2版本和
L i n u x版本,其實對于完全由J a v a寫成的To m c a t,Wi n 3 2版本和L i n u x版本沒有多大區別,比如
L i n u x版本,在S o l a r i s下也沒有問題。這里,主要以Wi n 3 2版本作為示例。
注意:在安裝使用To m c a t之前,先安裝J D K,最好是S u n的J D K 1 . 2 . 2或J D K 1 . 3。
首先,j a k a r t a - t o m c a t . z i p包,解壓縮到一個目錄下,如:“c : t o m c a t”。這時,會得到如
下的目錄結構:
t o m c a t
- - - j a k a r t a - t o m c a t
| - - - b i n To m c a t執行腳本目錄
| - - - c o n f To m c a t配置文件
| - - - d o c To m c a t文檔
| - - - l i b To m c a t運行需要的庫文件( J A R S)
| - - - l o g s To m c a t執行時的L O G文件
| - - - s r c To m c a t的源代碼
| - - - w e b a p p s To m c a t的主要We b發布目錄
| - - - w o r k To m c a t的工作目錄,
To m c a t將翻譯J S P文件到的J a v a文件和c l a s s文件放在這里
在B i n目錄下,有一個名為s t a r t u p . b a t的腳本文件,執行這個腳本文件,就可以啟動To m c a t服
務器,不過,在啟動服務器之前,還需要進行一些設置。
首先,設置環境變量。
Wi n 9 x在a u t o e x e c . b a t里用set 語句來設定環境變量,如: set T O M C AT_HOME = c:omcat。
在w i n n t / w i n 2 0 0 0里可以選擇“我的電腦”,右鍵點出菜單,選擇屬性,彈出對話框“系統特
性”,選擇“高級”選項頁,然后點按鈕“環境變量”,可以編輯系統的環境變量。
• TO M C AT _ H O M E值:c:omcat (用TO M C AT _ H O M E指示t o m c a t根目錄。
• JAVA _ H O M E值:c : j a v a j d k (用J AVA _ H O M E指示j d k 1 . 3安裝目錄)。
• CLASSPAT H值:c : j a v a j d k l i b t o o l s . j a r。
實際上,對于C L A S S PAT H也可以直接打開t o m c a t . b a t文件,在中間可以找到好幾行s e t
C L A S S PAT H . . . . . .,將自己希望加入的庫文件加入到其中即可。
另外,對于J D K 1 . 3,在中文系統上安裝之后,系統注冊表會有問題,請用r e g e d i t打開注冊
表查j a v a s o f t,位置為hkey_local_machine -> software -> javasoft -> ,找到“ Java 運行時環境”
把它導出到文件t e m p . r e g . . . .,然后用n o t e p a d編輯它,把“ Java 運行時環境”替換成“ J a v a
Runtime Environment”,然后導入。
同樣,最好也把j a v a s o f t注冊表項中的“Java 插件”另外復制一份為“ Java Plug-in”。
接下來就可以執行TO M C AT _ H O M E b i n s t a r t u p . b a t,測試一下To m c a t是否運行正常。
運行We b瀏覽器,如Netscape Navigator 或Internet Explorer 。在瀏覽器的地址欄中鍵入:
h t t p : / / 1 2 7 . 0 . 0 . 1 : 8 0 8 0。如果看到To m c a t的信息,那么就說明To m c a t已經安裝成功了。然后測試
To m c a t的J S P引擎是否正常工作,即將前面建立的H e l l o Wo r l d . j s p文件拷貝到TO M C AT _ H O M E w
78第一部分JSP 入門
e b a p p s e x a m p l e s j s p目錄下,然后在瀏覽器的地址欄中鍵入: h t t p : / / 1 2 7 . 0 . 0 . 1 : 8 0 8 0 / e x a m p l e s / j s p /
H e l l o Wo r l d . j s p,這時候應該可以看到如圖3 - 1所示的畫面:
圖3 - 1
在啟動To m c a t的過程中,可能會遇到一些問題,這里就常見問題進行一些說明。
1) 啟動To m c a t失敗。出現這種情況時,可能有兩種現象:
第一種:執行s t a r t u p . b a t以后沒有Ja v a窗口出現。
第二種:有Ja v a窗口出現,但是接著自行退出。
對于第一種情況,很可能是TO M C AT _ H O M E環境變量設置有問題,打開s t a r t u p . b a t文件,
觀察腳本的寫法,一般可以發現問題。
對于第二種情況,可能是當前系統中已經有一個服務器占用了8 0 8 0端口,這時需要把原先
的服務器關閉,或者利用后面講的To m c a t的配置方法修改To m c a t的服務端口。也可能是由于
C L A S S PAT H設置有誤,這時需要檢查C L A S S PAT H是否設置正確。
2) 啟動To m c a t成功,可以看到首頁,但是不能執行J S P腳本。
這種情況一般是由于C L A S S PAT H設置有誤或J AVA _ H O M E設置有誤,經過試驗發現,當使
用Wi n d o w s自帶的j a v a . e x e(c : w i n n t s y s t e m 3 2或c : w i n d o w s s y s t e m)時可能會出現這種問題。
3.2 To m c a t和A p a c h e的配合
作為A p a c h e的一個子項目j a k a r t a - t o m c a t當然要對A p a c h e提供強有力的支持,在的
第3章J S P開發平臺的建立:To m c a t79
To m c a t壓縮包解開后,在TO M C A G T _ H O M E c o n f目錄下有一個t o m c a t - A p a c h e . c o n f文件,這個
文件并不是To m c a t自己的配置文件,而是提供給A p a c h e用來使To m c a t能夠和A p a c h e一起工作的。
實際上,這個文件是在To m c a t的運行過程中自動生成的。
但是,光有這個文件還不能使A p a c h e和To m c a t一起工作,還需要一個A p a c h e的動態載入庫
文件A p a c h e M o d u l e J S e r v. d l l,這個文件也可以在網站h t t p : / / j a k a r t a . A p a c h e . o rg得到,需要說明的
是,對于L i n u x版本的t o m c a t,需要的是m o d _ j s e r v. s o文件,w s 5 0為后綴的文件是L i n u x下的動態
連鏈庫文件。
首先,要得到Apache HTTP服務器。A p a c h e是一個免費而且提供源代碼的H T T P服務器,由
于A p a c h e強大的性能和用戶可以利用源代碼構造自己的H T T P服務器的特性,A p a c h e及其衍生出
來的產品已經成為世界上應用最多的H T T P服務器,甚至連著名的I B M公司為We b s p h e r e應用服
務器提供的IBM HTTP Server也是由A p a c h e改造而來的。
在h t t p : / / j a k a r t a . A p a c h e . o rg可以得到A p a c h e服務器的最新版本,本書寫作的時候,最新的發
行版已經到了A p a c h e 1 . 3 . 1 2,而A p a c h e 2 . 0 a 6也已經提供用于測試了。
Wi n d o w s下的A p a c h e版本是一個安裝文件,可以輕松地安裝在計算機上。而如果在L i n u x下
使用A p a c h e,那么最好使用源代碼包自己進行編譯,需要注意的是,編譯時需使用選項e n a b l e -
m o d u l e = s o。
雙擊A p a c h e _ 1 _ 3 _ 1 2 _ Wi n 3 2 . e x e文件進行安裝,缺省安裝目錄為C:Program FilesApache
G r o u p A p a c h e,可以修改為自己喜歡的目錄。
如果需要修改A p a c h e服務器工作的端口號以及H T M L發布目錄或者其他A p a c h e的參數,那
么可以修改A p a c h e安裝目錄 c o n f h t t p d . c o n f,一般可以修改H T M L發布目錄為自己喜歡的目錄。
至于端口號,當計算機上還運行有其他We b服務器時可以修改之,一般Wi n d o w s 9 x的機器上如果
裝有P W S就需要修改,而Wi n d o w s N T和Windows 2000的機器上如果裝有I I S,也需要修改。對于
沒有連接到網絡的機器,有時需要設置一下S e r v e r N a m e。A p a c h e服務器的具體配置請見相關書
籍,這里就不講了。
另外最好將A p a c h e作為一個服務安裝在運行Wi n d o w s N T和Windows 2000的電腦上。這只需
要執行開始→程序→ Apache Web Server→Install Apache as a service即可。
打開瀏覽器,在地址欄中鍵入h t t p : / / 1 2 7 . 0 . 0 . 1 : A p a c h e運行的端口號,如果能夠見到A p a c h e的
歡迎頁面,或者是一大堆文件讓你選擇,就可以認為A p a c h e服務器已經開始工作了。
Apache HTTP 服務器配置成功以后,就可以著手讓To m c a t和A p a c h e一起工作。首先,將得
到的A p a c h e M o d u l e J S e r v. d l l文件拷貝到A p a c h e安裝目錄下的m o d u l e s子目錄下, L i n u x的用戶將
m o d _ j s e r v. s o文件拷貝到A p a c h e安裝目錄的l i b e x e c目錄下,然后將A p a c h e安裝目錄下的
h t t p d . c o n f文件用文本編輯器打開,在最后面加入下面的指令:
INCLUDE To m c a t _ H o m e c o n f t o m c a t . c o n f —對于Wi n d o w s用戶。
或INCLUDE To m c a t _ H o m e / c o n f / t o m c a t . c o n f —對于L i n u用戶。
上面的To m c a t _ H o m e指的是To m c a t的安裝目錄。
最后,在h t t p d . c o n f文件中加上一行: LoadModule jserv_module modules/ApacheModuleJServ.
d l l。
80第一部分JSP 入門
對于L i n u x下的用戶,一般不需要手動加上LoadModule jserv_module libexec/mod_jserv. s o這
一行,t o m c a t - A p a c h e . c o n f文件已經缺省加上了,如果沒加,自行加上即可。
一切就緒以后,重新啟動A p a c h e服務器和To m c a t,在瀏覽器的地址欄中鍵入: h t t p : / /
1 2 7 . 0 . 0 . 1 : A p a c h e運行的端口號/ e x a m p l e s / j s p /,如果能夠看到To m c a t的J S P示例列表,就說明
To m c a t已經和A p a c h e一起工作了。
3.3 To m c a t和I I S的配合
Wi n d o w s平臺下最常用的We b服務器無疑是I I S(包括P W S),對于I I S,To m c a t也提供了配合
工作的方法,使用這種方法,可以為本來不具有Java Servlet和J S P功能的I I S增加處理J S P和J a v a
S e r v l e t的功能。
為了使To m c a t和I I S一起工作,首先要得到i s a p i _ r e d i r e c t . d l l,這是一個I I S的插件( P l u g - i n),
可以從h t t p : / / j a k a r t a . A p a c h e . o rg /直接編譯好的版本,也可以自己使用Visual C++編譯得到。
得到以后,放到一個自己喜歡的目錄,例如c:omcatJakarta-tomcatiniisi386 目錄下。
另外,在使I I S和To m c a t配合的過程中,還需要用到另外兩個To m c a t的配置文件,一個是
w o r k e r s . p r o p e r t i e s,這個文件定義了To m c a t的工作進程使用的主機和端口。在To m c a t的c o n f目錄中
有一個示范性的w o r k e r s . p r o p e r t i e s文件。另一個是u r i w o r k e r m a p . p r o p e r t i e s,這個文件是映射U R L
目錄和To m c a t工作進程的。同樣,在To m c a t的c o n f目錄中有一個示范性的u r i w o r k e r m a p . p r o p e r t i e s
文件。
首先,配置i s a p i _ r e d i r e c t . d l l。
1) 在系統注冊表中建立一個新的鍵值: H K E Y _ L O C A L _ M A C H I N E S O F T WA R E A p a c h e
Software FoundationJakarta Isapi Redirector1.0。
2) 添加一個名為e x t e n s i o n _ u r i的字符串值為/ j a k a r t a / i s a p i _ r e d i r e c t . d l l。
3) 添加一個名為l o g _ f i l e的字符串值為c : t o m c a t J a k a r t a - t o m c a t l o g s i s a p i . l o g。
4) 添加一個名為l o g _ l e v e l的字符串值為d e b u g、i n f o r m、e r r o r、e m e rg中的一個。
5) 添加一個名為w o r k e r _ f i l e的字符串值為
6) c:omcatjakarta-tomcatconfworkers.properties。
7) 添加一個名為w o r k e r _ m o u n t _ f i l e的字符串值為
8) c:omcatjakarta-tomcatconf uriworkermap.properties。
然后,打開I I S的管理控制臺,在需要使用To m c a t提供附加的J S P和Java Servlet服務的We b站點
中添加一個虛擬目錄。注意,一定要使用“ j a k a r t a”作為虛擬目錄的名稱,這個虛擬目錄的實際
物理位置應當是包含i s a p i _ r e d i r e c t . d l l文件的目錄,這里假設為c : t o m c a t J a k a r t a - t o m c a t b i n i i s i 3 8 6。
在設定虛擬目錄時注意要設此虛擬目錄為可執行。如果是在P W S中,一樣處理。
接著,在I I S的控制臺中為此We b站點添加一個I S A P I過濾器(在此We b站點上點擊鼠標右鍵,
選擇屬性)。名稱隨意,但過濾器要設定為i s a p i _ r e d i r e c t . d l l這個文件。如果使用的是P W S就比較
麻煩了。需要使用注冊表編輯器,在鍵H K E Y _ L O C A L _ M A C H I N E S y s t e m C u r r e n t C o n t r o l S e t S e
r v i c e s W 3 S V C P a r a m e t e r s中,有一個名為Filter Dlls的鍵值,在這個鍵值中添加i s a p i _ r e d i r e c t . d l l,
注意要包含完整的路徑。
第3章J S P開發平臺的建立:To m c a t81
最后,重新啟動I I S或P W S,最好是能夠重新啟動計算機。
啟動To m c a t以后,打開瀏覽器,在地址欄中鍵入h t t p : / / 1 2 7 . 0 . 0 . 1 / e x a m p l e s /,如果能夠看到
j s p和s e r v l e t兩個目錄,就說明利用i s a p i _ r e d i r e c t . d l l所作的重定向已經成功,可以執行一下j s p目
錄下的例子做試驗。
3.4 To m c a t的配置和常見問題
To m c a t為用戶提供了一系列的配置文件來幫助用戶配置自己的To m c a t,和Apache HTTP不
同,To m c a t的配置文件主要是基于X M L的;如s e r v e r. x m l、w e b . x m l . . . . . .,只有w o r k e r s . p r o p e r t i e s
和u r i w o r k e r m a p . p r o p e r t i e s等少數幾個文件是傳統的配置文件。本節將詳細討論To m c a t的主要配
置文件以及如何利用這些配置文件解決常見問題。
3.4.1 To m c a t的主配置文件:s e r v e r. x m l
觀察s e r v e r. x m l,可以發現其中有如表0一些元素。
表3 - 1
元素描述
S e r v e r 是S e r v e r元素是s e r v e r. x m l文件的最高級別的元素, S e r v e r元素描述一
個To m c a t服務器,一般來說用戶不用關心這個元素。一個S e r v e r元素
是一般會包括L o g g e r和C o n t e x t M a n a g e r兩個元素
L o g g e r 是L o g g e r元素定義了一個日志對象,一個日志對象包含有如下屬性:
是1) name 。表示這個日志對象的名稱。
是2) path。表示這個日志對象包含的日志內容要輸出到哪一個日志文件。
是3) v e r b o s i t y L e v e l。表示這個日志文件記錄的日志的級別。
是一般來說, L o g g e r對象是對Java Servlet、J S P和To m c a t運行期事件
的記錄
C o n t e x t M a n a g e r 是C o n t e x t M a n a g e r定義了一組C o n t e x t I n t e r c e p t o r s(C o n t e x t M a n a g e的
事件監聽器) , RequestInterceptors(C o n t e x t M a n a g e的事件監聽器),
C o n t e x t s(We b應用程序的上下文目錄)和它們的C o n n e c t o r s(連接
器)的結構和配置。
是C o n t e x t M a n a g e r包含如下一些屬性:
是1) debug。記錄日志記錄調試信息的等級。
是2) home。w e b a p p s /、c o n f /、l o g s /和所有C o n t e x t的根目錄信息。這
個屬性的作用是從一個不同于TO M C AT _ H O M E的目錄啟動To m c a t。
3) workDir。To m c a t工作目錄。
ContextInterceptor 和R e q u e s t I n t e r c e p t o r 是兩者都是監聽C o n t e x t M a n a g e r的特定事件的攔截器。C o n t e x t I n t e r c e p t o r
監聽To m c a t的啟動和結束事件信息。而R e q u e s t I n t e r c e p t o r監聽用戶對服
務器發出的請求信息。一般用戶無需關心這些攔截器,對于開發人員,
需要了解這就是全局性的操作得以實現的方法
C o n n e c t o r 是C o n n e c t o r(連接器)對象描述了一個到用戶的連接,不管是直接
由To m c a t到用戶的瀏覽器還是通過一個We b服務器。To m c a t的工作進
程和由不同的用戶建立的連接傳來的讀/寫信息和請求/答復信息都是
由連接器對象管理的。對連接器對象的配置中應當包含管理類、
T C P / I P端口等內容
82第一部分JSP 入門
(續)
元素描述
C o n t e x t 是每一個C o n t e x t都描述了一個To m c a t的We b應用程序的目錄。這個
對象包含以下屬性:
是1) docBase。這是C o n t e x t的目錄。可以是絕對目錄也可以是基于
C o n t e x t M a n a g e的根目錄的相對目錄。
是2) path。這是C o n t e x t在We b服務時的虛擬目錄位置和目錄名。
是3) debug。日志記錄的調試信息記錄等級。
是4) reloadable。這是為了方便S e r v l e t的開發人員而設置的,當這個
屬性開關打開的時候,To m c a t將檢查S e r v l e t是否被更新而決定是否自
動重新載入它
1. 加入自己的日志文件
添加L o g g e r對象就可以加入自己的日志文件,添加工作相當簡單,只需要將作為示例的
L o g g e r對象復制一份,然后修改一下前面介紹的幾個屬性就可以了。在設定了L o g g e r以后,就
可以在自己的S e r v l e t中使用S e r v l e t C o n t e x t . l o g ( )方法來建立自己的日志文件。
2. 設定新的J S P目錄
設立新的J S P工作目錄是比較簡單的,只需要添加一個C o n t e x t對象就可以了。如,要在
c : j s p目錄下開發J S P項目,并且讓用戶可以使用/ m y b o o k /虛擬目錄訪問,則:
<Context path="/mybook" docBase="c:jsp" debug="0" reloadable="true" >
</Context>
一般來說,這樣就可以直接執行J S P文件了,如果進一步想要在這下面建立We b應用程序,
那么還需要進一步的配置,具體方法在后面論述。
3.4.2 Wi n d o w s下代碼保護的問題
在Wi n d o w s下使用To m c a t時有一個問題需要注意,可以做一個試驗,啟動To m c a t后,在瀏
覽器的地址欄中鍵入: http://127.0.0.1:8080/examples/jsp/ HelloWo r l d . J S P(注意后綴要大寫)。
就會發現奇怪的現象,瀏覽器的窗口中什么都沒有,查看H T M L源文件就會發現,這個J S P文件
的源代碼被To m c a t完全輸出到了瀏覽器!如果是這樣,豈不是服務器端的任何源代碼都會被暴
露在互聯網上。
實際上,解決方法很簡單,把各種后綴的組合全部寫到To m c a t _ H o m e c o n f w e b . x m l里就可
以了,這樣t o m c a t會將不同后綴名的j s p分開對待,就不會泄露代碼了。
<servlet-mapping>
<servlet-name>
jsp
</servlet-name>
<url-pattern>
*.jsp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
第3章J S P開發平臺的建立:To m c a t83
<servlet-name>
Jsp
</servlet-name>
<url-pattern>
*.Jsp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
JSp
</servlet-name>
<url-pattern>
*.JSp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
JsP
</servlet-name>
<url-pattern>
*.JsP
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
JSP
</servlet-name>
<url-pattern>
*.JSP
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
jSp
</servlet-name>
<url-pattern>
*.jSp
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
jSP
</servlet-name>
<url-pattern>
*.jSP
</url-pattern>
</servlet-mapping>
<servlet-mapping>
84第一部分JSP 入門
<servlet-name>
jsP
</servlet-name>
<url-pattern>
*.jsP
</url-pattern>
</servlet-mapping>
3.4.3 Apache、I I S和To m c a t協作時工作目錄的添加
1. Apache
由于J a k a r t a - To m c a t項目是A p a c h e的一個子項目,所以向To m c a t - A p a c h e協作的We b服務器添
加工作目錄時只需要修改To m c a t - A p a c h e . c o n f文件就可以了。也許讀者會覺得奇怪, To m c a t -
A p a c h e . c o n f文件不是在To m c a t啟動時自動生成的嗎?的確如此,但是To m c a t自動生成的To m c a t -
A p a c h e . c o n f文件僅僅是To m c a t提供的一個缺省配置文件而已,如果需要,可以修改,然后存放
在另外的目錄中,或是更名,再在h t t p d . c o n f文件中將這個新的文件包含進來就可以了。
為什么To m c a t不自動修改To m c a t - A p a c h e . c o n f文件以適應工作目錄添加的需要呢? To m c a t的
確修改了To m c a t - A p a c h e . c o n f文件,但是修改的結果顯然是不正確的。如,前面在s e r v e r. x m l中
添加了工作目錄/ m y b o o k - - > c : j s p后,To m c a t修改To m c a t - A p a c h e . c o n f文件,添加了這么幾行:
Alias /mybook C:omcatjakarta-tomcatwebappsmybook
<Directory "C:omcatjakarta-tomcatwebappsmybook">
Options Indexes FollowSymLinks
</Directory>
ApJServMount /mybook/servlet /mybook
<Location /mybook/Web-INF/ >
AllowOverride Non
deny from all
</Location>
這顯然是有問題的,盡管虛擬目錄是/ m y b o o k,但是實際的目錄并不是C : t o m c a t j a k a r t a -
t o m c a t w e b a p p s m y b o o k。查看To m c a t的源代碼C : t o m c a t j a k a r t a - t o m c a t s r c o rg A p a c h e t o m c a t t a s k
A p a c h e C o n f i g . j a v a文件可以發現,To m c a t在生成To m c a t - A p a c h e . c o n f文件的時候,簡單地在虛擬
目錄前面加上原先To m c a t的缺省w e b a p p目錄作為新的工作目錄:
pw.println("Alias " + path + " " +
FileUtil.patch(tomcatHome + "/webapps" + path));
pw.println("<Directory "" +
FileUtil.patch(tomcatHome + "/webapps" + path) +
"">");
pw.println(" Options Indexes FollowSymLinks");
pw.println("</Directory>");
那么如何解決這個問題呢?修改To m c a t的源代碼也可以,不過,對于一般的用戶,如前所
述直接修改To m c a t - A p a c h e . c o n f文件更現實一些。修改的方法舉例如下:
Alias /mybook C:jsp
第3章J S P開發平臺的建立:To m c a t85
<Directory "C:jsp">
Options Indexes FollowSymLinks
</Directory>
ApJServMount /mybook/servlet /mybook
<Location /mybook/Web-INF/ >
AllowOverride None
deny from all
</Location>
也就是簡單地將原先錯誤的實際目錄C : t o m c a t j a k a r t a - t o m c a t w e b a p p s m y b o o k修改為c : j s p
就可以了。
修改完文件后,一定要存為另一個文件并修改h t t p d . c o n f文件將這個文件包含進來,否則,
重新啟動To m c a t后,這個正確的To m c a t - A p a c h e . c o n f文件會被To m c a t重新生成的To m c a t -
A p a c h e . c o n f文件覆蓋掉。最后,重啟A p a c h e和To m c a t就可以了。
2. IIS
與A p a c h e和To m c a t幾乎無縫的配合不一樣, I I S和To m c a t的配合多少有些復雜,需要向
ISAPI Redirect添加新的內容。不過還好, To m c a t的u n i w o r k e r m a p . c o n f文件將這個過程簡單化
了。
需要做的事情共分兩步:
1) 向To m c a t中添加一個工作目錄。前面已經講述了如何實現,這里依然使用/ m y b o o k - -
> c : j s p這個例子。
2) 向ISAPI Redirect添加工作目錄。使用文本編輯器打開文件u n i w o r k e r m a p . c o n f,添加一
行:
/mybook/*=ajp12
然后重新啟動I I S和To m c a t就可以了。
3.4.4 設定To m c a t作為Wi n d o w s的服務而啟動
手工啟動To m c a t顯然不是一個合適的使用To m c a t作為We b服務的方法,在L i n u x下可以通過
修改啟動腳本自動啟動To m c a t,在Wi n d o w s下則可以設定To m c a t作為Wi n d o w s的服務而啟動。
To m c a t作為Windows NT/2000的一個服務是需要借助工具的
1) 工具,這里作為例子的是gservany ----將N T下的一般應用程序作為服務運行的工具。
網址為h t t p : / / w w w. a d v o k . c o m / g s e r v a n y. h t m l。將z i p文件解壓縮,將g s e r v a n y. e x e放入
w i n n t s y s t e m 3 2目錄下,(以防以后被誤刪)。
2) 在N T的C o m m a n d(命令行模式)下輸入: gservany -i tomcat “C : j a k a r t a - t o m c a t b i n”
“s t a r t u p . b a t”“C : j a k a r t a - t o m c a t b i n” “s h u t d o w n . b a t”。
3) 啟動s e r v i c e管理器,會看到tomcat service被裝上,加些注釋說明這個s e r v i c e實際干什么,
再修改啟動類型為“自動”。然后再啟動它。
這樣,就成功地將To m c a t作為S e r v i c e安裝在N T下了。
其實,將N T下的應用程序作為服務安裝在N T中的工具還有很多,任何一種都應該可以將
86第一部分JSP 入門
To m c a t加入到N T的服務中。
3.4.5 在To m c a t中建立新的We b應用程序
J S P主要是為建立We b網站而開發的技術,這種技術由We b應用程序的一整套We b文件(j s p,
s e r v l e t,h t m l,j p g,g i f,c l a s s . . . . . .)所組成。To m c a t為We b應用程序的建立提供了一系列的幫助,
下面分步驟描述。
1. 應用程序的目錄和結構
按照To m c a t的規范,從/ e x a m p l e例子目錄來看, To m c a t的We b應用程序應該由如表3 - 2所示
目錄組成的。
表3 - 2
*.html, *.jsp, etc. 這這里可以有許多目錄,由用戶的網站結構而定,實現的功能應該是網站的界面,也就
是用戶主要的可見部分。除了H T M L文件、J S P文件外,還有j s(J a v a S c r i p t)文件和c s s
(樣式表)文件以及其他多媒體文件等等
We b - I N F / w e b . x m l 這這是一個We b應用程序的描述文件。這個文件是一個X M L文件,描述了S e r v l e t和這個
We b應用程序的其他組件信息,此外還包括一些初始化信息和安全約束等等
We b - I N F / c l a s s e s / 這這個目錄及其下的子目錄應該包括這個We b應用程序的所有S e r v l e t文件,以及沒有被
壓縮打入J A R包的其他c l a s s文件和相關資源。注意,在這個目錄下的J a v a類應該按照其所
屬的包組織目錄
We b - I N F / l i b / 這這個目錄下包含了所有壓縮到J A R文件中的類文件和相關文件。比如:第三方提供的
J a v a庫文件、J D B C驅動程序等等. . . . . .
2. web.xml文件
w e b . x m l文件包含了描述整個We b應用程序的信息。下面以一個w e b . x m l文件為例,講解里
面的各個對象。
web.xml:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<!-
Web應用程序的主要描述
-->
<display-name>My Web Application</display-name>
<description>
在這里加入Web應用程序的描述信息
</description>
<!-
下面定義了Web應用程序的初始化參數,
在JSP或Servlet文件中使用下面的語句
來得到初始化參數
String value =
getServletContext().getInitParameter("name");
這里可以定義任意多的初始化參數
-->
第3章J S P開發平臺的建立:To m c a t87
<context-param>
<param-name>webmaster</param-name>
<param-value>[email protected]</param-value>
<description>
這里包含了初始化參數的描述
</description>
</context-param>
<!-
下面的定義描述了組成這個Web應用程序的
Servlet,還包含初始化參數。在Tomcat中,也
可以將放在Web-INF/classes中的Servlet直接以
servlet/Servlet名訪問,但是一般來說,不推薦這
樣使用。而且這樣的使用方法還會導致Servlet的
相關資源組織的復雜性。所以一般來說推薦將所
有的Servlet在這里定義出來。初始化參數可以在
Servlet中一這種語句的到:
String value =
getServletConfig().getInitParameter("name");
-->
<servlet>
<servlet-name>controller</servlet-name>
<description>
這里加入這個Servlet的描述
</description>
<servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class>
<init-param>
<param-name>listOrders</paramName>
<param-value>com.mycompany.myactions.ListOrdersAction</param-value>
</init-param>
<init-param>
<param-name>saveCustomer</paramName>
<param-value>com.mycompany.myactions.SaveCustomerAction</param-value>
</init-param>
<!-
服務器啟動后這個Servlet加載的時間
-->
<load-on-startup>5</load-on-startup>
</servlet>
<servlet>
<servlet-name>graph</servlet-name>
<description>
這個Servlet的描述
</description>
</servlet>
<!-
Servlet映射對應了一個特殊的URI請求
到一個特殊的Servlet的關系
-->
88第一部分JSP 入門
<servlet-mapping>
<servlet-name>controller</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>graph</servlet-name>
<url-pattern>/graph</url-pattern>
</servlet-mapping>
<!-
設定缺省的Session過期時間
-->
<session-config>
<session-timeout>30</session-timeout> <!-- 30 minutes -->
</session-config>
</web-app>
3. 將應用程序打包為WA R文件
WA R文件是包裝We b應用程序的一種方法,使用WA R文件,既方便了管理各種相關文件,
又減小了整個應用程序的體積。
下面先來看一看將We b應用程序打包為WA R文件的語法:
packager -webArchive[-classpath servletorjspbean/classes [ -
classFiles package/MyClass1.class: package/MyClass2.class ] ]
<content-root> [-contentFiles login.jsp:index.html:images/me.gif]
web.xml myWebApp.war
下面是一個簡單的應用示例,將m y We b P a g e . x m l的配置和m y We b P a g e D i r /下的文件打入包
m y We b P a g e . w a r中:
packager -webArchive myWebPageDir myWebPage.xml myWebPage.war
使用-contentFiles 標志可以添加個別的目錄文件
packager -webArchive myWebPageDir -contentFiles Hello.jsp
myWebPage.xml myWebPage.war
packager -webArchive myWebPageDir -contentFiles Hello.jsp:Hello.html
myWebPage.xml myWebPage.war
假定S e r v l e t文件在c l a s s e s / p a c k a g e / S e r v l e t 1 . c l a s s,指定S e r v l e t和J S P文件:
packager -webArchive -classpath classes myWebPageDir -contentFiles
Hello.jsp myWebPage.xml myWebPage.war.
下面示例如何僅僅包含package/Servlet1.class 和packageB/Servlet.class 兩個文件到WA R文
件中:
packager -webArchive -classpath classes -classFiles package/
Servlet1.class:packageB/Servlet.class myWebPageDir -contentFiles
Hello.jsp myWebPage.xml myWebPage.war
最后,需要說明的是,每個. w a r文件前面的. x m l文件就是前面講過的w e b . x m l文件。生成的
WA R文件可以直接放在包含We b應用程序的目錄下使用。
第3章J S P開發平臺的建立:To m c a t89