首頁 > 軟體

Tomcat架構設計及Servlet作用規範講解

2022-08-18 22:02:20

1.Servlet規範

1.1 Servlet作用講解

Servlet是JavaEE規範中的一種,主要是為了擴充套件Java作為Web服務的功能,統一定義了對應的介面,比如Servlet介面,HttpRequest介面,HttpResponse介面,Filter介面。

然後由具體的服務廠商來實現這些介面功能,比如Tomcat,jetty等。

在規範裡面並不會有具體的實現。

可以自行看下原始碼,而在Servlet規範中規定了一個http請求到來的執行處理流程:

對應的伺服器容器會接收到對應的Http請求,然後解析該請求,然後建立對應的Servlet範例,呼叫對應init方法來完成初始化,把請求的相關資訊封裝為HttpServletRequest物件來呼叫Servlet的service方法來處理請求,然後通過HttpServletResponse封裝響應的資訊交給容器,響應給使用者端。

1.2 Servlet核心API

我們再來回顧下Servlet中的核心API,這塊對我們更好的掌握Tomcat的內容還是非常有幫助的。

API描述
ServletConfig獲取servlet初始化引數和servletContext物件。
ServletContext在整個Web應用的動態資源之間共用資料。
ServletRequest封裝Http請求資訊,在請求時建立。
ServletResponse封裝Http響應資訊,在請求時建立。

ServletConfig

容器在初始化servlet時,為該servlet建立一個servletConfig物件,並將這個物件通過init()方法來傳遞並儲存在此Servlet物件中。核心作用:

  • 獲取初始化資訊;
  • 獲取ServletContext物件。

ServletContext

一個專案只有一個ServletContext物件,可以在多個Servlet中來獲取這個物件,使用它可以給多個Servlet傳遞資料,該物件在Tomcat啟動時就建立,在Tomcat關閉時才會銷燬!作用是在整個Web應用的動態資源之間共用資料。

在實際的Servlet開發中,我們會實現HttpServlet介面,在該介面中會實現GenericServlet,而在GenericServlet會實現ServiceConfig介面,從而可以獲取ServletContext容器物件

所以在Servlet中我們可以很容易的獲取到ServletContext物件,從而完成對應的操作。

public class ServletTwoImpl extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 1、引數傳遞
        ServletContext servletContext = this.getServletContext() ;
        String value = String.valueOf(servletContext.getAttribute("name")) ;
        System.out.println("value="+value);
        // 2、獲取初始化引數
        String userName= servletContext.getInitParameter("user-name") ;
        System.out.println("userName="+userName);
        // 3、獲取應用資訊
        String servletContextName = servletContext.getServletContextName() ;
        System.out.println("servletContextName="+servletContextName);
        // 4、獲取路徑
        String pathOne = servletContext.getRealPath("/") ;
        String pathTwo = servletContext.getRealPath("/WEB-INF/") ;
        System.out.println("pathOne="+pathOne+";pathTwo="+pathTwo);
        response.getWriter().print("執行:doGet; value:"+value);
    }
}

1.3 ServletRequest

HttpServletRequest介面繼承ServletRequest介面,用於封裝請求資訊,該物件在使用者每次請求servlet時建立並傳入servlet的service()方法,在該方法中,傳入的servletRequest將會被強制轉化為HttpservletRequest 物件來進行HTTP請求資訊的處理。核心作用:

  • 獲取請求報文資訊;
  • 獲取網路連線資訊;
  • 獲取請求域屬性資訊。

1.4 ServletResponse

HttpServletResponse繼承自ServletResponse,封裝了Http響應資訊。使用者端每個請求,伺服器都會建立一個response物件,並傳入給Servlet.service()方法。核心作用:

  • 設定響應頭資訊;
  • 傳送狀態碼;
  • 設定響應正文;
  • 重定向;

2.Tomcat的設計

通過上面Servlet規範的介紹,其實我們發下我們要實現Servlet規範的話,很重要的就得提供一個服務容器來獲取請求,解析封裝資料,並呼叫Servlet範例相關的方法。也就是如下圖中的部分

這塊的內容其實就是Tomcat,具體的我們來看看。

2.1 什麼是Tomcat

Tomcat是一個容器,用於承載Servlet,那麼我們說Tomcat就是一個實現了部分J2EE規範的伺服器。J2 EE和Jakarta EE(Eclipse基金會)這兩是啥?用於Tomcat10以後都是Jakarta EE,而9之前就是J2EE.

2.2 Tomcat的架構結構

我們通過上面的分析,知道Tomcat是一個Servlet規範的實現,要接收請求和響應請求,那麼具體是如何實現的呢?這塊我們可以通過conf下的server.xml得出對應的結論。

server.xml是Tomcat中最重要的組態檔,server.xml 的每一個元素都對應了Tomcat 中的一個元件 ;通過對xml檔案中元素的設定,可以實現對Tomcat中各個元件的控制。因此,學習server.xml檔案的設定,對於瞭解和使用Tomcat至關重要.

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
  <Service name="Catalina">
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <!-- This Realm uses the UserDatabase configured in the global JNDI
             resources under the key "UserDatabase".  Any edits
             that are performed against this UserDatabase are immediately
             available for use by the Realm.  -->
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
</Server>

極簡模式

<Server>
    <Service>
        <Connector />
        <Connector />
        <Engine>
            <Host>
                <Context /><!-- 現在常常使用自動部署,不推薦設定Context元素,Context小節有詳細說明 -->
            </Host>
        </Engine>
    </Service>
</Server>

梳理出的結構

對應的每個元件的作用。

2.3 元件分類

官網其實對上面的元件也做了分類:

頂級元素:

  • Server:是整個組態檔的根元素
  • Service:代表一個Engine元素以及一組與之相連的Connector元素

聯結器

  • 代表了外部使用者端傳送請求到特定Service的介面;同時也是外部使用者端從特定Service接收響應的介面。

容器

容器的作用是處理Connector接收進來的請求,併產生對應的響應,Engine,Host和Context都是容器,他們不是平行關係,而是父子關係。

每個元件的作用:

  • Engine:可以處理所有請求
  • Host:可以處理髮向一個特定虛擬主機的所有請求
  • Context:可以處理一個特定Web應用的所有請求

核心元件的串聯關係

當用戶端請求傳送過來後其實是通過這些元件相互之間配合完成了對應的操作。

  • Server元素在最頂層,代表整個Tomcat容器;一個Server元素中可以有一個或多個Service元素
  • Service在Connector和Engine外面包了一層,把它們組裝在一起,對外提供服務。一個Service可以包含多個Connector,但是隻能包含一個Engine;Connector接收請求,Engine處理請求。
  • Engine、Host和Context都是容器,且Engine包含Host,Host包含Context。每個Host元件代表Engine中的一個虛擬主機;每個Context元件代表在特定Host上執行的一個Web應用.

整體Tomcat的執行架構圖

以上就是Tomcat架構設計及Servlet作用規範講解的詳細內容,更多關於Tomcat架構設計Servlet規範的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com