我對Servlet的認(rèn)識
在我的理解中,Servlet是一個java程序,可是這個java程序主要的作用是放在服務(wù)器中來處理客戶端發(fā)送的請求;而通常Servlet處理較多的協(xié)議類型是HTTP協(xié)議類型,因此通常放在http協(xié)議的服務(wù)器中。Servlet由于是個java程序,因此其運行則需要一個java環(huán)境中,其次其運行需要將Servlet程序放入Servlet容器中(例如tomcat,jetty等)來管理Servlet的生命周期。
Servlet的工作特點
Servlet在Servlet容器中的工作方式,是在Servlet中只有一個實例,可是會為不同的請求來生成線程來進行處理;簡單來說,就是服務(wù)器中處理同種請求的Servlet程序的實例只有一個,若有很多用戶同時請求同種請求,則會為每個用戶生成線程來處理請求。
Servlet的生命周期主要是:init()(初始化階段)、service()(響應(yīng)請求階段)以及destroy()(銷毀階段)。
初始化階段:
1.Servlet容器啟動后會自動裝載;?
2.客戶端首次向某個Servlet發(fā)起請求;
3.Servlet更新后,被重新加載;
以上三種情況均屬于Servlet的初始化階段,并且在初始化階段均會調(diào)用init()方法,因此可通過覆蓋init()方法來完成Servlet的一些設(shè)置。
響應(yīng)請求階段:
由于Servlet通常用作Http協(xié)議的處理程序,在編寫自己的Servlet類時,通常需要繼承HttpServlet類(HttpServlet類實現(xiàn)了Servlet接口);當(dāng)客戶端向服務(wù)器發(fā)出請求時,會調(diào)用service()方法,由于該方法在HttpServlet類中已被實現(xiàn)

可以看到HttpServlet類的service方法將ServletRequest和ServletResponse強制轉(zhuǎn)換為HttpRequest和HttpResponse,再調(diào)用自身的service()方法,而自身的service()方法,將根據(jù)請求的類型,調(diào)用相應(yīng)的doXXX方法。由于在HttpServlet類中的doXXX方法均返回錯誤信息,因此需在我們自己的Servlet類中覆蓋這些方法。
銷毀階段:
Servlet的銷毀時機是在web應(yīng)用被終止、servlet容器終止運行以及servlet容器重新裝載servlet的實例,Servlet被銷毀時,會先調(diào)用destroy()方法,因此可以在destroy()中在Servlet實例被銷毀前,來釋放Servlet的相應(yīng)資源。
編寫簡單的Servlet

HelloWorldServlet類的作用是,當(dāng)客戶端以get方法向其請求時,則會在后臺打印“Get: Hello world!”的字符串;若用post方法請求時,則會打印"Post: Hello world!"的字符串。

web.xml文件相當(dāng)于一個說明書,主要是說明URI對應(yīng)的Servlet類名是什么,Servlet名對應(yīng)的是具體哪個類名。就拿URI:http://localhost:8080/MailService/Test/hello,首先看到<servlet-mapping>標(biāo)簽中,/Test/hello這個url的模板與HelloWorldServlet這個Servlet名聯(lián)系起來;然后,就會到<servlet>這個標(biāo)簽中,發(fā)現(xiàn)HelloWorldServlet這個Servlet名與edu.stu.servlets.HelloWorldServlet這個類對應(yīng)起來,因此會達到當(dāng)我們使用http://localhost:8080/MailService/Test/hello這個URI請求資源時,則會交到edu.stu.servlets.HelloWorldServlet這個類來負(fù)責(zé)處理。

上圖就是想/Test/hello請求兩次后的結(jié)果截圖,可以發(fā)現(xiàn)只有一個"servlet work!"的字符串輸出,因為要輸出“servlet work!”這個字符串,是需要調(diào)用init()方法,而init()方法在整個servlet的生命周期中,僅會在初始化階段被調(diào)用一次,因此即便請求兩次,也只有一次輸出“servlet work!”。若想要看噶servlet對Post請求的處理,可以通過Postman來構(gòu)造相應(yīng)的Post請求。
學(xué)習(xí)感受
一開始學(xué)習(xí)Servlet是在學(xué)校的Java web課程,可是由于當(dāng)時的知識理解問題,以及當(dāng)時接觸到的例子(書本提供一些例子會涉及到動態(tài)頁面的輸出),所以對Servlet的認(rèn)識比較混亂,覺得可能和JSP差不多??墒窃诮?jīng)過一些框架學(xué)習(xí)后,發(fā)現(xiàn)Servlet主要還是集中在業(yè)務(wù)層面,并且很多框架是基于Servlet進行封裝,因此對Servlet的認(rèn)識有了不同。