Servlet 技術簡介
Web技術的發展
靜態頁面階段
使用者訪問頁面過程:
- 使用者用瀏覽器通過HTTP協議請求伺服器上的Web頁面
- 伺服器上的Web伺服器軟體接收到請求後,讀取URI所標識的資源
- 在讀取的資源上加上訊息報頭髮送給客戶端的瀏覽器。
- 瀏覽器解析響應中的HTML資料,想使用者呈現內容。
CGI(Common Gateway Interface)動態頁面階段
使用者訪問頁面過程:
- 使用者通過點選連結或者直接輸入URL訪問CGI程式。
- Web伺服器接收到請求後,於是啟動並執行CGI程式,由這個程式來處理使用者的請求。
- CGI程式解析請求中的CGI資料,處理資料,產生一個響應(通常是HTML頁面)。
- 響應返回給Web伺服器。
- Web伺服器包裝這個響應,以HTTP響應的形式傳送給瀏覽器。
Servlet 動態頁面階段
使用者訪問頁面過程:
- 使用者通過點選連結或者直接輸入URL訪問Servlet。
- Web伺服器接收到請求後,交給Servlet容器。
- Servlet容器例項化Servlet。
- 呼叫Servlet特定方法對請求進行處理,並且產生一個響應。
- 響應由Servlet容器返回給Web容器。
- 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從零開始學》劉鑫