1. 程式人生 > >Servlet 技術簡介

Servlet 技術簡介

Web技術的發展

靜態頁面階段

使用者訪問頁面過程:

  1. 使用者用瀏覽器通過HTTP協議請求伺服器上的Web頁面
  2. 伺服器上的Web伺服器軟體接收到請求後,讀取URI所標識的資源
  3. 在讀取的資源上加上訊息報頭髮送給客戶端的瀏覽器。
  4. 瀏覽器解析響應中的HTML資料,想使用者呈現內容。

CGI(Common Gateway Interface)動態頁面階段

使用者訪問頁面過程:

  1. 使用者通過點選連結或者直接輸入URL訪問CGI程式。
  2. Web伺服器接收到請求後,於是啟動並執行CGI程式,由這個程式來處理使用者的請求。
  3. CGI程式解析請求中的CGI資料,處理資料,產生一個響應(通常是HTML頁面)。
  4. 響應返回給Web伺服器。
  5. Web伺服器包裝這個響應,以HTTP響應的形式傳送給瀏覽器。

Servlet 動態頁面階段

使用者訪問頁面過程:

  1. 使用者通過點選連結或者直接輸入URL訪問Servlet。
  2. Web伺服器接收到請求後,交給Servlet容器。
  3. Servlet容器例項化Servlet。
  4. 呼叫Servlet特定方法對請求進行處理,並且產生一個響應。
  5. 響應由Servlet容器返回給Web容器。
  6. Web容器包裝這個響應,以HTTP響應的形式傳送給瀏覽器。

Servlet是什麼

Servlet是一種獨立於平臺和協議的伺服器端的Java技術,可以用來生成動態的Web頁面。

Servlet是使用Java Servlet應用程式設計介面(API)及相關類和方法的Java程式。

Servlet主要使用者處理客戶端傳來的HTTP請求,並返回一個響應。通常Servlet是指HttpServlet,用於處理HTTP請求。

能夠處理的請求有:doGet() doPost() service()等。

在開發Servlet時,可以直接繼承javax.servlet.http.HttpServlet。

Servlet與Servlet容器

Java Servlet(Java伺服器小程式)是一個基於Java技術的Web元件,執行在伺服器端,由Servlet容器所管理,用於生成動態的內容。Servlet是平臺獨立的Java類,編寫一個Servlet,實際上就是按照Servlet規範編寫一個Java類。Servlet被編譯為平臺獨立的位元組碼,可以被動態地載入到支援Java技術的Web伺服器中執行。

Servlet容器(Servlet引擎)是Web伺服器或應用程式伺服器的一部分,用於在傳送的請求和響應之上提供網路服務,解碼基於MIME的請求,格式化機遇MIME的響應。

Servlet不能獨立於執行,必須被部署到Servlet容器中,由容器來例項化和呼叫Servlet的方法,Servlet容器在Servlet的生命週期內包容和管理Servlet。

Servlet技術特點

高效,方便,跨平臺,功能強大,靈活性和可擴充套件性,共享資料,安全。

1. 高效
在伺服器上僅有一個Java虛擬機器在執行,它的優勢在於當多個來自客戶端的請求進行訪問時,Servlet為每個請求分配一個執行緒而不是程序。

2. 方便
Servlet提供了大量的實用工具例程,如處理很難完成的HTML表單資料,讀取和設定HTTP頭,處理Cookie和跟蹤會話等。

3. 跨平臺
Servlet是用Java類編寫的,可以在不同的作業系統平臺和應用伺服器平臺下執行。

4. 功能強大
在Servlet中,許多實用傳統CGI程式很難完成的任務都可以利用Servlet技術輕鬆完成。例如,Servlet能夠直接和Web伺服器互動,而普通的CGI程式不能。Servlet還能夠在各個程式之間共享資料,使得資料庫連線池之類的功能很容易實現。

5. 靈活性和可擴充套件性
採用Servlet開發的Web應用程式,由於Java類的繼承性,建構函式等特點,使得其應用靈活,可隨意擴充套件。

6. 共享資料
Servlet之間通過共享資料可以很容易地實現資料庫連線池。它能方便地實現管理使用者請求,簡化Session和獲取前一頁面資訊的操作,而在CGI之間通訊則很差。由於每個CGI程式的呼叫都開始一個新的程序,呼叫間通訊通常要通過檔案進行,因而相當緩慢。同一臺伺服器上的不同CGI程式之間的通訊也相當麻煩。

7. 安全
有些CGI版本有明顯的安全弱點。即使是實用最新標準,系統也沒有基本安全框架。而Java定義有完整的安全機制,包括SSL\CA認證、安全政策等規範。

Servlet生命週期

載入和例項化–>初始化–>請求處理–>銷燬

1. 載入和例項化(建立Servlet物件)
第一種情況:
當請求到達容器時,容器查詢該servlet物件是否存在,如果不存在,才會建立例項。
第二種情況:
容器在啟動時,或者新部署了某個應用時,會檢查web.xml當中,servlet是否有 load-on-starup配置。如果有,則會建立該servlet例項。
load-on-starup引數值越小,優先順序越高(最小值為0,優先順序最高)。

2. 初始化init()
在Servlet例項化後,容器呼叫init()方法初始化這個物件,為了讓Servlet物件在處理客戶端請求之前完成一些初始化工作,例如簡歷資料庫的連線,獲取配置資訊等。

3. 請求處理 service()
Servlet容器呼叫service()方法對請求進行處理。
HttpServlet的service()方法,會依據請求方式來呼叫doGet()或者doPost()方法進行請求處理,並且通過呼叫ServletResponse物件的方法設定響應資訊。

4. 銷燬 destroy()
當容器檢測到Servlet例項應該從伺服器中被移除的時候,當需要釋放記憶體或容器關閉時候,容器或呼叫Servlet例項等destroy()方法。
當destroy()方法呼叫之後,容器會釋放這個Servlet例項,隨後會被Java等垃圾收集器所回收,如果在此需要這個Servlet處理請求,Servlet容器會建立一個新的
Servlet例項。



init()destroy()方法只被呼叫一次
service()可以被呼叫多次

Servlet程式碼結構

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 可編寫使用req讀取和請求有關的資訊和表單資料程式碼
        // 可編寫使用resp置頂HTTP應答狀態程式碼和應答頭的程式碼
        // 可編寫使用out物件向頁面中輸出資訊的程式碼
        PrintWriter out = resp.getWriter();
    }
}

總結

首先通過Web技術的發展引出了Servlet技術。接著簡單介紹了Servlet是什麼Servlet和Servlet容器Servlet技術特點Servlet生命週期Servlet程式碼結構

參考:

  • 《Servlet/JSP深入詳解—基於Tomcat的Web開發》 孫鑫
  • 《JSP程式設計教程》(第2版)郭珍 王國輝 張敏 張永
  • 《JSP從零開始學》劉鑫