初識Servlet
-
SUN公司制定了一系列Web應用與Web服務器進行協作的標準Java接口,統稱為Java Servlet API,還對Web服務器發布及運行Web應用的一些細節做了規約。SUN公司把這一系列標準Java接口和規約統稱為Servlet規范。Servlet就是Web服務器與Web應用進行協作的標準接口。
-
Servlet規范把能夠發布和運行JavaWeb應用的Web服務器稱為Servlet容器,它的最主要的特征就是動態執行JavaWeb應用中的Servlet實現類中的程序代碼。
-
Servlet是一種運行在服務器上的小插件,其最常見的用途是擴展Web服務器的功能,可作為非常安全的、可移植的、易于使用的CGI替代品。具有以下特點:
-
提供了可被服務器動態加載并執行的程序代碼,為來自客戶端的請求提供相應的服務;
-
Servlet完全用Java語言編寫,因此要求運行Servlet的服務器必須支持Java語言;
-
Servlet完全在服務器端運行,因此它的運行不依賴于瀏覽器。不管瀏覽器是否支持Java語言,都能請求訪問服務器端的Servlet。
Tomcat
Tomcat作為運行Servlet的容器,其基本功能是負責接收和解析來自客戶端的請求,同時把客戶端的請求傳送給相應的Servlet,并把Servlet的響應結果返回給客戶端。
Tomcat組件,分為4類:
-
頂層類元素:包括
<Server>
元素和<Service>
元素,它們位于整個配置文件的頂層; -
連接器類元素:為
<Connector>
元素,代表介于客戶端與服務器端之間的通信接口,負責將客戶端的請求發送給服務器端,并將服務器的響應結果返回給客戶端; -
容器類元素:代表處理客戶端請求并生成響應結果的組件,共有四類,分別為
<Engine>
、<Host>
、<Context>
和<Cluster>
元素。Engine
組件為特定的Service
組件處理所有客戶端請求,Host
組件為特定的虛擬主機處理所有的客戶端請求,Context
組件為特定的Web應用處理所有的客戶端請求。Cluster
組件負責為Tomcat
集群系統進行會話復制、Context
組件的屬性的復制,以及集群范圍內WAR
文件的發布。 -
嵌套類元素:代表可以被嵌入到容器中的組件,如
<Valve>
元素和<Realm>
元素等。
Tomcat元素:
-
<Server>
元素:代表整個Servlet
容器組件,是Tomcat
的頂級元素。在<Server>
元素中可包含一個或多個<Service>
元素; -
<Service>
元素:包含一個<Engine>
元素,以及一個或多個<Connector>
元素,這些<Connector>
元素共享同一個<Engine>
元素; -
<Connector>
元素:代表和客戶端實際交互的組件,負責接收客戶端請求,以及向客戶端返回響應結果; -
<Engine>
元素:每個<Service>
元素只能包含一個<Engine>
元素。<Engine>
元素處理在同一個<Service>
中所有<Connector>
元素接收到的客戶端請求; -
<Host>
元素:在一個<Engine>
元素中可以包含多個<Host>
元素。每個<Host>
元素定義了一個虛擬主機,它可以包含一個或多個Web
應用; -
<Context>
元素:每個<Context>
元素代表了運行在虛擬主機上的單個Web
應用。在一個<Host>
元素中可以包含多個<Context>
元素。
Tomcat的工作模式:
(1)獨立的Servlet
容器
Tomcat作為獨立的web服務器來單獨運行,Servlet容器組件作為web服務器中的一部分存在,這是Tomcat的默認工作模式。 在這種模式下,Tomcat是一個獨立進行的Java程序。和運行其他Java程序一樣,運行Tomcat需要啟動一個Java虛擬機進程,由該進程來運行Tomcat。
(2)其他web服務器進程內的Servlet容器
在這種模式下,Tomcat分為web服務器插件和Servlet容器插件兩部分。web服務器插件在其他web服務器進程的內部地址空間啟動一個JVM,Servlet在此JVM中運行。如有客戶端發出調用Servlet的請求,web服務器插件獲得對此請求的控制并將它轉發(JNI通信機制)給Servlet容器組件。
(3)其他web服務器進程外的Servlet容器
在這種模式下,Tomcat分為web服務器插件和Servlet容器組件兩部分。web服務器插件在其他web服務器的外部地址空間啟動一個JVM進程,Servlet容器組件再次JVM中運行。如有客戶端發出調用Servlet的請求,web服務器插件獲得對此請求的控制并將它轉發(IPC通信機制)給Servlet容器組件。
當Tomcat作為獨立的Servlet容器來運行時,可看做是能運行Java Servlet的獨立web服務器。此外,Tomcat還可作為其他web服務器進程內或進程外的Servlet容器,從而與其他web服務器集成,集成的意義在于:對于不支持運行Java Servlet的其web服務器,可通過集成Tomcat來提供運行Servlet的功能。
Tomcat的目錄結構
-
bin
:存放啟動和關閉Tomcat的腳本文件及所用到的類; -
conf
:存放Tomcat的各種配置文件,其中最重要的配置文件是server.xml
; -
logs
:存放Tomcat的日志文件; -
lib
:存放Tomcat服務器及所有Web應用都可以訪問的jar文件; -
webapps
:Web應用的默認部署目錄; -
work
:Tomcat的工作目錄,Tomcat在運行時把生成的一些工作文件放于此目錄下。在默認情況下,Tomcat把編譯JSP而生成的Servlet類文件放于此目錄下; -
tmp
:臨時文件目錄。
NOTE:
-
Tomcat的lib子目錄:存放的jar文件不僅能被Tomcat訪問,還能被所有在Tomcat中發布的JavaWeb應用訪問;
-
JavaWeb應用的lib子目錄:存放的jar文件只能被當前JavaWeb應用訪問。
NOTE:
Tomcat在加載Web應用時,會把相應的web.xml文件中的數據讀入到內存中。
Context元素
主要屬性:
-
path:指定訪問該Web應用的URL入口,什么都不寫表示根路徑;
-
docBase:指定Web應用的文件路徑,可以給定絕對路徑,也可以給定相對于
<Host>
的appBase屬性的相對路徑。如果Web應用采用開放目錄結構,則指定Web應用的根路徑;如果Web應用是個war文件,則是定war文件的路徑; -
className:指定實現Context組件的Java類的名字,這個類必須實現
org.apache.catalina.Context
接口; -
reloadable:如果這個屬性設為true,Tomcat服務器在運行狀態下會監視在
WEB-INF/classes
和WEB-INF/lib
目錄下的class文件的改動,以監視Web應用的WEB-INF/web.xml
文件的改動。如果檢測到有class
文件或web.xml
文件被更新,服務器會自動重新加載Web應用。
專有屬性:
-
cachingAllowed:如果為true,表示允許啟用靜態資源的緩存,默認值為true;
-
cacheMaxSize:設定靜態資源緩存的最大容量,默認為10m;
-
workDir:指定Web應用的工作目錄,Tomcat在運行時會把與這個web應用相關的臨時文件放在這個目錄下;
-
uppackWar:如果設為true,表示將把Web應用的WAR文件展開為開放目錄結構后再運行。如果設為false,則直接運行war文件。默認為true。
Host元素
主要屬性
-
name:指定虛擬主機的名字
-
className:指定實現虛擬主機的Java類的名字,這個Java類必須實現
org.apache.catalina.Host
接口; -
appBase:指定虛擬主機的目錄,可以指定絕對目錄,也可以指定相對于
<CATALINA_HOME>
的相對路徑; -
autoDeploy:如果設定為true,表示當Tomcat服務器處于運行狀態時,能夠檢測appBase下的文件,如果有新的Web應用加進來,則會自動發布這個Web應用;
-
deployOnStart:如果此項設置為true,則表示當Tomcat啟動時會自動發布appBase目錄下的所有Web應用。如果web應用沒有相應的context元素,那么Tomcat會提供一個默認的context組件。默認值為true。
專有屬性:
-
unpackWARS:如果設置為true,表示將把appBase屬性指定的目錄下的web應用的war文件先展開為開放的目錄結構后再運行,如果設置為false,則直接運行war文件;
-
workDir:指定虛擬主機的工作目錄,Tomcat在運行時會把與這個虛擬主機的所有web應用相關的臨時文件放在此目錄下,默認值為
<CATALINA_HOME>/work
。如果<Host>
元素下的一個<Context>
元素也設置了workDIR屬性,那么<Context>
的workDir屬性會覆蓋<Host>
元素的workDir屬性; -
deployXML:如果設置為false,那么Tomcat不會解析web應用中的用于設置context元素的
META-INF/context.xml
文件。默認值為true。
JavaWeb
SUN的Servlet規范對JavaWeb應用的定義:JavaWeb應用由一組Servlet/JSP、HTML文件、相關Java類,以及其他可以綁定的資源構成,它可以在由各種供應商提供的符合Servlet規范的Servlet容器中運行。
JavaWeb應用包含的內容:
-
Srvlet
組件:標準Servlet接口的實現類,運行在服務器端,包含了被Servlet容器動態調用的程序代碼。 -
JSP
組件:包含Java程序代碼的HTML文檔,運行在服務器端。當客戶端請求JSP文件時,Servlet容器先把它翻譯成Servlet類,然后動態調用它的程序代碼。 -
相關的Java類:開發人員自定義的與Web應用相關的Java類。
-
靜態文檔:存放在存放在服務器端的文件系統中,如HTML文件、圖片文件等。當客戶端請求訪問這些文件時,Servlet容器先從本地文件系統中讀取這些文件的數據,再把它發送到客戶端。
-
web.xml
文件:JavaWeb應用的配置文件,采用XML格式。該文件必須位于Web應用的WEB-INF
目錄下。
Servlet規范規定:JavaWeb應用必須采用固定的目錄結構,即每種類型的組件在web應用中都有固定的存放目錄。
JavaWeb應用的目錄結構,以helloapp為例
-
/helloapp
:此Web應用的根目錄,所有的JSP和HTML文件都存放于此目錄或用戶自定義的子目錄下(WEB-INF
子目錄除外); -
/helloapp/WEB-INF
:存放此Web應用的配置文件web.xml
; -
/helloapp/WEB-INF/classes
:存放各種.class
文件,Servlet類的.class
文件也存放于此目錄下; -
/helloapp/WEB-INF/lib
:存放此Web應用所需的各種jar文件; -
/helloapp/META-INF
:當前Webapp的私有資源目錄,通常存放自用的context.xml
; -
/helloapp/classes
:此Webapp的私有類; -
/helloapp/lib
:此Webapp的私有類,被打包為jar格式; -
/helloapp/index.jsp
:此Webapp的主頁。
NOTE:在WEB-INF目錄的classes及lib子目錄下都可以存放類文件。在運行時,Servlet容器的類加載器先加載classes目錄下的類,再加載lib目錄下的jar文件中的類。
Tomcat閥(Valve)
Tomcat閥能夠對Catalina容器接收到的http請求進行預處理。Tomcat閥可以可以加入到3種Catalina容器中,它們是Engine、Host和Context。
Tomcat閥主要包括以下幾種:
-
客戶訪問日志閥(Access Log Valve)
-
遠程地址過濾器(Remote Address Filter)
-
遠程主機過濾器(Remote Host Filter)
-
客戶請求記錄器(Request Dumper)
1.客戶訪問日志閥
能夠將客戶端的請求信息寫到日志文件中,這些日志文件可以記錄網頁的訪問次數、訪問時間、用戶的會話活動和用戶的安全驗證信息等??蛻粼L問日志閥可以加入到Engine、Host或Context容器。
屬性:
-
className:指定閥的實現類,此處為
org.apache.catalina.valves.AccessLogValve
; -
directory:設定存放日志文件的絕對或相對于
<CATALINA_HOME>
的目錄,默認為<CATALINA_HOME>/logs
; -
pattern:設定日志的格式和內容;
-
prefix:設定日志文件名前綴,默認為
access_log
; -
resolveHosts:如果設為true,表示把遠程IP地址解析為主機名;如果設為false,表示直接記錄遠程IP地址,默認為false;
-
suffix:設定日志文件的擴展名,默認為
""
;
pattern屬性的可選值:
%a:遠程IP地址; %A:本地IP地址; %b:發送的字節數,不包括HTTP頭部,符號“-”表示發送字節為零; %B:發送的字節數,不包括HTTP頭部; %h:遠程主機名; %H:客戶端請求所用的協議; %l:遠程邏輯用戶名(目前總是返回符號“-”); %m:客戶端的請方式; %p:接收到客戶端請求的本地服務器端口; %q:客戶端請求中的查詢字符串(Query String),即HTTP請求的第一行的URI部分的“?”后面的內容; %r:客戶端請求的第一行內容(包括請求方式、請求URI及HTTP協議版本); %s:服務器響應結果中的HTTP狀態代碼; %S:用戶的額Session ID; %t:時間和日期; %u:通過安全認證的遠程用戶名,符號“-”表示不存在遠程用戶名; %U:客戶端請求的URL路徑; %v:本地服務器名;
2.遠程地址過濾器
可以根據遠程客戶端的IP地址來決定是否接受客戶端的請求。在遠程地址過濾器中,事先保存了一份被拒絕的IP地址清單和允許訪問的IP地址清單。
屬性
-
className:指定閥實現類,此處為
org.apache.catalina.valves.AccessLogValve
; -
allow:指定允許訪問的客戶端IP地址,如果沒有設定,則表示只要客戶端IP地址不在deny清單中,就允許訪問,多個IP地址用逗號隔開;
-
deny:指定不允許訪問的IP地址;
3.遠程主機過濾器
與遠程地址多濾器基本上相同,只是一個是基于ip,一個是基于主機名。
4.客戶請求記錄器
用于把客戶端請求的詳細信息記錄到日志文件,是一個有效的跟蹤工具,尤其是當HTTP請求中的Header或Cookie有錯誤時,它可以跟蹤客戶請求的詳細信息。
原創文章,作者:Jeason,如若轉載,請注明出處:http://www.www58058.com/62239