Apache Tomcat 學習(由淺入深)

今天,我們一起學習一下Tomcat,本文內容主要參考與 Apache Tomcat 7 官方文檔,以及Tomcat 7源碼。內容主要分爲一下五個方面:

一、什麼是Tomcat?

Apache Tomcat 是一個Java Servlet、JavaServer Pages、Java Expression Language 和Java WebSocket技術的開源實現。

二、Tomcat安裝和配置

1、下載Tomcat 7安裝包,進入 Apache Tomcat 7 下載頁面,選擇適合你係統的版本,這裏下載的是window版本。

2、下載成功後,解壓。這裏解壓到了D:\Tomcat\apache-tomcat-7目錄底下。

3、配置JAVA_HOME,在系統環境變量中新建JAVA_HOME環境變量並指定爲系統JDK的安裝目錄。JAVA_HOME環境變量配置

4、點擊\bin目錄底下的startup.bat 可以看到Tomcat成功運行。

5、編寫Servlet簡單demo

1)、在\webapps 目錄下創建HelloWeb目錄,進入該目錄,創建\classes和\lib目錄,並新建web.xml文件。

2)、打開IDEA,創建maven工程,引入Servlet依賴:

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

 3)、構建HelloServlet類:

public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.println("Hello World");
        writer.close();
    }
}

4)、在maven工具點擊package,打包項目,並將生成的\target\classes拷貝到\HelloWeb\classes目錄底下,將javax.servlet-api-3.1.0.jar拷貝到\HelloWeb\lib目錄底下

5)、配置web.xml文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

6)、重新啓動Tomcat 可以看到瀏覽器輸出Hello World.

三、Tomcat的目錄結構和整體架構。

Tomcat 目錄

1、\bin 裏面含有啓動tomcat所有要的jar包和腳本文件。

bootstrap.jar、commons-daemon.jar、tomcat-juli.jar這三個包是tomcat在啓動時加載的類,其中,bootstrap.jar含有tomcat啓動類,在catalina.bat啓動腳本文件中, 我們可以看到如下腳本:

%_EXECJAVA% %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%

其中

%_EXECJAVA%代表JAVA命令

 %LOGGING_CONFIG% %LOGGING_MANAGER% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -D%ENDORSED_PROP%="%JAVA_ENDORSED_DIRS%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" 代表JAVA 命令運行時的JVM參數和系統變量

-classpath 代表指定JAVA文件的路徑

"%CLASSPATH%"代表D:\Tomcat\apache-tomcat-7\apache-tomcat-7.0.103\bin\bootstrap.jar.

rem Add on extra jar file to CLASSPATH
rem Note that there are no quotes as we do not want to introduce random
rem quotes into the CLASSPATH
if "%CLASSPATH%" == "" goto emptyClasspath
set "CLASSPATH=%CLASSPATH%;"
:emptyClasspath
set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"

 %MAINCLASS%代表在"%CLASSPATH%"路徑下的類,這裏是

set MAINCLASS=org.apache.catalina.startup.Bootstrap

%CMD_LINE_ARGS%代表main函數的入參

%ACTION%代表最後一個入參,也就是Tomcat運行的動作,org.apache.catalina.startup.Bootstrap類會根據最後一個參數決定Tomcat的狀態.下圖是org.apache.catalina.startup.Bootstrap#main()方法

Main

Tomcat的啓動腳本簡化來看是這樣的:

java org.apache.catalina.startup.Bootstrap start

2、\conf包含Tomcat Web服務的配置文件,其中最重要的是server.xml文件:

<?xml version='1.0' encoding='utf-8'?>
<!-- 每一個Tomcat服務只有一個Server port是指TCP/IP端口,用於接收shutdown命令 shutdown是指shutdown命令的String值-->
<Server port="8005" shutdown="SHUTDOWN">
  <!-- 代表Server的JNDI資源 所有的web項目都可以訪問到 -->
  <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>

  <!-- tomcat 服務 包含 一個Engine 和 至少一個 Connector -->
  <Service name="Catalina">
    <!-- 連接器 它確保Tomcat可以作爲一個獨立的web服務 主要包含ProtocolHandler 和 Adapter ProtocolHandler又包含EndPoint和Processor EndPoint主要用於接受請求 Processor 主要用於處理請求 Adapter 主要用於將處理過的請求交給具體的servlet處理 -->
    <!-- port 連接器監聽的端口號 -->
    <!-- protocol 連接器使用的傳輸協議 -->
    <!-- connectionTimeout 連接建立後 等待請求的時間 否則超時 單位是微秒 -1代表不設置超時時間-->
    <!-- redirectPort 假如該連接器不支持SSL請求 那麼它會將請求轉發到該端口的連接器 -->
    <!-- acceptCount 可接收的請求數目 超過該值 請求將阻塞 -->
    <!-- maxThreads 連接器可以創造的用於處理請求的最大線程數目 -->
    <!-- minSpareThreads 最小空閒處理請求的線程數目 -->
    <!-- URIEncoding 用於解碼URI字節的字符編碼 -->
    <Connector port="8080" 
               protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               acceptCount="100"
               maxThreads="200"
               minSpareThreads="10"
               URIEncoding="ISO-8859-1" />
    <!-- 引擎,用來管理多個站點,一個Service最多只能有一個Engine -->
    <!-- name 引擎的名字 -->
    <!-- localhost 默認Host 必須 用於處理沒有匹配的請求 -->
    <Engine name="Catalina" defaultHost="localhost">
      <!-- 代表一個站點,也可以叫虛擬主機,通過配置Host就可以添加站點 -->
      <!-- name 站點名稱 跟站點域名對應 -->
      <!-- appBase 應用的基礎路徑 默認是webapps -->
      <!-- unpackWARs 是否自動解壓war包 -->
      <!-- autoDeploy 是否開啓自動部署 -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
           <!-- 代表一個應用程序,對應着平時開發的一套程序,或者一個WEB-INF目錄以及下面的web.xml文件 -->
           <!-- path 請求的路徑 -->
           <!-- docBase 應用的存放路徑 HelloWeb -->
           <Context path="HelloWeb"  docBase="HelloWeb">
           </Context >
      </Host>
    </Engine>
  </Service>
</Server>

3、\lib目錄主要存放tomcat的依賴類.

4、\webapps應用存放Servlet應用.

解釋完了上述各部分 我們從整體的角度看一下Tomcat的結構:

架構圖

Tomcat中最頂層的容器是Server,代表着整個服務器,從上圖中可以看出,一個Server可以包含至少一個Service,用於具體提供服務。

Service主要包含兩個部分:Connector和Container。從上圖中可以看出 Tomcat 的心臟就是這兩個組件,他們的作用如下:

1、Connector用於處理連接相關的事情,並提供Socket與Request和Response相關的轉化;
2、Container用於封裝和管理Servlet,以及具體處理Request請求;

再來看一下他們之間的關係圖:

關係圖

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章