Tomcat工做原理

Tomcat目錄html

tomcat
|---bin Tomcat:存放啓動和關閉tomcat腳本;前端

|---confTomcat:存放不一樣的配置文件(server.xml和web.xml);
|---doc:存放Tomcat文檔;
|---lib/japser/common:存放Tomcat運行須要的庫文件(JARS);
|---logs:存放Tomcat執行時的LOG文件;
|---src:存放Tomcat的源代碼;
|---webapps:Tomcat的主要Web發佈目錄(包括應用程序示例);
|---work:存放jsp編譯後產生的class文件;java

Tomcat類加載mysql

    Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
System($CLASSPATH/*.class和指定的jar) 
Common($CATALINA_HOME/common 下的classes,lib,endores三個子目錄) 
Catalina ($CATALINA_HOME/server/下的classes和lib目錄僅對Tomcat可見)
&Shared($CATALINA_HOME/shared/下的classes和lib目錄以及$CATALINA_HOME/lib目錄)僅對Web應用程序可見,對Tomcat不可見WebApp($WEBAPP/Web-INF/*僅對該WEB應用可見classes/*.classlib/*.jar)linux

加載類和資源的順序爲:
一、/Web-INF/classesnginx

二、/Web-INF/lib/*.jarweb

三、Bootstrapsql

四、System數據庫

五、$CATALINA_HOME/common/classes
六、$CATALINA_HOME/common/endores/*.jarapache

七、$CATALINA_HOME/common/lib/*.jar

八、$CATALINA_HOME/shared/classes
九、$CATALINA_HOME/shared/lib/*.jar  

Tomcat配置文件:

咱們打開con文件夾能夠看到Tomcat的配置文件:

 server.xml: Tomcat的主配置文件,包含Service, Connector, Engine, Realm, Valve, Hosts主組件的相關配置信息;

 web.xml:遵循Servlet規範標準的配置文件,用於配置servlet,併爲全部的Web應用程序提供包括MIME映射等默認配置信息;

 tomcat-user.xml:Realm認證時用到的相關角色、用戶和密碼等信息;Tomcat自帶的manager默認狀況下會用到此文件;在Tomcat中添加/刪除用戶,爲用戶  指定角色等將經過編輯此文件實現;

 catalina.policy:Java相關的安全策略配置文件,在系統資源級別上提供訪問控制的能力;

 catalina.properties:Tomcat內部package的定義及訪問相關控制,也包括對經過類裝載器裝載的內容的控制;Tomcat在啓動時會事先讀取此文件的相關設置;

 logging.properties: Tomcat6經過本身內部實現的JAVA日誌記錄器來記錄操做相關的日誌,此文件即爲日誌記錄器相關的配置信息,能夠用來定義日誌記錄的組  件級別以及日誌文件的存在位置等;

 context.xml:全部host的默認配置信息;

4、server.xml配置簡介:

下面講述這個文件中的基本配置信息,更具體的配置信息請參考tomcat的文檔:
    server:    一、port 指定一個端口,這個端口負責監聽關閉tomcat的請求 

              二、shutdown 指定向端口發送的命令字符串 
    service:          一、name 指定service的名字 
    Connector (表示客戶端和service之間的鏈接):
          一、port 指定服務器端要建立的端口號,並在這個端口監聽來自客戶端的請求 
          二、minProcessors 服務器啓動時建立的處理請求的線程數 
          三、maxProcessors 最大能夠建立的處理請求的線程數 
          四、enableLookups 若是爲true,則能夠經過調用request.getRemoteHost()進行DNS查

詢來獲得遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址 
          五、redirectPort 指定服務器正在處理http請求時收到了一個SSL傳輸請求後重定向的端口號 
          六、acceptCount 指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理

隊列中的請求數,超過這個數的請求將不予處理 
          七、connectionTimeout 指定超時的時間數(以毫秒爲單位) 
    Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求):
          一、defaultHost 指定缺省的處理請求的主機名,它至少與其中的一個host元素的name屬性值是同樣的 
    Context (表示一個web應用程序):
          一、docBase 應用程序的路徑或者是WAR文件存放的路徑 
          二、path 表示此web應用程序的url的前綴,這樣請求的url爲http://localhost:8080/path/**** 
          三、reloadable 這個屬性很是重要,若是爲true,則tomcat會自動檢測應用程序的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程序,咱們能夠在不重起tomcat的狀況下改變應用程序 
    host (表示一個虛擬主機):
          一、name 指定主機名 
          二、appBase 應用程序基本目錄,即存放應用程序的目錄 
          三、unpackWARs 若是爲true,則tomcat會自動將WAR文件解壓,不然不解壓,直接

從WAR文件中運行應用程序 
    Logger (表示日誌,調試和錯誤信息):
          一、className 指定logger使用的類名,此類必須實現org.apache.catalina.Logger 接口 
          二、prefix 指定log文件的前綴 
          三、suffix 指定log文件的後綴 
          四、timestamp 若是爲true,則log文件名中要加入時間,以下例:localhost_log.2001-10-04.txt
  Realm (表示存放用戶名,密碼及role的數據庫):
          一、className 指定Realm使用的類名,此類必須實現org.apache.catalina.Realm接口 
   Valve (功能與Logger差很少,其prefix和suffix屬性解釋和Logger 中的同樣):
          一、className 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類能夠記錄應用程序的訪問信息 
   directory(指定log文件存放的位置):
      一、pattern 有兩個值,common方式記錄遠程主機名或ip地址,用戶名,日期,第一行請求的字符串,HTTP響應代碼,發送的字節數。combined方式比common方式記錄的值更多

5、web.xml配置簡介:

  一、默認(歡迎)文件的設置

  在tomcat4\conf\web.xml中,<welcome-file-list>與IIS中的默認文件意思相同。

    <welcome-file-list>

       <welcome-file>index.html</welcome-file>

       <welcome-file>index.htm</welcome-file>

       <welcome-file>index.jsp</welcome-file>

     </welcome-file-list> 

  二、報錯文件的設置

    <error-page>

     <error-code>404</error-code>

       <location>/notFileFound.jsp</location>

       </error-page>

     <error-page>

       <exception-type>java.lang.NullPointerException</exception-type>

       <location>/null.jsp</location>

     </error-page>

若是某文件資源沒有找到,服務器要報404錯誤,按上述配置則會調用\webapps\ROOT\notFileFound.jsp。

若是執行的某個JSP文件產生NullPointException ,則會調用\webapps\ROOT\null.jsp

三、會話超時的設置

設置session 的過時時間,單位是分鐘;

<session-config>

<session-timeout>30</session-timeout>

</session-config>

  四、過濾器的設置

  <filter>

    <filter-name>FilterSource</filter-name>

    <filter-class>project4. FilterSource</filter-class>

  </filter>

  <filter-mapping>

    <filter-name>FilterSource</filter-name>

    <url-pattern>/WwwServlet</url-pattern>

    (<url-pattern>/haha/*</url-pattern>)

  </filter-mapping>

過濾:

  1) 身份驗證的過濾Authentication Filters

  2) 日誌和審覈的過濾Logging and AuditingFilters

  3) 圖片轉化的過濾Image conversionFilters

  4) 數據壓縮的過濾Data compressionFilters

  5) 加密過濾Encryption Filters

  6) Tokenizing Filters

  7) 資源訪問事件觸發的過濾Filters that triggerresource access events XSL/T 過濾XSL/T filters

  8) 內容類型的過濾Mime-type chain Filter 注意監聽器的順序,如:先安全過濾,而後資源,

而後內容類型等,這個順序能夠本身定。

6、管理
   一、用戶配置
      在進行具體Tomcat管理以前,先給tomcat添加一個用戶,使這個用戶有權限來進行管理。 
      打開conf目錄下的tomcat-users.xml文件,在相應的位置添加下面一行: 
    <user name="user"password="user" roles="standard,manager"/> 
    而後重起tomcat,在瀏覽器中輸入http://localhost:8080/manager/,會彈出對話框,輸入上面的用戶名和密碼便可。  

   二、應用程序列表
      在瀏覽器中輸入http://localhost:8080/manager/list,瀏覽器將會顯示以下的信息: 
      OK - Listed applications for virtualhost localhost 
        /ex:running:1 
        /examples:running:1 
        /webdav:running:0 
        /tomcat-docs:running:0 
        /manager:running:0 
        /:running:0 
     上面顯示的信息分別爲:應用程序的路徑、當前狀態、鏈接這個程序的session數  

 三、從新裝載應用程序
      在瀏覽器中輸入http://localhost:8080/manager/reload?path=/examples,瀏覽器顯示以下: 
    OK - Reloaded application at contextpath /examples    

這表示example應用程序裝載成功,若是咱們將server.xml的Context元素的reloadable屬性設爲true,

則不必利用這種方式從新裝載應用程序,由於tomcat會自動裝載。

四、顯示session信息
    在瀏覽器中輸入http://localhost:8080/manager/sessions?path=/examples,瀏覽器顯示以下: 
    OK - Session information for application at contextpath /examples Default maximum session inactive

interval 30 minutes

 五、啓動和關閉應用程序
   在瀏覽器中輸入http://localhost:8080/manager/start?path=/examples和

http://localhost:8080/manager/stop?path=/examples分別啓動和關閉examples應用程序。 

注意:a:通過我測試,我設置Context   的path="",reloadable=true,而後放一個WAR文件到webapps目錄,結果tomcat不能檢測出此文件(重起tomcat能夠),而把此文件解壓,則tomcat會自動檢測出這個新的應用程序。若是不能自動檢測WAR文件,咱們能夠利用下面管理中講的方法來部署應用程序。    

    b:默認的server.xml中,Realm元素只設置了一個className屬性,但此文件中也包含幾個經過JDBC鏈接到數據庫進行驗證的示例(被註釋掉了),經過Realm元素咱們能夠實現容器安全管理(Container   Managed   Security)。    
   c:還有一些元素咱們沒有介紹,如Parameter,loader,你能夠經過tomcat的文檔獲取這些元素的信息。 

  6:部署及撤銷部署    
  WAR有兩種組織方式,一種是按必定的目錄結構組織文件,一種是一個後綴爲WAR的壓縮包,所以它的部署方式也有兩種:    
    (1):在瀏覽器中輸入:http://localhost:8080/manager/install?path=/examples&war=file:/c:examples   
    就會將按目錄結構組織的WAR部署   
   
    (2):若是輸入:http://localhost:8080/manager/install?path=/examples&war=jar:file:/c:examples.war!/   
      就會將按壓縮包組織的WAR部署,注意此url後半部分必定要有!/號。    
      部署後就能夠用   http://localhost:8080/examples訪問了。   
      在瀏覽器中輸入:http://localhost:8080/manager/remove?path=/examples  就會撤銷剛纔部署的應用程序。   
  (四):與apache集成    
  雖然tomcat也能夠做web服務器,但其處理靜態html的速度比不上apache,且其做爲web服務器的功能遠不如apache,所以咱們想把apache和tomcat集成起來。   
  咱們以linux系統爲例介紹.   
  從apache網站下載apache1.3.22源代碼版本,而後使用以下命令配置安裝apache:  
    mkdir   /usr/local/apache    
    tar   zxvf   apache.1.32.tar.gz    
    cd   apache.1.32    
  .  /configure   --prefix=/usr/local/apache   --enable-module=so   
    make    
    make   install    

  注意configure命令指定目標安裝目錄,而且加入DSO(Dynamic   Shared   Object)支持,注意必定不要忘了這一個選項。    
   
  而後下載webapp模塊,將解壓後mod_webapp.so文件放入apache的libexec目錄,編輯apache的conf目錄下的httpd.conf,在這個文件的最後加入下面三行:      
  LoadModule   webapp_module   libexec/mod_webapp.so   
  WebAppConnection   warpConnection   warp   localhost:8008   
  WebAppDeploy   examples   warpConnection   /examples/    
  第一行是加入webapp模塊,若是編譯apache時不增長DSO支持,則沒法使用LoadModule指令,第二行指定tomcat與apache的鏈接,第三行指定部署那個應用,這兩個指令使用格式以下:   
  WebAppConnection   [connection   name]   [provider]  [host:port]    
  WebAppDeploy   [application   name]   [connection  name]   [url   path]       
  其中connection   name指定鏈接名,provider只能是warp,port端口與你的tomcat的配置文件server.xml最後幾行指定的要保持一致。文件以下:      
  port="8008"   minProcessors="5"  maxProcessors="75"    
  enableLookups="true"    
  acceptCount="10"   debug="0"/>    
  ******       
  application   name與你在tomcat中部署的應用名一致,url   path指定訪問這個應用的url。例如上面的例子能夠經過http://localhost/examples/來訪問tomcat中的examples應用。  

  (五):中文問題   
  通常jsp的亂碼問題能夠經過在jsp中加入來解決,至於servlet的亂碼在可使用servlet2.3中提供的HttpServeletRequest.setCharacterEncoding函數。更詳細的中文問題請見JSP/Servlet  中的漢字編碼問題。       
  四:綜述    
  tomcat做爲一個servlet(jsp也被編譯爲servlet執行)容器,其應用前景是很是好的,若是與jboss結合起來,則能夠實現sun的j2ee規範(用jboss做ejb服務器)。jboss的官方網站也提供集成了tomcat3.2*的jboss以供下載。另一個開源的應用服務器(enhydra)  也是基於tomcat的,其提供了更友好的管理界面,部署應用程序也更簡單,功能也更強大。 

Tomcat 原理解說:啓動過程分析

1 - Tomcat Server的組成部分

1.1 - Server 組件    A Server element represents the entire Catalina servletcontainer. (Singleton)

  如上面示例文件中定義的:

    <Server port=」8005」 shutdown=」SHUTDOWN」>

這會讓Tomcat6啓動一個server實例(即一個JVM),它監聽在8005端口以接收shutdown命令,使用 telnet 鏈接8005 端口能夠直接執行 SHUTDOWN 命令來關閉 Tomcat。各Server的定義不能使用同一個端口,這意味着若是在同一個物理機上啓動了多個Server實例,必須配置它們使用不一樣的端口。這個端口的定義用於爲管理員提供一個關閉此實例的便捷途徑,所以,管理員能夠直接telnet至此端口使用SHUTDOWN命令關閉此實例。不過,基於安全角度的考慮,這一般不容許遠程進行。

Server的相關屬性:

className: 用於實現此Server容器的徹底限定類的名稱,默認爲org.apache.catalina.core.StandardServer;

port: 接收shutdown指令的端口,默認僅容許經過本機訪問,默認爲8005;

shutdown:發往此Server用於實現關閉tomcat實例的命令字符串,默認爲SHUTDOWN;

1.2 - Service組件A Service element represents the combination of one ormore Connector components that share a single Engine

Service是這樣一個集合:它由一個或者多個Connector組成,以及一個Engine,負責處理全部Connector所得到的客戶請求  

Service主要用於關聯一個引擎和與此引擎相關的鏈接器,每一個鏈接器經過一個特定的端口和協議接收入站請求交將其轉發相當聯的引擎進行處理。所以,Service要包含一個引擎、一個或多個鏈接器。

 

如上面示例中的定義:

 

<Service name=」Catalina」>

 

這定義了一個名爲Catalina的Service,此名字也會在產生相關的日誌信息時記錄在日誌文件當中。

 

Service相關的屬性:

 

className: 用於實現service的類名,通常都是org.apache.catalina.core.StandardService。

 

name:此服務的名稱,默認爲Catalina;

 

1.3 - Connector

一個Connector將在某個指定端口上偵聽客戶請求,並將得到的請求交給Engine來處理,從Engine處得到迴應並返回客戶
TOMCAT有兩個典型的Connector,一個直接偵聽來自browser的http請求,一個偵聽來自其它WebServer的請求
Coyote Http/1.1 Connector 在端口8080處偵聽來自客戶browser的http請求
Coyote JK2 Connector 在端口8009處偵聽來自其它WebServer(Apache)的servlet/jsp代理請求

 

進入Tomcat的請求能夠根據Tomcat的工做模式分爲以下兩類:

 

Tomcat做爲應用程序服務器:請求來自於前端的web服務器,這多是Apache, IISNginx等;

 

Tomcat做爲獨立服務器:請求來自於web瀏覽器;

 

Tomcat應該考慮工做情形併爲相應情形下的請求分別定義好須要的鏈接器才能正確接收來自於客戶端的請求。一個引擎能夠有一個或多個鏈接器,以適應多種請求方式。

 

定義鏈接器可使用多種屬性,有些屬性也只適用於某特定的鏈接器類型。通常說來,常見於server.xml中的鏈接器類型一般有4種:

 

1) HTTP鏈接器 2) SSL鏈接器 3) AJP 1.3鏈接器 4) proxy鏈接器

 

如上面示例server.xml中定義的HTTP鏈接器:

 

<Connector port=」8080″ protocol=」HTTP/1.1″
maxThreads=」150″ connectionTimeout=」20000″
redirectPort=」8443″/>

 

定義鏈接器時能夠配置的屬性很是多,但一般定義HTTP鏈接器時必須定義的屬性只有「port「,定義AJP鏈接器時必須定義的屬性只有」protocol」,由於默認的協議爲HTTP。如下爲經常使用屬性的說明:

1
2
3
4
5
6
7
8
1) address:指定鏈接器監聽的地址,默認爲全部地址,即0.0.0.0; 能夠本身指定地,如
2) maxThreads:支持的最大併發鏈接數,默認爲200;
3) port:監聽的端口,默認爲0;
4) protocol:鏈接器使用的協議,默認爲HTTP/1.1,定義AJP協議時一般爲AJP/1.3;
5) redirectPort:若是某鏈接器支持的協議是HTTP,當接收客戶端發來的HTTPS請求時,則轉發至此屬性定義的端口;
6) connectionTimeout:等待客戶端發送請求的超時時間,單位爲毫秒,默認爲60000,即1分鐘;
7) enableLookups:是否經過request.getRemoteHost()進行DNS查詢以獲取客戶端的主機名;默認爲true; 進行反解的,能夠設置爲false
8) acceptCount:設置等待隊列的最大長度;一般在tomcat全部處理線程均處於繁忙狀態時,新發來的請求將被放置於等待隊列中;

 

 

 

 

 

 

 

下面是一個定義了多個屬性的SSL鏈接器:

 

<Connector port=」8443″
maxThreads=」150″ minSpareThreads=」25″ maxSpareThreads=」75″
enableLookups=」false」 acceptCount=」100″ debug=」0″ scheme=」https」 secure=」true」
clientAuth=」false」 sslProtocol=」TLS」 />

1.4 - Engine

The Engine element represents the entire requestprocessing machinery associated with a particular Service
It receives and processes all requests from one or more Connectors
and returns the completed response to the Connector for ultimate transmissionback to the client
Engine下能夠配置多個虛擬主機Virtual Host,每一個虛擬主機都有一個域名
當Engine得到一個請求時,它把該請求匹配到某個Host上,而後把該請求交給該Host來處理
Engine有一個默認虛擬主機,當請求沒法匹配到任何一個Host上的時候,將交給該默認Host來處理

Engine是Servlet處理器的一個實例,即servlet引擎,默認爲定義在server.xml中的Catalina。Engine須要defaultHost屬性來爲其定義一個接收全部發往非明肯定義虛擬主機的請求的host組件。如前面示例中定義的:

<Engine name=」Catalina」 defaultHost=」localhost」>

經常使用的屬性定義:

defaultHost:Tomcat支持基於FQDN的虛擬主機,這些虛擬主機能夠經過在Engine容器中定義多個不一樣的Host組件來實現;但若是此引擎的鏈接器收到一個發往非非明肯定義虛擬主機的請求時則須要將此請求發往一個默認的虛擬主機進行處理,所以,在Engine中定義的多個虛擬主機的主機名稱中至少要有一個跟defaultHost定義的主機名稱同名;

name:Engine組件的名稱,用於日誌和錯誤信息記錄時區別不一樣的引擎;

Engine容器中能夠包含Realm、Host、Listener和Valve子容器。

1.5 - Host

表明一個VirtualHost,虛擬主機,每一個虛擬主機和某個網絡域名Domain Name相匹配
每一個虛擬主機下均可以部署(deploy)一個或者多個WebApp,每一個Web App對應於一個Context,有一個Context path
當Host得到一個請求時,將把該請求匹配到某個Context上,而後把該請求交給該Context來處理
匹配的方法是「最長匹配」,因此一個path==""的Context將成爲該Host的默認Context
全部沒法和其它Context的路徑名匹配的請求都將最終和該默認Context匹配

 

 位於Engine容器中用於接收請求並進行相應處理的主機或虛擬主機,如前面示例中的定義:

<Host name=」localhost」 appBase=」webapps」
unpackWARs=」true」 autoDeploy=」true」
xmlValidation=」false」 xmlNamespaceAware=」false」>
</Host>

經常使用屬性說明:

1
2
3
1) appBase:此Host的webapps目錄,即存放非歸檔的web應用程序的目錄或歸檔後的WAR文件的目錄路徑;可使用基於$CATALINA_HOME的相對路徑;
2) autoDeploy:在Tomcat處於運行狀態時放置於appBase目錄中的應用程序文件是否自動進行deploy;默認爲true;
3) unpackWars:在啓用此webapps時是否對WAR格式的歸檔文件先進行展開;默認爲true;

虛擬主機定義示例:

<Engine name=」Catalina」 defaultHost=」localhost」>
<Host name=」localhost」 appBase=」webapps」>
<Context path=」」 docBase=」ROOT」/>
<Context path=」/bbs」 docBase=」/web/bss」  #path路徑是定義在defaultHost背後的
reloadable=」true」 crossContext=」true」/>
</Host>

<Host name=」mail.magedu.com」 appBase=」/web/mail」>
<Context path=」」 docBase=」ROOT」/>
</Host>
</Engine>

 

主機別名定義:

若是一個主機有兩個或兩個以上的主機名,額外的名稱都可以以別名的形式進行定義,以下:
<Host name=」www.ttlsa.com」 appBase=」webapps」 unpackWARs=」true」>
<Alias>feiyu.com</Alias>
</Host>

1.6 - Context

一個Context對應於一個Web Application,一個WebApplication由一個或者多個Servlet組成
Context在建立的時候將根據配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
當Context得到請求時,將在本身的映射表(mappingtable)中尋找相匹配的Servlet類
若是找到,則執行該類,得到請求的迴應,並返回

Context在某些意義上相似於apache中的路徑別名,一個Context定義用於標識tomcat實例中的一個Web應用程序;以下面的定義:

<!– Tomcat Root Context –>
<Context path=」」 docBase=」/web/webapps」/>

<!– buzzin webapp –>
<Context path=」/bbs」
docBase=」/web/threads/bbs」
reloadable=」true」>
</Context>

<!– chat server –>
<Context path=」/chat」 docBase=」/web/chat」/>

<!– darian web –>
<Context path=」/darian」 docBase=」darian」/>

在Tomcat6中,每個context定義也可使用一個單獨的XML文件進行,其文件的目錄爲$CATALINA_HOME/conf//。能夠用於Context中的XML元素有Loader,Manager,Realm,Resources和WatchedResource。

經常使用的屬性定義有:

1
2
3
1) docBase:相應的Web應用程序的存放位置;也可使用相對路徑,起始路徑爲此Context所屬Host中appBase定義的路徑;切記,docBase的路徑名不能與相應的Host中appBase中定義的路徑名有包含關係,好比,若是appBase爲deploy,而docBase毫不能爲deploy-bbs類的名字;
2) path:相對於Web服務器根路徑而言的URI;若是爲空「」,則表示爲此webapp的根路徑;若是context定義在一個單獨的xml文件中,此屬性不須要定義,有多是別名;
3) reloadable:是否容許從新加載此context相關的Web應用程序的類;默認爲false;

1.七、Realm組件:

一個Realm表示一個安全上下文,它是一個受權訪問某個給定Context的用戶列表和某用戶所容許切換的角色相關定義的列表。所以,Realm就像是一個用戶和組相關的數據庫。定義Realm時唯一必需要提供的屬性是classname,它是Realm的多個不一樣實現,用於表示此Realm認證的用戶及角色等認證信息的存放位置。

 
1
2
3
4
5
JAASRealm:基於Java Authintication and Authorization Service實現用戶認證;
JDBCRealm:經過JDBC訪問某關係型數據庫表實現用戶認證;
JNDIRealm:基於JNDI使用目錄服務實現認證信息的獲取;
MemoryRealm:查找tomcat-user.xml文件實現用戶信息的獲取;
UserDatabaseRealm:基於UserDatabase文件(一般是tomcat-user.xml)實現用戶認證,它實現是一個徹底可更新和持久有效的MemoryRealm,所以可以跟標準的MemoryRealm兼容;它經過JNDI實現;

下面是一個常見的使用UserDatabase的配置:

<Realm className=」org.apache.catalina.realm.UserDatabaseRealm」
resourceName=」UserDatabase」/>

下面是一個使用JDBC方式獲取用戶認證信息的配置:

<Realm className=」org.apache.catalina.realm.JDBCRealm」 debug=」99″
driverName=」org.gjt.mm.mysql.Driver」
connectionURL=」jdbc:mysql://localhost/authority」
connectionName=」test」 connectionPassword=」test」
userTable=」users」 userNameCol=」user_name」
userCredCol=」user_pass」
userRoleTable=」user_roles」 roleNameCol=」role_name」 />

1.八、Valve組件:

Valve相似於過濾器,它能夠工做於Engine和Host/Context之間、Host和Context之間以及Context和Web應用程序的某資源之間。一個容器內能夠創建多個Valve,並且Valve定義的次序也決定了它們生效的次序。Tomcat6中實現了多種不一樣的Valve:

 
1
2
3
4
5
6
7
8
9
10
11
AccessLogValve:訪問日誌Valve
ExtendedAccessValve:擴展功能的訪問日誌Valve
JDBCAccessLogValve:經過JDBC將訪問日誌信息發送到數據庫中;
RequestDumperValve:請求轉儲Valve;
RemoteAddrValve:基於遠程地址的訪問控制;
RemoteHostValve:基於遠程主機名稱的訪問控制;
SemaphoreValve:用於控制Tomcat主機上任何容器上的併發訪問數量;
JvmRouteBinderValve:在配置多個Tomcat爲以Apache經過mod_proxy或mod_jk做爲前端的集羣架構中,當指望中止某節點時,能夠經過此Valve將用記請求定向至備用節點;使用此Valve,必須使JvmRouteSessionIDBinderListener;
ReplicationValve:專用於Tomcat集羣架構中,能夠在某個請求的session信息發生更改時觸發session數據在各節點間進行復制;
SingleSignOn:將兩個或多個須要對用戶進行認證webapp在認證用戶時鏈接在一塊兒,即一次認證便可訪問全部鏈接在一塊兒的webapp;
ClusterSingleSingOn:對SingleSignOn的擴展,專用於Tomcat集羣當中,須要結合ClusterSingleSignOnListener進行工做;

RemoteHostValve和RemoteAddrValve能夠分別用來實現基於主機名稱和基於IP地址的訪問控制,控制自己能夠經過allow或deny來進行定義,這有點相似於Apache的訪問控制功能;以下面的Valve則實現了僅容許本機訪問/probe:

<Context path=」/probe」 docBase=」probe」>
<Valve className=」org.apache.catalina.valves.RemoteAddrValve」
allow=」127\.0\.0\.1″/>
</Context>

 

2 - Tomcat Server的結構圖

 

 

 

 

 

3 - 配置文件$CATALINA_HOME/conf/server.xml的說明

該文件描述瞭如何啓動TomcatServer 

<!------------------------------------------------>  
<web-app>    
<!-- 概述:        
該文件是全部的WEB APP共用的部署配置文件,        
每當一個WEB APP被DEPLOY,該文件都將先被處理,而後纔是WEB APP本身的/WEB-INF/web.xml-->    
<!--  +-------------------------+  -->   
<!--  |    servlet類定義部分    |  -->   
<!--  +-------------------------+  -->      
<!-- DefaultServlet 當用戶的HTTP請求沒法匹配任何一個servlet的時候,該servlet被執行        
URL PATTERN MAPPING : /        -->     
<servlet>
<servlet-name>default</servlet-name>         
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>    
<!-- InvokerServlet 處理一個WEB APP中的匿名servlet 
當一個servlet被編寫並編譯放入/WEB-INF/classes/中,卻沒有在/WEB-INF/web.xml中定義的時候
該servlet被調用,把匿名servlet映射成/servlet/ClassName的形式
URL PATTERN MAPPING : /servlet/*        -->     
<servlet>         
<servlet-name>invoker</servlet-name>         
<servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>
<init-param>
<param-name>debug</param-name>             
<param-value>0</param-value>         
</init-param>        
<load-on-startup>2</load-on-startup>     
</servlet>    
<!-- JspServlet  當請求的是一個JSP頁面的時候(*.jsp)該servlet被調用        
它是一個JSP編譯器,將請求的JSP頁面編譯成爲servlet再執行        
URL PATTERN MAPPING : *.jsp        -->     
<servlet>         
<servlet-name>jsp</servlet-name>         
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>         
<init-param>             
<param-name>logVerbosityLevel</param-name>             
<param-value>WARNING</param-value>         
</init-param>         
<load-on-startup>3</load-on-startup>     
</servlet>     
<!--  +---------------------------+  -->   
<!--  |    servlet映射定義部分    |  -->   
<!--  +---------------------------+  -->          
<servlet-mapping>         
<servlet-name>default</servlet-name>         
<url-pattern>/</url-pattern>     
</servlet-mapping>      
<servlet-mapping>         
<servlet-name>invoker</servlet-name>         
<url-pattern>/servlet/*</url-pattern>     
</servlet-mapping>      
<servlet-mapping>         
<servlet-name>jsp</servlet-name>         
<url-pattern>*.jsp</url-pattern>     
</servlet-mapping>    
<!--  +------------------------+  -->   
<!--  |    其它部分,略去先    |  -->   
<!--  +------------------------+  -->     
... ... ... ...  
</web-app>  
<!-----------------------------------> 

 

<!------------------------------------------------------------------------->  
<!-- 啓動Server 在端口8005處等待關閉命令  若是接受到"SHUTDOWN"字符串則關閉服務器      --> 
<Server port="8005" shutdown="SHUTDOWN" debug="0">    
<!-- Listener ???        目前沒有看到這裏        -->   
<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0"/>   
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0"/>    
<!-- Global JNDI resources ???        目前沒有看到這裏,先略去        -->   
<GlobalNamingResources>     ... ... ... ...   </GlobalNamingResources>    
<!-- Tomcat的Standalone Service Service是一組Connector的集合 
它們共用一個Engine來處理全部Connector收到的請求-->   
<Service name="Tomcat-Standalone">      
<!-- Coyote HTTP/1.1 Connector  className: 該Connector的實現類是
org.apache.coyote.tomcat4.CoyoteConnector 
port : 在端口號8080處偵聽來自客戶browser的HTTP1.1請求          
minProcessors : 該Connector先建立5個線程等待客戶請求,每一個請求由一個線程負責          
maxProcessors : 當現有的線程不夠服務客戶請求時,若線程總數不足75個,則建立新線程來處理請求          
acceptCount : 當現有線程已經達到最大數75時,爲客戶請求排隊 當隊列中請求數超過100時,後來的請求返回Connection refused錯誤          
redirectport : 當客戶請求是https時,把該請求轉發到端口8443去 其它屬性略          -->     
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" 
port="8080"                 
minProcessors="5" maxProcessors="75" acceptCount="100"                 
enableLookups="true"                 redirectPort="8443"                 
debug="0"                 connectionTimeout="20000"                 
useURIValidationHack="false"                 disableUploadTimeout="true" />      
<!-- Engine用來處理Connector收到的Http請求 
它將匹配請求和本身的虛擬主機,並把請求轉交給對應的Host來處理          
默認虛擬主機是localhost          -->     
<Engine name="Standalone" defaultHost="localhost" debug="0">            
<!-- 日誌類,目前沒有看到,略去先 -->       
<Logger className="org.apache.catalina.logger.FileLogger" .../>       
<!-- Realm,目前沒有看到,略去先 -->       
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" .../>        
<!-- 虛擬主機localhost  appBase : 該虛擬主機的根目錄是webapps/  
它將匹配請求和本身的Context的路徑,並把請求轉交給對應的Context來處理            -->       
<Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 日誌類,目前沒有看到,略去先 -->         
<Logger className="org.apache.catalina.logger.FileLogger" .../>                
<!-- Context,對應於一個Web App   
path : 該Context的路徑名是"",故該Context是該Host的默認Context              
docBase : 該Context的根目錄是webapps/mycontext/              -->
<Context path="" docBase="mycontext" debug="0"/>
<!-- 另一個Context,路徑名是/wsota -->
<Context path="/wsota" docBase="wsotaProject" debug="0"/>
</Host></Engine></Service></Server> 

 
  

4 - Context的部署配置文件web.xml的說明

一個Context對應於一個Web App,每一個Web App是由一個或者多個servlet組成的
當一個Web App被初始化的時候,它將用本身的ClassLoader對象載入「部署配置文件web.xml」中定義的每一個servlet類
它首先載入在$CATALINA_HOME/conf/web.xml中部署的servlet類
而後載入在本身的Web App根目錄下的WEB-INF/web.xml中部署的servlet類
web.xml文件有兩部分:servlet類定義和servlet映射定義
每一個被載入的servlet類都有一個名字,且被填入該Context的映射表(mapping table)中,和某種URL PATTERN對應
當該Context得到請求時,將查詢mapping table,找到被請求的servlet,並執行以得到請求迴應

分析一下全部的Context共享的web.xml文件,在其中定義的servlet被全部的Web App載入

5 - Tomcat Server處理一個http請求的過程

假設來自客戶的請求爲:
http://localhost:8080/wsota/wsota_index.jsp

1) 請求被髮送到本機端口8080,被在那裏偵聽的Coyote HTTP/1.1 Connector得到
2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應
3) Engine得到請求localhost/wsota/wsota_index.jsp,匹配它所擁有的全部虛擬主機Host
4) Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機)
5) localhost Host得到請求/wsota/wsota_index.jsp,匹配它所擁有的全部Context
6) Host匹配到路徑爲/wsota的Context(若是匹配不到就把該請求交給路徑名爲""的Context去處理)
7) path="/wsota"的Context得到請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
8) Context匹配到URL PATTERN爲*.jsp的servlet,對應於JspServlet類
9) 構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet或doPost方法
10)Context把執行完了以後的HttpServletResponse對象返回給Host
11)Host把HttpServletResponse對象返回給Engine
12)Engine把HttpServletResponse對象返回給Connector
13)Connector把HttpServletResponse對象返回給客戶browse

 
  

tomcat啓動腳本分析一

 

Tomcat是應用頗廣的Servlet和JSP的容器,能夠說幾乎每一個學習JSP的人都接觸過它。在實際開發環境中,它還能夠做爲輕巧靈便的應用服務器用來調試和部署。在Tomcat上開發的Servlet和JSP程序,能夠很是方便地部署到Weblogic及Websphere等生產服務器上去。有些狀況下,它還能夠和ApacheWeb Server配合使用,做爲小型企業的Web Application Server。本文以Tomcat5.0.28爲例,討論一下Tomcat的啓動過程及常見問題。你們都知道,Tomcat最廣泛的啓動方法就是在DOS命令行窗口中執行Tomcat的bin目錄下的startup.bat文件(雙擊該文件便可啓動)。 


1. startup.bat腳本解析下面咱們首先來看看startup.bat腳本是如何啓動Tomcat的。Startup腳本很是明瞭,它的主要任務就是

  先設置CATALINA_HOME的環境變量,讓該環境變量指向Tomcat的安裝目錄;

  而後在安裝目錄的bin子目錄下找catalina.bat文件,若是找不到,就打印出錯誤信息並退出,若是在bin目錄下找到catalina.bat文件,就準備執行該文件。不過,在執行該文件以前,startup腳本還作了一件工做,那就是尋找數。  startup腳本能夠帶多個參數,在Java主類中,第一個參數爲args[0],而在MS-DOS腳本中,第一個參數能夠經過」%1」獲得,若是您想要獲得DOS腳本中獲得第二個參數,調用」%2」。可是,在腳本參數數目未知的狀況下,咱們就只能經過goto循環調用shift命令來得到腳本的全部參數,

下面這個簡單的實驗腳本有助於咱們理解如何使用shift命令。


 

@echo off 
  echo Print parameters by %%1 andshift loop 
    :loopStart 
   if""%1""=="""" goto loopEnd 
  echo Paramter is %1 
  shift 
  goto loopStart 
  :loopEnd 
若是把上面的腳本保存成test.bat並在DOS中執行該腳本,執行結果以下。 
下面就是Startup.bat腳本的詳細註釋,

若是想要在DOS腳本中註釋一行,前面加上rem便可,這至關於Java的雙斜槓(//)註釋,

下面程序中,凡是以REM開頭而後接着中文的行,都是筆者加上的註釋,以幫助讀者理解該腳本。

 


 

@echo off 
if "%OS%" == "Windows_NT" setlocal 
rem ---------------------------------------------------------------------------
rem Start script for the CATALINA Server 
rem 
rem $Id: startup.bat,v 1.6 2004/05/27 18:25:11 yoavs Exp $ 
rem ---------------------------------------------------------------------------

rem首先定義一個變量CURRENT_DIR,而後把當前目錄做爲一個字符串賦給它 

rem Guess CATALINA_HOME if not defined 

setlocal
set JAVA_OPTS= -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxNewSize=256M -XX:MaxPermSize=256M

set CURRENT_DIR=%cd%

rem 若是CATALINA_HOME變量已經賦值,程序轉到gotHome行繼續 
if not "%CATALINA_HOME%" == "" goto gotHome

rem 把當前目錄的值做爲字符串賦給CATALINA_HOME變量 
set CATALINA_HOME=%CURRENT_DIR%

rem 若是當前目錄的bin子目錄下發現catalina.bat文件,程序轉到okHome行繼續 
rem 不然執行下一行「cd..」。 
Rem 由於缺省狀況下當前目錄就是bin目錄,因此缺省狀況下程序不轉入okHome行 
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome

rem 回上層目錄 
cd ..

rem 把當前目錄的上層目錄做爲字符串賦給再次CATALINA_HOME變量,覆蓋第一次的賦值 
set CATALINA_HOME=%cd%

rem 從新回到當前目錄 
cd %CURRENT_DIR% :gotHome

rem 若是在當前目錄的父目錄的bin子文件夾下發現catalina.bat文件,程序轉到okHome行繼續 
rem 不然程序打印兩行錯誤信息,而後退出 

:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome 
echo The CATALINA_HOME environment variable is not defined correctly 
echo This environment variable is needed to run this program 
goto end 
:okHome

rem 設置一個變量,存儲catalina.bat的完整路徑 
set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat

rem 再次檢查catalina.bat是否存在,若是不存在,打印兩行錯誤信息,退出 
rem Check that target executable exists 
if exist "%EXECUTABLE%" goto okExec 
echo Cannot find %EXECUTABLE% 
echo This file is needed to run this program 
goto end 
:okExec

rem 檢查腳本是否帶參數,若是發現參數,把第一個參數賦值給 CMD_LINE_ARGS變量 
rem 若是腳本帶有多個參數,程序設置了一個循環setArgs, 
rem 不斷把所帶的參數加到CMD_LINE_ARGS變量中 
rem Get remaining unshifted command line arguments and save them in the 
set CMD_LINE_ARGS= 
:setArgs 
  if ""%1""=="""" goto doneSetArgs 
  set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 
  shift 
  goto setArgs 
:doneSetArgs

rem 執行catalina.bat腳本,該腳本的第一個參數爲start,後面的參數是從本腳本中傳入的 
  call "%EXECUTABLE%" start %CMD_LINE_ARGS%

:end


 

那麼讀者也許要問,問什麼要經過startup腳原本調用catalina腳本,直接一個腳本不更方便嗎?細心的讀者或許會發現,在缺省狀況下,startup腳本只能放在兩個位置,一是Tomcat的安裝目錄,一個就是Tomcat安裝目錄的bin子目錄。這是什麼意思呢?若是Tomcat安裝目錄是C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28,那麼startup腳本只能放在C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28\目錄或者C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28\bin目錄下才能運行,若是拷貝startup文件到其它目錄,咱們就會看到下面的錯誤(以Tomcat運行在C:\carl目錄下爲例): C:\carl>startup 
CATALINA_HOME C:\ 
The CATALINA_HOME environment variable is not defined correctly 
This environment variable is needed to run this program 
那麼,若是咱們想讓Tomcat在桌面上能成功啓動,那麼該怎麼辦呢?固然,咱們首先想到的是爲startup建立一個快捷方式,而後拷貝該快捷方式到桌面,這是一種辦法。另外一種辦法就是修改startup.bat文件,在startup.bat腳本的第八行處添上一句腳本,讓 CATALINA_HOME變量指向用戶Tomcat的安裝路徑,這樣,startup.bat就能夠拷貝到機器的任何目錄執行。這個startup.bat腳本就是提供給使用者用來修改的,咱們能夠在其中設置JAVA_HOME,CATALINA_HOME等環境變量,但咱們並不須要深刻到較爲複雜的catalina.bat腳本中,這正是startup.bat腳本的真正用意所在。

咱們知道,軟件設計模式中有一個重要的原則就是開閉原則,即咱們能夠容許別人擴展咱們的程序,但在程序發佈後,咱們拒絕任何修改,由於修改會產生新的Bug,使得咱們已經Bug-free的程序又要從新測試。

開閉原則是面向對象世界中的一個很是重要的原則,咱們能夠把這個原則從Java類擴展至源代碼級別。startup腳本就是要求用戶不要修改catalina.bat腳本,這是符合軟件設計思想的。咱們若是想要完全貫徹這個重要的軟件設計原則,能夠寫一個新腳本tomcat.bat,腳本內容大體以下: set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_09 
set CATALINA_HOME=C:\carl\it\tomcat_research\jakarta-tomcat-5.0.28 
call %CATALINA_HOME%\bin\startup.bat 這個tomcat.bat文件能夠存放在任何目錄並能執行,而且不須要修改tomcat自帶的任何腳本及其它環境變量,這就完全貫徹了開閉原則。

 

  有關Tomcat應用程序目錄、端口、默認目錄、應用程序默認打開文件、使用數據庫鏈接池等方面的配置出處

修改Tomcat應用程序目錄
 <Host name="localhost" debug="0"appBase="webapps" unpackWARs="true" 
  autoDeploy="true" xmlValidation="false"xmlNamespaceAware="false">
  修改爲
 <Host name="localhost" debug="0"appBase="mytest" unpackWARs="true" 
  autoDeploy="true" xmlValidation="false"xmlNamespaceAware="false">
  mytest目錄是和webapps在同一父目錄下。
  同時還要將原來webapps目錄中的一些文件拷貝過來(若是不肯定,請將安裝後的
webapps下的因此文件夾拷貝過來)
  win2000 tomcat 5.0.27測試  

 在Tomcat的conf目錄下面的server.xml裏面,修改  
 <Host   name="localhost"   debug="0"  appBase="E:\Project\www_project_com"   
   unpackWARs="true"  autoDeploy="true"   
   xmlValidation="false"  xmlNamespaceAware="false">       
  E:\Project\www_project_com這個硬盤目錄下面還要創建一個ROOT(必須大寫)目錄,
  裏面放文件,還要有一個web-inf文件夾,這個你能夠參考tomcat的webapps目錄裏面的
  東西拷貝過去就能夠


修改Tomcat端口
  查找 <Connector port="8080" minProcessors="5"  maxProcessors="75"   
       enableLookups="true"  redirectPort="8443"   
       acceptCount="100"  debug="0"   connectionTimeout="20000"  
        useURIValidationHack="false"  disableUploadTimeout="true"   />
  將port="8080"改爲port="80"。  

修改Tomcat默認目錄
  在conf文件夾中,打開server.xml,找到</host>,在它前面加上下面的代碼:  
  <Context   path=""  docBase="f:\jsp"   debug="0"  reloadable="true"   
          crossContext="true">   
  </Context>

修改應用程序默認打開文件
  在你的應用程序目錄下修改WEB-INF\web.xml文件(注意:不是tomcat\conf\web.xml)
  在<web-app...></web-app>中添加節點以下:
  <welcome-file-list>   
                 <welcome-file>index.jsp</welcome-file>   
                 <welcome-file>index.htm</welcome-file>   
                 <welcome-file>index.html</welcome-file>   
                 <welcome-file>default.htm</welcome-file>   
                 <welcome-file>default.html</welcome-file>   
  </welcome-file-list>  
  這時,若是你在url中鍵入http://localhost:8080/myweb (myweb是你的應用程序目錄),
  系統會自動尋找welcome-file-list中列出的文件

通過這樣的配置,就能夠在url中輸入http:\\localhost(或http:\\IP)來訪問本身的網頁了,

在Tomcat中使用數據庫鏈接池(sqlserver2000)
    在conf文件夾中,打開server.xml,找到</host>,在它前面加上下面的代碼:
    這樣就生成了一個虛擬目錄webshop,而且建立了鏈接池(注意修改相應的鏈接參數)
    注意:請首先將sqlser2000的jdbc的三個文件(msbase.jarms,sqlserver.jar,msutil.jar)複製到tomcat\common\lib目錄下
      <Context path="webshop"docBase="e:/webshop" debug="0" reloadable="true"crossContext="true">   
          <Resourcename="jdbc/mssql" auth="Container"type="javax.sql.DataSource"/>   
            <ResourceParams name="jdbc/mssql"> 
         <parameter>  
             <name>factory</name>  
                <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>  
              </parameter>    
    <parameter>  
                   <name>driverClassName</name>  
               <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>  
        </parameter>     
       <parameter> 
            <name>url</name>  
             <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=wjw_test</value>    
    </parameter>  
         <parameter>       <name>username</name>              <value>sa</value>    </parameter>
      <parameter>        <name>password</name>               <value>8021</value>      </parameter>    
    <parameter>          <name>maxActive</name>              <value>20</value>    </parameter>
     <parameter>           <name>maxIdle</name>     <value>10</value>     </parameter> 
    <parameter>          <name>maxWait</name>      <value>-1</value>           </parameter>  
           </ResourceParams> 
         </Context> 

在jsp中使用鏈接池concool.jsp

 <!--測試數據源--> 
 <%@ page contentType="text/html; charset=gb2312" %>
 <%@ page import="javax.naming.Context" %> 
 <%@ page import="javax.sql.DataSource"%> 
 <%@ page import="javax.naming.InitialContext"%> 
 <%@ page import="java.sql.*"%>

 <% 
   DataSource ds = null; 
   try{    Context initCtx = new InitialContext(); 
     Context envCtx = (Context) initCtx.lookup("java:comp/env");
    //從Context中lookup數據源。
     ds =(DataSource)envCtx.lookup("jdbc/mssql"); 
 if(ds!=null) 
 { out.println("已經得到DataSource!"); 
 out.println("<br>");
 Connection conn = ds.getConnection();
 Statement stmt=conn.createStatement();
 ResultSet rst=stmt.executeQuery("select * from book");
 out.println("如下是從數據庫中讀取出來的數據");
 while(rst.next())
 { out.println("bookName:"+rst.getString("bookName"));
 out.println("<br>");  } }
 else 
  out.println("鏈接失敗!");  }
 catch(Exception ne)
 {  out.println(ne); }  %>

 

 


 

Tomcat請求過程:

 

Tomcat Server處理一個HTTP請求的過程:

 

 

描述:

 

一、用戶點擊網頁內容,請求被髮送到本機端口8080,被在那裏監聽的Coyote HTTP/1.1 Connector得到。 二、Connector把該請求交給它所在的Service的Engine來處理,並等待Engine的迴應。 三、Engine得到請求localhost/test/index.jsp,匹配全部的虛擬主機Host。 四、Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機),名爲localhost的Host得到請求/test/index.jsp,匹配它所擁有的全部的Context。Host匹配到路徑爲/test的Context(若是匹配不到就把該請求交給路徑名爲「 」的Context去處理)。 五、path=「/test」的Context得到請求/index.jsp,在它的mapping table中尋找出對應的Servlet。Context匹配到URL PATTERN爲*.jsp的Servlet,對應於JspServlet類。 六、構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet()或doPost().執行業務邏輯、數據存儲等程序。 七、Context把執行完以後的HttpServletResponse對象返回給Host。 八、Host把HttpServletResponse對象返回給Engine。 九、Engine把HttpServletResponse對象返回Connector。 十、Connector把HttpServletResponse對象返回給客戶Browser。

 

Tomcat配置虛擬主機:

 

Tomcat能夠經過修改本地虛擬主機和修改本地DNS的方式下,實現訪問主流網站:www.baidu.com而跳轉到本身配置的界面。

 

相關文章
相關標籤/搜索