Tomcat容器入門介紹
轉自javaresearch.com由timgball 整理
Tomcat是一個免費的開源Web服務器,最新版本是5.5.1,支持Servlet2.4,JSP2.0,非常適合初學者學習Java Web開發。下面是一個簡單的Tutorial:[安裝Tomcat],在安裝Tomcat之前,必須首先安裝JDK1.4,因為Tomcat本身是純Java程序,需要JVM運行,此外JSP頁面需要javac來編譯運行,因此必須安裝JDK(單裝JRE不行)。然后從Tomcat官方站點下載最新版的Tomcat:Windows版本:http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.5.1/bin/jakarta-tomcat-5.5.1.zip ,Linux版本:http://apache.linuxforum.net/dist/jakarta/tomcat-5/v5.5.1/bin/jakarta-tomcat-5.5.1.tar.gz
Tomcat不需安裝,直接解壓到某個目錄即可(請注意整個路徑不要有中文名)。
[配置Tomcat]
先設置如下環境變量:
JAVA_HOME = <JDK安裝目錄>
TOMCAT_HOME = <Tomcat根目錄>
在Path最后附加:
Path = ......;%JAVA_HOME%/bin
如果使用linux,請用export設置環境變量。
然后打開控制台窗口,輸入javac,如果能夠運行,說明能找到JDK的編譯器,輸入java -version,如果顯示1.4.x_xx則配置正確,否則檢查是否安裝了低版本的JDK(比如1.3版本),如果有低版本的JDK,把它從Path中移除即可。
[啟動和關閉Tomcat]
打開目錄%TOMCAT_HOME%/bin,運行startup.bat(linux下是startup.sh),稍等片刻,直到出現信息: Server startup in XXXXX ms表示啟動成功!要關閉Tomcat,最好不要直接關掉控制台窗口,運行%TOMCAT_HOME%/bin/shutdown.bat(linux下是shutdown.sh)。
[第一個JSP程序]
運行在Tomcat的Web程序全部放在%TOMCAT_HOME%/webapps下,每個應用單獨一個目錄,我們開始寫第一個"Hello, world"JSP頁面。
首先,我們在%TOMCAT_HOME%/webapps下新建一個hello目錄,作為整個Web應用程序的根目錄,然后在hello目錄下新建hello.jsp,用任何文本編輯器輸入以下內容:
<% out.println("Hello, world."); %>
然后啟動Tomcat,打開瀏覽器,輸入http://localhost:8080/hello/hello.jsp,稍等片刻,瀏覽器顯示“Hello, world.”我們的第一個JSP運行成功!
[Web開發基礎]
J2EE的Web應用程序有標准的格式,我們先創建如下結構的目錄(請嚴格區分大小寫):
hello |
+- WEB-INF |
+- classes |
+- lib
+- web.xml
所有需要的class文件均以WEB-INF/classes/為根目錄按包名存放,所有的jar文件全部放在WEB-INF/lib下,Web服務器(比如Tomcat)會自動把classes和lib下的所有jar文件動態添加到CLASSPATH中,其中classes目錄優先級高,如果classes和lib中某個jar的class全名相同,則只會找到classes下的文件。
WEB-INF/web.xml是標准配置文件,負責注冊Servlet,Filter及其它用到的資源。在我們的hello應用中,因為沒有web.xml,Tomcat會使用缺省的配置文件(就是tomcat自帶的web.xml)。
一般說來,自己寫的class包括servlets,filter,javaBean等編譯后放在classes目錄下,用到的第三方jar(如struts.jar)放在lib下。
JSP文件可放在根目錄下的任意位置,但是位置不同會影響URL的格式。以上面的hello應用為例,我們指定hello/hello.jsp,則URL為http://localhost:8080/hello/hello.jsp,若是放在hello/admin/hello.jsp,則相應的URL變為http://localhost:8080/hello/admin/hello.jsp,若是放在WEB-INF下,則用戶不可直接訪問此JSP文件,只能通過RequestDispatch間接訪問,此方法可向用戶屏蔽真實的URL,在struts等Web框架中被廣泛使用。
[發布Web應用程序]
發布Web應用程序非常簡單,直接使用jar命令將整個hello目錄打包,命名為xxx.war,然后復制到另一台計算機的%TOMCAT_HOME%/webapps/下(或者別的Web服務器如Resin,WebLogic也可),啟動服務器,它會自動找到這個war文件並解壓安裝。
./catalina.sh start 開啟tomcat服務
./catalina.sh stop 關閉tomcat服務
Tomcat配置異常及其解決
Tomcat配置異常及其解決
1、JAVA_HOME 配置錯誤,或者沒有配置
這時候,可以按照上面的步驟在來一次,在命令行中輸入Java -version,如果顯示

