JavaWeb中的Tomcat,Servlet詳解

ihav2carryon發表於2024-08-06

JavaWeb

JavaWeb技術主要包括伺服器技術(後端),如Tomcat,Servlet,JSP等待,以及客戶端技術(前端)如HTML,CSS,JavaScript等等

Web伺服器

Web伺服器主要負責處理客戶端發出的HTTP請求,並做出相應回應

  • Web伺服器:安裝了伺服器軟體的計算機,只用於複雜處理請求,發出相應
  • Web伺服器軟體:接受客戶端的請求,處理請求做出響應
  • 在Web伺服器中可以部署web專案,讓瀏覽器作為媒介就行訪問

Web伺服器軟體

伺服器軟體是部署在伺服器中的程式,主要有以下幾種,我們主要學習Tomcat的使用

  1. weblogic:oracle公司,大型的javaEE伺服器,支援所有的JavaEE規範,收費的。
  2. websphere:IBM公司,大型的javaEE伺服器,支援所有的ovaTE規範,收費的。
  3. JBOSS:JBOSS公司,大型的javaEE伺服器,支援所有的JavaIL規範,收費的。
  4. Tomcat:Apache基金組織,中小型的javaEE伺服器,開源的,免費的。

Tomcat

Tomcat是一個免費開源的Java Servlet(Server Applet,服務程式)容器,主要用於部署和執行基於Java的Web應用程式,是由Apache基金組織成立,屬於輕量級伺服器.

Tomcat主要特點

  • Servlet容器:Tomcat實現一個Servlet規範的容器,可以用來部署Servlet和JSP的Web應用程式.JSP(JavaServer Pages)是一種動態web內容技術,其允許開發者將Java程式碼和特點的JS嵌入到HTML頁面中
  • 輕量級:Tomcat是一個輕量級的伺服器,相比其他商業伺服器啟動速度快,資源消耗少
  • 易配置:Tomcat的配置檔案簡單明瞭,易於理解修改

Tomcat的架構

  • Connector(聯結器):用於接收客戶端HTTP的請求並將其轉發至相應的Servlet,並提供SocketRequestResponse相關的轉化;
  • Container(容器):ContainerTomcat處理Servlet的核心部件,其包括Engine(引擎),Host(主機),Context(上下文),Wrapper(包裝器)

Tomcat中只有一個Server; 一個Server中可以包含多個Service; 一個Service只能包含一個Container 但可以包含多個Connector 因為一個服務可以有多個連線;示意圖如下:

多個Connector和一個Container就可以構成一個Sevrice,有了Service就可以對外提供,但還需一個執行環境,Server提供了一個執行環境,其關係可以在Tomcatconf目錄下的sever.xml配置檔案中檢視

Connector與Container的關係

由上訴內容可知,一個請求傳送給Tomcat時,會經過Service,然後轉交到我們的Connector

  • Connector用於接收請求並將請求封裝成RequestResponse來具體處理,RequestResponse封裝完之後再交由Container進行處理,Container處理完請求之後再返回給Connector,最後Connector透過Socket將處理的結果放回給客戶端

Servlet

Java Servlet是執行在Web伺服器或應用伺服器上的程式,它是作為來自Web瀏覽器或其他HTTP客戶端的請求和HTTP伺服器上資料庫和應用程式的中間層,其本質上是用java語言編寫的一個介面

Servlet的優勢

  • 良好的效能
  • Servlet在Web伺服器的地址空間執行,因此就不用再建立一個單獨的程序來處理每個客戶端的請求
  • Servlet是獨立與平臺的,因為它用Java開發語言編寫

Servlet架構

下圖展示了Servlet在Web應用程式中的位置:

Servlet任務

  • 讀取客戶端(瀏覽器)傳送的顯示資料.在包括網頁上的HTML表單,或者也可以是來自applet或自定義的HTTP客戶端的表單
  • 讀取客戶端(瀏覽器)傳送的隱式HTTP請求資料,包括cookies,媒體型別和瀏覽器能理解的壓縮格式等等
  • 處理資料並生成結果,這個過程可能需要訪問資料庫,執行RMI或CORBA呼叫,呼叫Web服務,或者直接計算得出對應響應
  • 傳送顯式的資料(即文件)到客戶端(瀏覽器).該文件格式可以是多種多樣的,包括文字檔案(HTML或XML),二進位制檔案(GIF影像)
  • 傳送隱式HTTP響應到客戶端

