Tomcat認知

Tomcat認識

Tomcat是由Apache軟件基金會下屬的Jakarta項目開發的一個Servlet容器,按照Sun Microsystems提供的技術規範,實現了對Servlet和JavaServer Page(JSP)的支持,並提供了作爲Web服務器的一些特有功能,如Tomcat管理和控制平臺、安全域管理和Tomcat閥等。由於Tomcat本身也內含了一個HTTP服務器,它也可以被視作一個單獨的Web服務器。——來自維百科

下載安裝Tomcat

  1. 下載Tomcat
  2. 解壓下載好的zip到指定工作目錄(注意安裝目錄不能包含空格和中文)
  3. 配置支持Tomcat運行的環境變量JAVA_HOME(到jdk的安裝目錄即可)
  4. 其它注意問題:
    • 端口占用問題:可以在cmd下輸入netstat -ano命令查看端口占用信息
    • Catalina_Home環境變量: 點擊startup.bat啓動哪個tomcat由此環境變量指定,如果不配置則啓動當前tomcat,推薦不要配置此環境變量

Tomcat文件目錄結構

  1. bin :Tomcat啓動/關閉等批處理文件所在位置
  2. conf:Tomcat相關配置文件所在位置(重要)
  3. lib:支持Tomcat運行所需jar包所在位置
  4. logs:Tomcat運行時產生的日誌文件所在位置
  5. temp:Tomcat運行時所產生的臨時文件所在位置
  6. webapps:web應用部署位置(重要)
  7. work:Tomcat工作目錄

Tomcat容器的結構(server.xml)

注意:某些結構本身並不是容器,所以不存在包含關係,建議用調度的角度去理解

Tomcat原理圖

  1. server element

    代表整個容器,是Tomcat實例的頂層元素

  2. service element

    代表包含一個管理Host的Engine和多個監聽器Connector的集合,負責監聽並安排處理客戶端的請求

  3. Connector element

    代表與客戶程序實際交互的給件,它負責接收客戶請求,以及向客戶返回響應結果.

    • Coyote Http/1.1 Connector 在端口處偵聽來自客戶瀏覽器的http請求
    • Coyote JK2 Connector 在端口處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求
  4. Engine element

    Engine代表Connector接收請求後的入口,分析包含在請求中的http頭消息,然後匹配對應的主機,若沒有匹配到,使用默認主機
    px:在該元素下可以配置多臺虛擬主機

  5. Host element

    代表虛擬主機,它可以解析對應的應用路徑,每個虛擬主機下可部署一個或多個web應用

  6. 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 &quot;%r&quot; %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&amp;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

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