tomcat配置文件web.xml與server.xml解析--重要

Web.xml裏主要的內容:

 

關於servlet的定義:

<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>

。。。。。。

關於servlet-mapping的定義:

<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>

    </servlet-mapping>

 

    <servlet-mapping>

        <servlet-name>jsp</servlet-name>

        <url-pattern>*.jspx</url-pattern>

    </servlet-mapping>

 

關於session-config的定義:

<session-config>

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

    </session-config>

 

關於mime-mapping的定義:

<mime-mapping>

        <extension>abs</extension>

        <mime-type>audio/x-mpeg</mime-type>

    </mime-mapping>

 

最後是關於welcom-file-list的定義:

       <welcome-file-list>

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

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

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

</welcome-file-list>

 

可能還有事件監聽器,過濾器

事件監聽器:

事件監聽器和servlet的過濾器類似,都是在web程序被部署到web服務器時生成並被初始化的。

幾類監聽器的作用:

ServletContext監聽器接口可以使web得知整個程序的載入和卸載等運行情況。

HttpSession監聽器接口可以使web程序瞭解程序會話期間的狀況並作出響應。

ServletRequest監聽器接口可以使web程序控制請求的生命週期。

 

在第一個請求被web容器接受之前實例化並註冊好監聽器類是必須的。監聽器在整個web應用生命週期中都要使用。

web容器對每個監聽類只會創建一個實例(單例模式),在第一個請求到來之前實例化並註冊。web容器註冊監聽類的順序根據他們實現的接口和在部署描述文件中定義的順序。web應用調用監聽實例的順序按照他們註冊的順序。

對appfuse來說,在web容器根據應用程序部署文件web.xml進行部署的時候,首先完成對listener和filter的實例化和初始化,然後由於

public class StartupListener extends ContextLoaderListener

    implements ServletContextListener {。。。。

StartupListener繼承自ServletContextListener,因此在容器對servletContext進行初始化的時候,會調用這個監聽。由於在appfuse應用程序的web.xml裏有關於spring的配置信息,因此這裏就把spring配置好了!!!

 

過濾器:

Filter生命週期

在web工程發佈後,在請求使引擎訪問一個web資源之前,引擎必須定位Filter列表;引擎必須確保爲列表中的每一個Filter建立了一個實例,並調用了他們的init(FilterConfig config)方法。在這過程中可以拋出異常。部署描述文件中定義的所有filter,僅會在引擎中產生一個實例。

當引擎接受一個請求時,引擎就會調用filter列表中第一個filter的doFilter方法,把ServletRequest,ServletResponse和FilterChain作爲參數傳給它。filter中doFilter方法典型的處理步驟是:

1)檢查請求頭信息

2)開發者創建一個實現了ServletRequest或HttpServletRequest的類,去包裝request對象,以便修改請求的頭信息或體數據。

3)開發者創建一個實現了ServletReqponse或HttpServletResponse的類,去包裝response對象,以便修改請求的頭信息或體數據。

4)filter可以調用鏈中的下一個實體,下一個實體是另一個filter,如果該filter是列表中最後的一個,則它的下一個實體就是一個目標web資源。如果要調用下一個filter的doFilter方法,把request,和response對象傳給FilterChain對象的doFilter方法中就可以了。

Filter chain 的doFilter方法是由引擎提供的,引擎在該方法中會定位filter列表中的下一個filter,調用它的doFilter方法,把傳來的request和response對象傳給它。

5)在調用chain.doFilter之後,filter可以檢測響應的頭信息

6)在這些過程中,filter可以拋出異常。當在調用doFilter過程中拋出UnavailableException異常時,引擎重複嘗試處理

下面的filter chain的方法,如過時後還沒請求到filter chain 就會關閉對filter chain的請求。當filter是列表中最後一個filter時,它的下一個實體是描述配置文件中filter後面的servlet或其它資源。

在引擎刪除一個Filter之前,引擎必須調用Filter的destroy方法,來釋放資源。

 

Web.xml:都是關於應用程序的。

 

<web-app >

各種<context-param>。。。。

各種<filter>,以及<filter-mapping>。。。。

各種<listener>。。。。

各種<servlet>,以及<servlet-mapping>。。。

<session-config>

<welcome-file-list>

    各種<error-page>。。。。

       <taglib>

       <resource-ref>

       <security-constraint>

       <login-config>

       <security-role>

 

Server.xml裏的主要內容:

首先是關於server的定義:

<Server port="8005" shutdown="SHUTDOWN" debug="0">

。。。

關於server的註釋:

A "Server" is a singleton element that represents the entire JVM,

     which may contain one or more "Service" instances.  The Server

     listens for a shutdown command on the indicated port.

 

關於listener的定義:

<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"

            debug="0"/>

  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"

            debug="0"/>

 

關於globalNamingResources的定義:

