昨天其實已經就寫好今日的文章
但沒儲存到...
今天主要是淺談一下Servlet的生命週期
以及HTTP的一些API說明(對應到書的章節ch4)
Servlet的生命週期,大致可分為:
init()
Container建立Servlet instance後,會執行init()進行初始化工作
如果有需要其他初始工作(註冊物件或是DB設定),可以去Override,只會執行一次
service()
當client 傳送第一個request時,Container 會啟動一個新的thread,去執行此方法
根據傳進的HTTP去呼叫對應的Servlet方法,通常service()是不會去Override的,service()只是讓HTTP
找到該執行方法(eg. doGet())
doGet()& doPost()
此為程式的起點,邏輯一開始的地方,至少會去Override doGet() 或是 doPost()
不然Contsainer會當作不接受HTTP的方法
destory()
同init()只會執行一次
當Servlet準備GC(垃圾回收機制)前,會進行相關的清理工作
Servlet最重要的工作在於處理request
只會產生一個instance,由Container透過多個thread
來處理一個Servlet所發出的多個request
Servlet繼承了javax.servlet.http.HttpServlet
而HttpServlet又繼承了javax.servlet.GenericServlet
且GenericServlet實作了Servlet的interface
簡單以圖示表示一下
MyServlet -> HttpServlet -> GenericServlet --> Servlet
HttpServlet已經實作了大部分的servlet方法
另外這些HttpServlet傳入的參數HttpServletRequest&HttpServletResponse
由Container去實做這些介面
只要Servlet的service()被呼叫,Container會提供有哪些方法是可以使用的
只需透過interface的型別拿來使用即可
HTTP提供的方法中
在開發最常只會用到GET 和POST
但在這裡還是簡單整理其他方法
HEAD
類似get請求,但response不提供內容的資料,只回傳原本的header
可在這看到本來request的url資訊
TRACE
可做來debug或測試,讓client查出server接收到的訊息內容
PUT
將附帶的資訊放到請求URL上
DELETE
刪除URL上的resource
OPTIONS
URL上列出可資源回應可使用的HTTP方法
CONNECT
發出轉換TCP/IP的連線通道
最重要的還是GET 和POST方法
其中POST是屬於non-idempotent的
所以servlet也利用此特性來處理對資料的CRUD
此外如前幾天提到的
POST具有參數不受限制、以及安全性較高的特性
因此通常大部分都只會Override doPost()
今天就先記錄到這裡