Tomcat認識
Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,按照Sun Microsystems提供的技術規範,實現了對Servlet和JavaServer Page(JSP)的支持,並提供了作爲Web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。由於Tomcat本身也內含了一個HTTP服務器,它也可以被視作一個單獨的Web服務器。——來自維百科
下載安裝Tomcat
- 下載Tomcat
- 解壓下載好的zip到指定工作目錄(注意安裝目錄不能包含空格和中文)
- 配置支持Tomcat運行的環境變量JAVA_HOME(到jdk的安裝目錄即可)
- 其它注意問題:
- 端口占用問題:可以在cmd下輸入netstat -ano命令查看端口占用信息
- Catalina_Home環境變量: 點擊startup.bat啓動哪個tomcat由此環境變量指定,如果不配置則啓動當前tomcat,推薦不要配置此環境變量
Tomcat文件目錄結構
- bin :Tomcat啓動/關閉等批處理文件所在位置
- conf:Tomcat相關配置文件所在位置(重要)
- lib:支持Tomcat運行所需jar包所在位置
- logs:Tomcat運行時產生的日誌文件所在位置
- temp:Tomcat運行時所產生的臨時文件所在位置
- webapps:web應用部署位置(重要)
- work:Tomcat工作目錄
Tomcat容器的結構(server.xml)
注意:某些結構本身並不是容器,所以不存在包含關係,建議用調度的角度去理解
server element
代表整個容器,是Tomcat實例的頂層元素
service element
代表包含一個管理Host的Engine和多個監聽器Connector的集合,負責監聽並安排處理客戶端的請求
Connector element
代表與客戶程序實際交互的給件,它負責接收客戶請求,以及向客戶返回響應結果.
- Coyote Http/1.1 Connector 在端口處偵聽來自客戶瀏覽器的http請求
- Coyote JK2 Connector 在端口處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
Engine element
Engine代表Connector接收請求後的入口,分析包含在請求中的http頭消息,然後匹配對應的主機,若沒有匹配到,使用默認主機
px:在該元素下可以配置多臺虛擬主機Host element
代表虛擬主機,它可以解析對應的應用路徑,每個虛擬主機下可部署一個或多個web應用
Context element
代表了運行在Host主機下的當個web應用
Tomcat配置文件
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 父級元素
監聽8005端口等待關閉命令
接收到SHOUTDOWN關閉服務器
-->
<Server port="8005" shutdown="SHUTDOWN">
<!-- 各種對服務的監聽器 -->
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!-- 全局資源 -->
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!-- 一個Service集合 -->
<Service name="Catalina">
<!-- HTTP報文監聽器
監聽8080端口
redirectport : 當客戶請求是https時,把該請求轉發到端口8443去
minProcessors : 最小線程數,開始時創建的保持常態的線程數
maxProcessors : 最大線程數,當現有的線程不夠服務客戶請求時,若線程總數不足該數個數,則創建新線程來處理請求
connectionTimeout:連接超時時間
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- AJP報文監聽器
監聽8009端口
-->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!-- Engine
defauletHost:默認主機
-->
<Engine name="Catalina" defaultHost="localhost">
<!-- 虛擬主機localhost
appBase : 該虛擬主機的根目錄是webapps/
它將匹配請求和自己的Context的路徑,並把請求轉交給對應的Context來處理
autoDeploy:設置自動部署
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<!-- Context,WebApp
path : 該Context的路徑名,若爲""則該Context爲默認Context
docBase : 該Context的根目錄是webapps/test/
-->
<Context path="" docBase="test" debug="0"/>
</Host>
</Engine>
</Service>
</Server>
context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- 設置JNDI -->
<Environment name="hncu" value="hello welcome use jndi" type="java.lang.String" />
<!-- 設置服務器託管數據源此處使用的是Tomcat的dbcp -->
<Resource name="jdbc/dbcp" auth="Container" type="javax.sql.DataSource"
maxTotal="30" maxIdle="20" maxWaitMillis="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"/>
<resource-ref>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- 託管c3p0 -->
<Resource name="jdbc/c3p0" auth="Container"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
factory="org.apache.naming.factory.BeanFactory"
driverClass="com.mysql.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"
user="root"
password="root"
minPoolSize="10"
maxPoolSize="30"
maxIdleTime="1800"
acquireIncrement="2"
maxStatements="0"
initialPoolSize="20"
idleConnectionTestPeriod="60"
acquireRetryAttempts="30"
acquireRetryDelay="1000"
testConnectionOnCheckin="false"
breakAfterAcquireFailure="false"
testConnectionOnCheckout="false"/>
</Context>
tomcat-users.xml
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<!-- 配置賬戶密碼 -->
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="tomcat" password="tomcat" roles="tomcat,role1"/>
<user username="tomcat" password="tomcat" roles="role1"/>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="h
ttp://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 默認servlet,所有servlet都無法匹配時執行該servlet -->
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<!-- 初識servlet參數 -->
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!--當請求的是一個JSP頁面的時候(*.jsp)該servlet被調用
它是一個JSP編譯器,將請求的JSP頁面編譯成爲servlet再執行
-->
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
<!-- 配置session -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Tomcat處理Http請求
以http://localhost:8080/test/test.jsp爲例:
1. 請求到達服務器端口8080,被在那裏偵聽的Coyote HTTP/1.1 Connector獲得,並把它轉交給Engine,等待迴應。
2. Engine獲得請求http://localhost:8080/test/test.jsp,匹配它所擁有的所有虛擬主機Host,匹配名稱爲localhost的主機(若沒有使用默認主機),把請求轉發給該主機,並等待迴應
3. localhost Host獲得請求/test/test.jsp,匹配它所擁有的所有Context,若匹配到路徑爲/test的Context,將請求交給它(如沒有交給路徑爲”“的Context處理)
4. Context獲得請求/test.jsp,在它的映射表中查找該資源,找到後構造HttpServletRequest對象和HttpServletResponse對象,作爲參數調用Servlet的doGet或doPost方法
5. Context把執行完了之後的HttpServletResponse對象返回給Host
6. Host把HttpServletResponse對象返回給Engine
7. Engine把HttpServletResponse對象返回給Connector
8. Connector把HttpServletResponse對象返回給客戶browser
參考文章
http://www.infoq.com/cn/articles/zh-tomcat-http-request-1
http://blog.csdn.net/skp127/article/details/52026150