<GlobalNamingResources>

 

    <!-- Test entry for demonstration purposes -->

    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

 

    <!-- Editable user database that can also be used by

         UserDatabaseRealm to authenticate users -->

    <Resource name="UserDatabase" auth="Container"

              type="org.apache.catalina.UserDatabase"

       description="User database that can be updated and saved">

    </Resource>

    <ResourceParams name="UserDatabase">

      <parameter>

        <name>factory</name>

        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>

      </parameter>

      <parameter>

        <name>pathname</name>

        <value>conf/tomcat-users.xml</value>

      </parameter>

    </ResourceParams>

 

  </GlobalNamingResources>

 

關於service的定義:

<Service name="Catalina">

。。。

              注意connector和engine(container)都是service裏的元素。

 

關於connector的定義:

<Connector port="8000"       URIEncoding="gbk"

               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

               enableLookups="false" redirectPort="8443" acceptCount="100"

               debug="0" connectionTimeout="20000"

               disableUploadTimeout="true" />

關於connector的註釋:

A "Connector" represents an endpoint by which requests are received

         and responses are returned.  Each Connector passes requests on to the

         associated "Container" (normally an Engine) for processing.

 

關於engine的定義:

       <Engine name="Catalina" defaultHost="localhost" debug="0">

       。。。

 

關於engine的註釋:

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).

 

關於logger的定義:

<Logger className="org.apache.catalina.logger.FileLogger"

              prefix="catalina_log." suffix=".txt"

              timestamp="true"/>

 

關於realm的定義:

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"

                 debug="0" resourceName="UserDatabase"/>

 

關於host的定義:

<Host name="localhost" debug="0" appBase="webapps"

       unpackWARs="true" autoDeploy="true"

       xmlValidation="false" xmlNamespaceAware="false">

 

關於logger的定義:

<Logger className="org.apache.catalina.logger.FileLogger"

                 directory="logs"  prefix="localhost_log." suffix=".txt"

            timestamp="true"/>

關於logger的註釋:

Logger shared by all Contexts related to this virtual host.  By

          default (when using FileLogger), log files are created in the "logs"

           directory relative to $CATALINA_HOME.  If you wish, you can specify

           a different directory with the "directory" attribute.  Specify either a

           relative (to $CATALINA_HOME) or absolute path to the desired

           directory.

 

。。。後面還可能有關於context的定義。

 

server[z1] .xml:都是關於服務器一些特性的。

一個server有一個service,一個service裏有多個connector和一個engine,不同的connector除了端口可能不同,協議也可能不同。多個connector對應一個engine。engine代表我們應用程序的容器。一個engine中有一個到多個host,一個host代表我們的一個虛擬主機。host裏又有一個到多個context,一個context代表了一個應用程序的虛擬子站點。

 

應用程序裏也有web.xml和struts-config.xml,這兩個配置文件的內容不同於tomcat自帶的配置文件。

 

tomcat應用程序的初始化和運行過程:

在tomcat啓動時的工作(初始化):

由於應用程序是放在webapps目錄下面的,在Tomcat啓動時,其web容器會自動校驗和載入此目錄內的web程序,使其可以直接工作。如果程序有錯,web服務器會將錯誤信息輸出或存入在logs目錄,若錯誤嚴重,tomcat可能會停止工作。

 

從上面我們可以看到一個webapp應用程序中,包含的元素有:

Filter,listener,servlet。它們初始化的時機應該是不一樣的。

 

Servlet和jsp的生命週期:

從Tomcat處理用戶請求,我們可以清晰的看到容器Servlet的生命週期管理過程:

1、Tomcat在啓動的時候應該直接加載並實例化webapps下面應用程序的listener和filter,並在相應的時機進行調用。

2、客戶發出請求—>Web 服務器轉發到Web容器Tomcat;

3、Tomcat主線程對轉發來用戶的請求做出響應創建兩個對象:HttpServletRequest和HttpServletResponse;

4、從請求中的URL中找到正確Servlet,Tomcat爲其創建或者分配一個線程,同時把3創建的兩個對象傳遞給該線程;

5、Tomcat調用Servlet的servic()方法,根據請求參數的不同調用doGet()或者doPost()方法;

6、假設是HTTP GET請求,doGet()方法生成靜態頁面,並組合到響應對象裏;

7、Servlet線程結束,Tomcat將響應對象轉換爲HTTP響應發回給客戶,同時刪除請求和響應對象。

從該過程中,我們可以理解Servlet的生命週期:Servlet類加載(對應4步);Servlet實例化(對應3步);調用init方法(對應4步);調用service()方法(對應5、6步);;調用destroy()方法(對應7步)。

從中可以看到servlet和jsp是在請求到來的時候,web容器進行首次對servlet或jsp(轉換爲servlet)的初始化。而且初始化一次之後,在web容器中就只存在這樣一個實例,利用多線程來處理不同用戶的請求。

 

Struts-config.xml

<form-beans>

       各種<form-bean>

 

<global-exceptions>

<global-forwards>

              各種<forward>。。。。

<action-mappings>

各種<action>。。。。action裏還可能有forward元素,如果有,而且它與global-forwards裏的重名,則它會將global裏的覆蓋。

 

各種</plug-in>

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