Servlet和Tomcat的基礎知識
1.servlet的工作過程以及容器的作用
Servlet沒有main()方法,他們受控與另外一個java應用,這個java應用稱為容器(Container)。Tomcat就是這麼一個容器,web伺服器應用(如Apache)得到一個指向Servlet的請求時,伺服器不是把這個請求交給Servlet本身,而是交給部署該servlet的容器。要由容器向servlet提供HTTP請求和響應,而且是由容器呼叫servlet的方法(doGet()和doPost())。容器執行多個servlet執行緒來處理對同一servlet的多個請求。(對每個請求分配一個執行緒,而不是每個客戶)容器的作用:
1)通訊支援
2)生命週期管理。容器控制著servlet的生與死。它會負責載入類,例項化,初始化,呼叫servlet的方法以及使servlet能夠被垃圾回收。
3)多執行緒支援。容器會自動的接受每個servlet請求,建立一個新的java執行緒。針對每個請求,如果servlet已經執行完相應的HTTP方法,執行緒就會結束。但是我們同時也得考慮執行緒的安全性。
4)JSP支援。負責將JSP翻譯成真正的java。容器是如何處理使用者請求的了?
1)使用者點選一個連結,指向一個servlet而不是一個靜態頁面。
2)web伺服器接到這個請求後轉發給容器。容器接著建立兩個物件:HttpServletRequest和HttpServletResponse。
4)執行緒接下來呼叫service()方法,根據請求的不同,service()方法呼叫doGet()和doPost()方法。
5)doGet()方法生成動態頁面,並把這個頁面塞到響應物件裡。
6)service()方法結束,隨之執行緒結束,容器把響應物件裝換為一個HTTP相應,傳送給客戶,然後刪除請求和響應物件。
2.Servlet的生命週期
注意他的一生都是由容器控制的。servlet一生中只有一個例項出現,但是有多個執行緒出現。
例項化 建構函式執行
初始化 容器呼叫 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?- <?xmlversion='1.0'encoding='utf-8'?>
- <!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
- <!-- Note: A "Server" is not itself a "Container", so you may not
- define subcomponents such as "Valves" at this level.
- Documentation at /docs/config/server.html
- -->
- <Serverport="8005"shutdown="SHUTDOWN">
- <!--APR library loader. Documentation at /docs/apr.html -->
- <ListenerclassName="org.apache.catalina.core.AprLifecycleListener"SSLEngine="on"/>
- <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
- <ListenerclassName="org.apache.catalina.core.JasperListener"/>
- <!-- Prevent memory leaks due to use of particular java/javax APIs-->
- <ListenerclassName="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
- <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
- <ListenerclassName="org.apache.catalina.mbeans.ServerLifecycleListener"/>
- <ListenerclassName="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
- <!-- Global JNDI resources
- Documentation at /docs/jndi-resources-howto.html
- -->
- <GlobalNamingResources>
- <!-- Editable user database that can also be used by
- UserDatabaseRealm to authenticate users
- -->
- <Resourcename="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>
- <!-- A "Service" is a collection of one or more "Connectors" that share
- a single "Container" Note: A "Service" is not itself a "Container",
- so you may not define subcomponents such as "Valves" at this level.
- Documentation at /docs/config/service.html
- -->
- <Servicename="Catalina">
- <!--The connectors can use a shared executor, you can define one or more named thread pools-->
- <!--
- <Executorname="tomcatThreadPool"namePrefix="catalina-exec-"
- maxThreads="150"minSpareThreads="4"/>
- -->
- <!-- A "Connector" represents an endpoint by which requests are received
- and responses are returned. Documentation at :
- Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
- Java AJP Connector: /docs/config/ajp.html
- APR (HTTP/AJP) Connector: /docs/apr.html
- Define a non-SSL HTTP/1.1 Connector on port 8080
- -->
- <Connectorport="8080"protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"/>
- <!-- A "Connector" using the shared thread pool-->
- <!--
- <Connectorexecutor="tomcatThreadPool"
- port="8080"protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443"/>
- -->
- <!-- Define a SSL HTTP/1.1 Connector on port 8443
- This connector uses the JSSE configuration, when using APR, the
- connector should be using the OpenSSL style configuration
- described in the APR documentation -->
- <!--
- <Connectorport="8443"protocol="HTTP/1.1"SSLEnabled="true"
- maxThreads="150"scheme="https"secure="true"
- clientAuth="false"sslProtocol="TLS"/>
- -->
- <!-- Define an AJP 1.3 Connector on port 8009 -->
- <Connectorport="8009"protocol="AJP/1.3"redirectPort="8443"/>
- <!-- An Engine represents the entry point (within Catalina) that processes
- every request. The Engine implementation for Tomcat stand alone
- analyzes the HTTP headers included with the request, and passes them
- on to the appropriate Host (virtual host).
- Documentation at /docs/config/engine.html -->
- <!-- You should set jvmRoute to support load-balancing via AJP ie :
- <Enginename="Catalina"defaultHost="localhost"jvmRoute="jvm1">
- -->
- <Enginename="Catalina"defaultHost="localhost">
- <!--For clustering, please take a look at documentation at:
- /docs/cluster-howto.html (simple how to)
- /docs/config/cluster.html (reference documentation) --