1. 程式人生 > >Servlet和Tomcat的基礎知識

Servlet和Tomcat的基礎知識

1.servlet的工作過程以及容器的作用

Servlet沒有main()方法,他們受控與另外一個java應用,這個java應用稱為容器(Container)。Tomcat就是這麼一個容器,web伺服器應用(如Apache)得到一個指向Servlet的請求時,伺服器不是把這個請求交給Servlet本身,而是交給部署該servlet的容器。要由容器向servlet提供HTTP請求和響應,而且是由容器呼叫servlet的方法(doGet()和doPost())。容器執行多個servlet執行緒來處理對同一servlet的多個請求。(對每個請求分配一個執行緒,而不是每個客戶)
容器的作用:
1)通訊支援
。利用容器提供的方法,web伺服器能輕鬆的與servlet進行通訊。
2)生命週期管理。容器控制著servlet的生與死。它會負責載入類,例項化,初始化,呼叫servlet的方法以及使servlet能夠被垃圾回收。
3)多執行緒支援。容器會自動的接受每個servlet請求,建立一個新的java執行緒。針對每個請求,如果servlet已經執行完相應的HTTP方法,執行緒就會結束。但是我們同時也得考慮執行緒的安全性。
4)JSP支援。負責將JSP翻譯成真正的java。容器是如何處理使用者請求的了?
1)使用者點選一個連結,指向一個servlet而不是一個靜態頁面。
2)web伺服器接到這個請求後轉發給容器。容器接著建立兩個物件:HttpServletRequest和HttpServletResponse。
3)容器根據請求中的URL找到相應的servlet,為這個請求建立一個執行緒,並把請求物件HtttpServletRequest和響應物件HttpServletResponse傳遞給這個servlet執行緒。
4)執行緒接下來呼叫service()方法,根據請求的不同,service()方法呼叫doGet()和doPost()方法。
5)doGet()方法生成動態頁面,並把這個頁面塞到響應物件裡。
6)service()方法結束,隨之執行緒結束,容器把響應物件裝換為一個HTTP相應,傳送給客戶,然後刪除請求和響應物件。
2.Servlet的生命週期
注意他的一生都是由容器控制的。servlet一生中只有一個例項出現,但是有多個執行緒出現。
載入類 Servlet .class檔案
例項化 建構函式執行
初始化 容器呼叫 init() 方法(一生只調一次)
service方法? servlet一生主要在這裡度過
銷 毀? 銷燬例項之前呼叫 destroy() 方法
可回收? 等待垃圾回收等待垃圾回收
3.Servlet一生中的三大重要時刻
1)init()方法:在servlet例項被建立後呼叫,可以覆蓋此方法做一些初始化的工作,比方說得到一個數據庫連線。
2)service()方法:當客戶請求到來時,容器會建立一個新的執行緒,呼叫servlet的service()方法。servlet的一生基本都在這裡度過。我們一般不要覆蓋此方法。
3)doGet或者doPost()方法:service方法根據請求的HTTP方法,來呼叫doGet()或者doPost()方法。我們在開發servlet時肯定要覆蓋此方法。每次執行doGet()或者doPost()方法,它都在一個單獨的執行緒
中。4.容器(tomcat)在啟動時會做什麼?
容器在啟動時,會根據相應的部署檔案去尋找servlet檔案。
5.為什麼要有init方法了?難道不能將init程式碼放在建構函式中麼?
因為讓一個普通的java類成為servlet檔案時容器付出的代價也挺大,比如說記憶體分配。在沒有呼叫init方法時他還是一個普普通通的java物件,只有在使用者使用時才再讓他稱為servlet這樣對資源的利
用比較合理,注意:init方法是在第一個使用者呼叫此servlet時被觸發。

一:Servlet是什麼?Servlet容器是什麼?Tomcat是什麼?Tomcat的組成結構以及Tomcat的工作模式。

最近沒事在翻《Tomcat與Java Web開發技術詳解》,本文隨記一篇。

題外話:前幾天做了一幅漫畫,發到微博上,效果還不錯~


二:Servlet是什麼

為了能讓Web伺服器與Web應用這兩個不同的軟體系統協作,需要一套標準介面,Servlet就是其中最主要的一個介面。

規定:

Web伺服器可以訪問任意一個Web應用中實現Servlet介面的類。

Web應用中用於被Web伺服器動態呼叫的程式程式碼位於Servlet介面的實現類中。

SUN公司(現在被Oracle收購了……)制定了Web應用於Web伺服器進行協作的一系列標準Java介面(統稱為Java Servlet API)。

SUN公司還對Web伺服器釋出及執行Web應用的一些細節做了規約。SUN公司把這一系列標準Java介面和規約統稱為Servlet規範。

Servlet是一種執行在伺服器上的小外掛。

Servlet容器是什麼

在Servlet規範中,把能夠釋出和執行JavaWeb應用的Web伺服器稱為Servlet容器,他的最主要特稱是動態執行JavaWeb應用中的Servlet實現類中的程式程式碼。

Tomcat是什麼

Tomcat是Servlet容器,同時也是輕量級的Web伺服器。這是它的兩個身份!

Apache Server、Microsoft IIS、Apache Tomcat都是Web伺服器。

Tomcat作為Web伺服器時,主要負責實現HTTP傳輸等工作。

Tomcat作為Servlet容器時,主要負責解析Request,生成ServletRequest、ServletResponse,將其傳給相應的Servlet(呼叫service( )方法),再將Servlet的相應結果返回。

Tomcat組成結構