Servlet生命週期

*Servlet的生命週期可以理解為從建立到被銷燬的過程*

  • Servlet初始化後呼叫init()方法
  • Servlet呼叫service()方法來處理客戶端請求
  • Servlet銷燬前呼叫destroy()方法
  • 最後,Servlet是由JVM的垃圾回收器進行垃圾回收的

現在我們開始詳細講解Servlet的生命週期方法

init()方法

init()方法被設計成只能呼叫一次.它在第一次建立Servlet時被呼叫,在後續每次使用者請求時不再呼叫.因此其是用於一次性初始

  • Servlet建立於使用者第一次呼叫對應於該Servlet的URL時,但也可以指定Servlet在伺服器第一次啟動時被載入
  • 當一個使用者呼叫一個Servlet時,就會建立一個Servlet例項,每一個使用者請求都會產生一個新的執行緒.
  • init()方法只要用途是簡單第建立或載入一些資料,這些資料被使用者Servlet的整個週期

init()方法的定義如下:

public void init(ServletConfig servletConfig) throws ServletException {
      //初始化程式碼  
    }

service()方法

service()方法是執行實際任務的主要方法.

  • 每次伺服器接收到一個Servlet請求時,伺服器就會產生一個新的執行緒並呼叫服務.
  • service()方法檢查HTTP請求型別(GET,POST,PUT,DELETE) 並在適當時候呼叫doGet.doPost.doPut.doDelete等方法

下面是其方法程式碼

  public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

service()方法由容器呼叫,service方法在適當的時候呼叫doGet.doPost.doPut.doDelete ,因此你不用對service()方法進行任何操作,你只需根據使用者不同請求型別來重寫doGet()doPost()方法即可

doGet()方法

  • GET請求來自於一個URL的正常請求,或者來自於一個未指定的METHODHTML表單,它由doGet()方法進行處理
public void doGet(HttpServletRequest request,
                  HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 程式碼
}

doPost方法

  • POST請求來自於一個特別指定了METHDOPOSTHTML表單,它由doPost()方法處理
public void doPost(HttpServletRequest request,            HttpServletResponse response)
    throws ServletException, IOException {
    // Servlet 程式碼
}

destroy()方法

  • destory()方法和init()方法一樣也只能呼叫一次,在Servlet生命週期結束時被呼叫
  • destroy()方法可以讓你的Servlet關閉資料庫連線,停止後臺執行緒,把Cookie列表或點選計數器寫入磁碟,
  • 在呼叫了destroy()方法之後,servlet物件就被標記為垃圾回收

destory()方法定義如下:

 public void destroy() {
    // 終止化程式碼...
  }

架構圖如下

Web.xml配置

  • <web-app> :web.xml的根元素,用於宣告XML的版本.編碼格式以及Web應用的模式檔案(XSD)的位置

  • <servlet><servlet-mapping>

    <servlet> 用於定義一個Servlet的類資訊,包括它的名稱和實現類

    • <servlet-name> :設定Servlet例項的名字
    • <servlet-class> :配置類的路徑,建立之前要確保有相對應的類

    <servlet-mapping> :用於指定一個或多個URL模式於前面定義的Servlet之間的對映

    • <servlet-name>:用於繫結servlet標籤名字需和<servlet>標籤下的<servlet-name>一致
    • <url-patter> :配置請求路徑,客戶端按該路徑請求,可觸發對應的Servlet例項中的servlet方法

    <load-on-startup> :第一次訪問時建立Servlet物件,將中間的值設為負數

    <load-on-startup> :伺服器啟動後建立,將中間值設為大於大於0的數

    E.g

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
      <servlet>
          <servlet-name>servlet01</servlet-name>
          <servlet-class>com.mashang.web.MyServlet01</servlet-class>
          <load-on-startup>0</load-on-startup>
      </servlet>
        <servlet-mapping>
            <servlet-name>servlet01</servlet-name>
            <url-pattern>/a</url-pattern>
        </servlet-mapping>
    </web-app>
    