就表示成功了。
2、如果你的機器已經占有了8080 端口,則無法啟動
解決方法
(1) 你可以8080 先關閉
netstat –an
netstat –anb 來查看誰占用該8080
(2) 主動改變tomcat的端口.
到 conf/server.xml 文件中修改

3、 能夠正常啟動,但是會導航到另外一個頁面
去修改工具->管理加載項,把默認的導航給禁用即可
4、瀏覽器顯示404 Not Found
在訪問 tomcat時候,一定要保證 tomcat 服務器是啟動,不然就會出現這種錯誤。
Tomcat的目錄結構文件

bin: 啟動和關閉tomcat的bat文件
conf: 配置文件
-->server.xml : 該文件用於配置和 server 相關的信息, 比如 tomcat啟動端口后,配置Host, 配置Context (容器,它裝載的有Wrapper,通過它可以對所有資源進行訪問)即web應用
-->web.xml : 該文件配置與 web應用(web應用就相當於是一個 web站點)
-->tomcat-users.xml: 該文件用戶配置tomcat 的用戶密碼 和 權限
lib 目錄: 該目錄放置運行tomcat 運行需要的jar包
logs 目錄:存放日志, 當我們需要去查看日志的時候,很有用!,當我們啟動tomcat錯誤時候,可以查詢信息.
webapps 目錄: 該目錄下,放置我們的web應用(web 站點), 比如:
建立 web1 目錄 下面放置我們的html 文件 jsp 文件..圖片... 則 web1就被當做一個web應用管理起來(☞ 特別說明tomcat 6.0 以后支持 tomcat 5 版本 還有別的設置)
work: 工作目錄: 該目錄用於存放jsp被訪問后 生成的對應的 server文件 和.class文件
如何訪問一個web應用的某個文件

應用程序通過端口與操作系統進行連接,因此可以通過系統的端口號訪問到應用程序,這是應用程序之間通信的途徑
PS:想要訪問一個WEB應用中的某個文件可以采用url(Uniform Resource Locator)統一資源定位符來訪問,其格式如上。
Tomcat應用部署目錄結構規范

Tomcat管理虛擬目錄
需求:當希望將web應用部署到非webapps目錄下時,換句話說,就是希望把非webapps目錄下的web項目部署到tomcat中怎么解決這問題。
PS:可以通過虛擬目錄配置技術解決。

配置步驟
1、找到server.xml文件
2、編輯host節點,添加Context path
//這里配置的設置都將成為,服務器找不到資源的第二方案,或者覆蓋默認配置的方式
<Context path="/應用名" docBase="web應用所在的絕對路徑"/>
例如:要訪問該web應用根目錄下的hello.html文件
實際訪問時輸入的地址:http://localhost:8088/應用名/hello.html
3、重啟、重新部署生效
還可以參考http://www.cnblogs.com/w-wfy/p/6242329.html
context的幾個屬性的說明
path: 應用名稱
docbase: web應用所在的絕對路徑
reloadable: 如果設為ture ,表示 tomcat 會自動更新 web應用,但是這個開銷大,建議在開發過程中,可以設為true, 但是真的發布了,則應當設為false
upackWAR: 如果設為 ture ,則自動解壓,否則不自動解壓.
PS:war包的打包和Tomcat怎么部署war包可以使用搜索引擎找到。
Tomcat管理虛擬路徑配置
請問高人
如何在項目里面的JSP頁面顯示D盤的圖片,項目部署在E 盤,就是說 圖片不是放在項目下的文件夾?
解決方法:
虛擬路徑啊,假設你的工程叫 abc
在 tomcat 的 server.xml 中設置
<Context docBase="e:/pic" path="/abc/pic" />
這樣的話,就可以使用 http://localhost:8080/abc/pic 這個前綴訪問 e:/pic 中的圖片了。即jsp中<img src="http://localhost:8080/abc/pic/xx.jpg"/>如此寫資源路徑
這是因為當服務器訪碰到兩個 http://localhost:8080/http://localhost:8080/abc/pic時就會知道,這是一個虛擬路徑,不按path路徑走,選擇docBase的路徑找資源。
配置域名
實現的步驟如下:
//域名就是使用簡易字符替代IP,這里www.myweb.com替代127.0.0.1,像localhost替代127.0.0.1一樣
(1) 在C:\WINDOWS\system32\drivers\etc 下的host文件 添加127.0.0.1 www.myweb.com
(2) 在tomcat 的server.xml文件添加主機名
<Host name="www.myweb.com" appBase="d:\web3”>
<Context path="/" docBase="d:\web3" />
//這里是說,如果上述path路徑訪問不到,就到docBase路徑下訪問
</Host>
(3) 在d:\web3 加入了一個 /WEB-INF/web.xml 把 hello2.html設為首頁面,如果連端口都不希望帶,則可以把tomcat的啟動端口設為80即可.
(4) 重啟生效
Tomcat框架機制