Server,代表整個Servlet容器元件,是Tomcat的頂層元素。其中可以包含一到多個Service;

Service,包含一個Engine,以及一到多個Connector;

Connector,代表和客戶端程式實際互動的元件,負責接收客戶請求,以及向客戶返回響應結果;

Engine,處理同一個Service中所有Connector接收到的客戶請求;

Host,在Engine中可以包含多個Host,每個Host定義了一個虛擬主機,它可以包含一個到多個Web應用;

Context,一個Host中可以包含多個Context,每個Context代表了執行在虛擬主機上的單個Web應用。

這些欄位都在conf/server.xml中配置,下面是一段apache tomcat 6.0.36預設的server.xml:

[html] view plain copy  print?
  1. <?xmlversion='1.0'encoding='utf-8'?>
  2. <!--  
  3.   Licensed to the Apache Software Foundation (ASF) under one or more  
  4.   contributor license agreements.  See the NOTICE file distributed with  
  5.   this work for additional information regarding copyright ownership.  
  6.   The ASF licenses this file to You under the Apache License, Version 2.0  
  7.   (the "License"); you may not use this file except in compliance with  
  8.   the License.  You may obtain a copy of the License at  
  9.       http://www.apache.org/licenses/LICENSE-2.0  
  10.   Unless required by applicable law or agreed to in writing, software  
  11.   distributed under the License is distributed on an "AS IS" BASIS,  
  12.   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  13.   See the License for the specific language governing permissions and  
  14.   limitations under the License.  
  15. -->
  16. <!-- Note:  A "Server" is not itself a "Container", so you may not  
  17.      define subcomponents such as "Valves" at this level.  
  18.      Documentation at /docs/config/server.html  
  19.  -->
  20. <Serverport="8005"shutdown="SHUTDOWN">
  21.   <!--APR library loader. Documentation at /docs/apr.html -->
  22.   <ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on"/>
  23.   <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  24.   <ListenerclassName="org.apache.catalina.core.JasperListener"/>
  25.   <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  26.   <ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  27.   <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  28.   <ListenerclassName="org.apache.catalina.mbeans.ServerLifecycleListener"/>
  29.   <ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  30.   <!-- Global JNDI resources  
  31.        Documentation at /docs/jndi-resources-howto.html  
  32.   -->
  33.   <GlobalNamingResources>
  34.     <!-- Editable user database that can also be used by  
  35.          UserDatabaseRealm to authenticate users  
  36.     -->
  37.     <Resourcename="UserDatabase"auth="Container"
  38.               type="org.apache.catalina.UserDatabase"
  39.               description="User database that can be updated and saved"
  40.               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  41.               pathname="conf/tomcat-users.xml"/>
  42.   </GlobalNamingResources>
  43.   <!-- A "Service" is a collection of one or more "Connectors" that share  
  44.        a single "Container" Note:  A "Service" is not itself a "Container",   
  45.        so you may not define subcomponents such as "Valves" at this level.  
  46.        Documentation at /docs/config/service.html  
  47.    -->
  48.   <Servicename="Catalina">
  49.     <!--The connectors can use a shared executor, you can define one or more named thread pools-->
  50.     <!--  
  51.     <Executorname="tomcatThreadPool"namePrefix="catalina-exec-"
  52.         maxThreads="150"minSpareThreads="4"/>
  53.     -->
  54.     <!-- A "Connector" represents an endpoint by which requests are received  
  55.          and responses are returned. Documentation at :  
  56.          Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)  
  57.          Java AJP  Connector: /docs/config/ajp.html  
  58.          APR (HTTP/AJP) Connector: /docs/apr.html  
  59.          Define a non-SSL HTTP/1.1 Connector on port 8080  
  60.     -->
  61.     <Connectorport="8080"protocol="HTTP/1.1"
  62.                connectionTimeout="20000"
  63.                redirectPort="8443"/>
  64.     <!-- A "Connector" using the shared thread pool-->
  65.     <!--  
  66.     <Connectorexecutor="tomcatThreadPool"
  67.                port="8080"protocol="HTTP/1.1"
  68.                connectionTimeout="20000"
  69.                redirectPort="8443"/>
  70.     -->
  71.     <!-- Define a SSL HTTP/1.1 Connector on port 8443  
  72.          This connector uses the JSSE configuration, when using APR, the   
  73.          connector should be using the OpenSSL style configuration  
  74.          described in the APR documentation -->
  75.     <!--  
  76.     <Connectorport="8443"protocol="HTTP/1.1"SSLEnabled="true"
  77.                maxThreads="150"scheme="https"secure="true"
  78.                clientAuth="false"sslProtocol="TLS"/>
  79.     -->
  80.     <!-- Define an AJP 1.3 Connector on port 8009 -->
  81.     <Connectorport="8009"protocol="AJP/1.3"redirectPort="8443"/>
  82.     <!-- An Engine represents the entry point (within Catalina) that processes  
  83.          every request.  The Engine implementation for Tomcat stand alone  
  84.          analyzes the HTTP headers included with the request, and passes them  
  85.          on to the appropriate Host (virtual host).  
  86.          Documentation at /docs/config/engine.html -->
  87.     <!-- You should set jvmRoute to support load-balancing via AJP ie :  
  88.     <Enginename="Catalina"defaultHost="localhost"jvmRoute="jvm1">
  89.     -->
  90.     <Enginename="Catalina"defaultHost="localhost">
  91.       <!--For clustering, please take a look at documentation at:  
  92.           /docs/cluster-howto.html  (simple how to)  
  93.           /docs/config/cluster.html (reference documentation) --