Servlet註釋

使用註解可以避免在web.xml 檔案中進行顯性配置,從而減少配置檔案的複雜性和提高開發效率

@WebServlet

  • 作用:標籤用於直接在Servlet類上定義其URL對映和其他配置
  • 屬性:
    • valueurlPatterns :指定一個或多個URL模式,用於匹配HTTP請求並將其分發給Servlet
    • name:為Servlet配置一個名稱
    • loadOnStartup:指定Servlet在伺服器啟動時是否載入以及載入順序
    • asyncSupported :指示Servlet是否支援非同步處理
    • initParams :初始化引數列表
  • urlPatterns配置方法:

配置多種屬性時要寫上其屬性名

@WebServlet({"/demo1","/demo2",...})//配置多個請求路徑對應一個Servlet
@WebServlet("/user/demo1")//配置多級路徑
@WebServlet("/user/*")//匹配以user開頭形式的請求
@WebServlet("/*")//匹配所有的請求
@WebServlet("/*.do")//匹配do結尾的請求

HttpServlet

HttpServletServlet的一個實現類,是一個抽象類.其在源有的Servlet 介面上新增了一些關於Http協議的處理方法,其功能比Servlet功能強大,在實際開發中,實現介面服務通常會繼承這個類,而避免直接繼承Servlet

GET請求和POST請求

GET請求

GET請求是一種HTTP方法,用於從伺服器請求資源.當客戶端(通常是指瀏覽器),向伺服器發起請求時,它是在請求特定的資源

  • GET請求的引數
    • GET請求的引數通常會附加在URL後面,使用?號分隔URL和引數
    • 引數之間使用&分隔
    • 例如:https://example.com/resource?param1=value1&param2=value2
  • GET請求的安全性
    • GET請求中的所有引數都會暴露在URL中,因此可能會被記錄在瀏覽器的歷史記錄或日誌檔案中,安全性較低
    • 因此GET請求不能用來傳遞敏感資訊,例如密碼等等
  • 快取速度
    • 瀏覽器和其他中間部件會快取GET請求的結果,因此會導致GET請求的速度較快,提高效能
  • GET的限制
    • 由於GET請求是透過URL傳送的,而URL本身長度有限制,因此GET的長度是有限制的
  • GET的一般使用場景
    • GET請求通常用於檢索資訊,如查詢資料庫或獲取靜態資源

POST請求

和GET請求一致的是POST請求也是一個HTTP方法,用於向伺服器傳送資料.當客戶端(瀏覽器)使用POST方法向伺服器傳送請求時,它是在提交資料交給伺服器進行處理

  • POST的請求體

    • POST請求通常不會放置在URL中,而是放置在請求體中
    • 意味著資料不會顯示在URL中,於GET請求相比更具有安全性和隱式性
  • 安全性

    • 由於資料不會顯示在URL中,POST更適合傳送更適合傳輸敏感資訊
    • POST請求中的資料通常使用編碼格式來組織
  • POST限制

    • POST長度不會受到限制,因此可以傳輸大量資料
    • 但伺服器仍有自己的最大限制
  • POST一般使用場景

    • POST請求通常用於提交資料,如登入表單,登錄檔單

doGet()和doPost()

doGet()

doGet()方法是HttpServlet 類中的一個方法

  • 請求型別
    • doGet()方法是專門用於處理HTTP GET請求的方法

doPost()

doPost()方法是HttpServlet類中的一個方法

  • 請求型別
    • doPost()方法是專門處理HTTP POST請求的方法

E.g:

@WebServlet("/login")
public class MyHttpServlet01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("執行GET請求業務邏輯");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("執行POST請求業務邏輯");
    }
}

MyHttpServlet01類是HttpServlet 的繼承類,重寫了其中的doGet()doPost()方法,我們在Postman軟體可以分別去測試其GET請求和POST請求

相關文章