Tomcat配置默認主機

在tomcat/conf/server.xml 文件
<Engine name="Catalina" defaultHost="主機名">
如:<Engine name="Catalina" defaultHost="www.myweb.com">
Tomcat配置線程池
Connector是可以配置共享線程池的,其作用是在訪問量多的情況下,自動增加線程數量,直到maxThread為止,訪問量趨於平緩之后漸漸減少線程數量,最少到minSpareThreads。開啟Tomcat,該線程池即有minSpareThread條線程。
- <Service name="Catalina">
- <Executor name="myThreadPool" namePrefix="catalina-exec-"
- maxThreads="50" minSpareThreads="10"/>
- <Connector port="8181" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"
- executor="myThreadPool" />
- </Service>
Executor標簽即為線程池
maxThreads屬性即為最大線程數
minSpareThreads即為最小空閑的線程數
Connector標簽即為連接器
executor屬性即為指定線程池
PS:Connector標簽可以配置,maxThread,minSpareThreads兩個屬性,其作用和配置executor屬性一樣,但同時配置了executor和maxThread,minSpareThread。Connector會優先選擇executor配置的線程池。
PS:建議使用executor屬性和Executor標簽來配置線程池,這樣不僅可設置的線程池參數更多,而且也可以實現幾個Connector共享一個線程池的配置,注意:不是共享一個線程池。
Tomcat配置訪問日志
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
該配置為server.xml中的默認配置,其在Host標簽下。
className:類名,默認的訪問日志類為org.apache.catalina.valves.AccessLogValve
directory:文件存放目錄,默認是:logs,其相對路徑是Tomcat的主目錄
prefix:前綴
suffix:后綴
fileDateFormat:按照什么時間給日志切片(分成不同日志文件,防止單一日志文件過大)。官方文檔的描述:The default value is yyyy-MM-dd
. If you wish to rotate every hour, then set this value to yyyy-MM-dd.HH
.
rotatable:該屬性是與fileDateFormat配套使用的,默認為true,如果設置為false,日志文件將不切片。
pattern:輸出文件的模式(格式)。
有以下模式:(截取自官方文檔)
- %a - Remote IP address
- %A - Local IP address
- %b - Bytes sent, excluding HTTP headers, or '-' if zero
- %B - Bytes sent, excluding HTTP headers
- %h - Remote host name (or IP address if
enableLookups
for the connector is false) - %H - Request protocol
- %l - Remote logical username from identd (always returns '-')
- %m - Request method (GET, POST, etc.)
- %p - Local port on which this request was received. See also
%{xxx}p
below. - %q - Query string (prepended with a '?' if it exists)
- %r - First line of the request (method and request URI)
- %s - HTTP status code of the response
- %S - User session ID
- %t - Date and time, in Common Log Format
- %u - Remote user that was authenticated (if any), else '-'
- %U - Requested URL path
- %v - Local server name
- %D - Time taken to process the request, in millis
- %T - Time taken to process the request, in seconds
- %F - Time taken to commit the response, in millis
- %I - Current request thread name (can compare later with stacktraces)
There is also support to write information incoming or outgoing headers, cookies, session or request attributes and special timestamp formats. It is modeled after the Apache HTTP Server log configuration syntax. Each of them can be used multiple times with different xxx
keys:
%{xxx}i
write value of incoming header with namexxx
%{xxx}o
write value of outgoing header with namexxx
%{xxx}c
write value of cookie with namexxx
%{xxx}r
write value of ServletRequest attribute with namexxx
%{xxx}s
write value of HttpSession attribute with namexxx
%{xxx}p
write local (server) port (xxx==local
) or remote (client) port (xxx=remote
)%{xxx}t
write timestamp at the end of the request formatted using the enhanced SimpleDateFormat patternxxx
手工方式打WAR包
第一步:進入到要打包的目錄下,注意,目錄結構必須符合Tomcat規范。
SwitchdeMacBook-Pro:webapps switch$ cd Restaurant/
第二步:使用jar cvf 打包后文件名 打包的文件夾
SwitchdeMacBook-Pro:Restaurant switch$ jar cvf Restaurant.war .
已添加清單
正在添加: SoybeanMilk.html(輸入 = 58) (輸出 = 48)(壓縮了 17%)
正在添加: WEB-INF/(輸入 = 0) (輸出 = 0)(存儲了 0%)
正在添加: WEB-INF/classes/(輸入 = 0) (輸出 = 0)(存儲了 0%)
正在添加: WEB-INF/classes/com/(輸入 = 0) (輸出 = 0)(存儲了 0%)
正在添加: WEB-INF/classes/com/netease/(輸入 = 0) (輸出 = 0)(存儲了 0%)
正在添加: WEB-INF/classes/com/netease/NoodlesServlet.class(輸入 = 1114) (輸出 = 608)(壓縮了 45%)
正在添加: WEB-INF/classes/com/netease/NoodlesServlet.java(輸入 = 740) (輸出 = 318)(壓縮了 57%)
正在添加: WEB-INF/web.xml(輸入 = 361) (輸出 = 173)(壓縮了 52%)
PS:可以看到打包成功了
SwitchdeMacBook-Pro:Restaurant switch$ ls
Restaurant.war SoybeanMilk.html WEB-INF
第三步:將打包好的文件移動至應用目錄,默認為:Tomcat主目錄下的webapps
SwitchdeMacBook-Pro:Restaurant switch$ mv Restaurant.war ..
PS:可以看到移動到了webapps目錄下
SwitchdeMacBook-Pro:Restaurant switch$ cd ..
SwitchdeMacBook-Pro:webapps switch$ ls
ROOT Restaurant Restaurant.war docs examples host-manager manager
PS:這是將原來的應用刪除
SwitchdeMacBook-Pro:webapps switch$ rm -rf Restaurant
PS:原來的應用已被刪除
SwitchdeMacBook-Pro:webapps switch$ ls
ROOT Restaurant.war docs examples host-manager manager
PS:啟動Tomcat
SwitchdeMacBook-Pro:webapps switch$ ../bin/startup.sh
Using CATALINA_BASE: /Users/switch/apache-tomcat-7.0.70
Using CATALINA_HOME: /Users/switch/apache-tomcat-7.0.70
Using CATALINA_TMPDIR: /Users/switch/apache-tomcat-7.0.70/temp
Using JRE_HOME: /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home
Using CLASSPATH: /Users/switch/apache-tomcat-7.0.70/bin/bootstrap.jar:/Users/switch/apache-tomcat-7.0.70/bin/tomcat-juli.jar
Tomcat started.
PS:訪問該應用
SwitchdeMacBook-Pro:webapps switch$ curl http://localhost:8080/Restaurant/noodles
<html><body>
<h1> Noodles with Tomcat</h1>
</body></html>
PS:可以看到webapps目錄下自動生成了該war包對應的應用
SwitchdeMacBook-Pro:webapps switch$ ls
ROOT Restaurant Restaurant.war docs examples host-manager manager
SwitchdeMacBook-Pro:webapps switch$
----------參考《Apache Tomcat 7 Configuration Reference (7.0.70) - The Valve Component》
----------參考《韓順平.細說Servlet》