Servlet 3.1 英文原版翻譯

servlet3.1英文原版下載:https://download.oracle.com/otndocs/jcp/servlet-3_1-fr-spec/index.html

持續更新,未完

目錄

第2章  servlet 接口... 1

2.1         誰來處理每個請求... 1

2.1.1       處理HTTP 請求的方法... 1

2.3        servlet 的生命週期... 1

2.3.1       servlet的加載和實例化... 2

2.3.2     servlet的初始化... 3

2.3.3     請求的處理... 4

 

第2章  servlet 接口

2.1         誰來處理每個請求

2.1.1       處理HTTP 請求的方法

2.3        servlet 的生命週期

                每個 servlet都擁有一套非常完善的生命週期管理機制;

這套機制決定了每個 servlet 如何被加載,被實例化,被初始化,如何處理客戶端的請求,如何被 service 方法所調用。這套機制反應在API裏的話,對應着如下3個方法:init, service, 和 destroy,

這3個方法均來自於javax.servlet.Servlet 這個接口, 所有的 servlet 都要直接或間接的實現這個接口,其中,間接的實現這個接口,可以通過繼承 GenericServlet 和 HttpServlet這2個抽象類來實現,在 TomCat8 中,HttpServlet繼承了GenericServlet,而GenericServlet實現了 Servlet接口。

其中,GenericServlet 的全稱是       

javax.servlet.GenericServlet

HttpServlet 的全稱是 javax.servlet.http.HttpServlet

這2個抽象類都位於TomCat 8 的 /lib/servlet-api.jar 中。

2.3.1       servlet的加載和實例化

Servlet 容器負責  所有servlet 的加載和實例化。什麼時候servlet會完成加載並且實例化呢?有2種情況:(1)servlet容器已經啓動了;(2)servlet容器未啓動,直到客戶端的請求需要一個servlet去處理時,啓動servlet 容器。

不管是哪種情況,只要 servlet容器啓動了,所有該被加載的servlet都會被servlet容器所加載。所使用的類加載機制和那些普通的java類加載機制是一樣的。可能通過本地class文件,或者遠程class文件以及其他網絡途徑加載。

在加載完所有servlet類之後,servlet容器就會把它們都一個一個實例化,以備後用。

2.3.2     servlet的初始化

當servlet對象已經被實例化之後,servlet容器必須再將其初始化,servlet對象纔可以處理客戶端請求。那麼,在初始化的過程中,都能幹哪些事情呢:servlet可以加載持久化配置信息,可以初始化一些系統開銷比較大的資源(比如JDBC的連接),以及一些只需加載一次的資源。Servlet容器會讓每個servlet實例調用servlet接口的init方法來實現初始化,同時,還會讓servlet實例實現ServletConfig接口來以名-值對的形式獲取web應用的配置信息中的初始化參數,還可以獲取實現了ServletContext接口的對象,這個對象描述了servlet的運行時環境。ServletContext見第4章。       

在tomcat8中,GenericServlet implements Servlet, ServletConfig

2.3.2.1     初始化中的異常

Servlet在初始化過程中會出現2個異常:UnavailableException和ServletException.一旦出現了這2個異常,這個servlet已經不能使用了並且會被servlet容器所釋放。注意,當servlet初始化失敗時,destroy方法並不會被調用。

當servlet初始化失敗時,servlet容器會重新實例化和初始化一個新的servlet對象。需要說明的是,當UnavailableException異常規定了這個servlet不可用時間時,servlet容器會等到這段時間過去後,纔會着手重新實例化和初始化這個新的servlet對象。

 

2.3.2.2    關於工具的思考

當一個工具被加載並且作用於整個web應用時,靜態初始化方法的調用不等於init方法的調用。在init方法未被調用之前,我們不能認爲這個servlet是可用的。比如,當servlet容器只調用了這個servlet靜態初始化方法時,那麼這個servlet不能建立數據庫連接和企業級javabean容器的連接

2.3.3     請求的處理

當一個servlet被正確的初始化之後,servlet容器就可以使用這個servlet來處理客戶端的請求了(servlet容器調用service方法)。請求被servlet容器封裝成了javax.servlet.ServletRequest 對象。響應內容也被封裝成了javax.servlet. ServletResponse.對象。這2個對象都作爲參數傳給了service方法。­­­­­­­­­

如果是HTTP請求,則ServletRequest 對象被servlet容器轉換爲javax.servlet.http.HttpServletRequest對象,ServletResponse 對象被轉換爲javax.servlet.http.HttpServletResponse對象。

一個servlet實例就緒之後,只要沒有相應的請求過來,那麼他自己是不會處理任何事情的。

2.3.3.1     多線程問題

Servlet容器在遇到併發請求時,也是通過調用service方法來處理的。所以,servlet開發者必須做好充足的準備。

儘管servlet通過實現SingleThreadModel接口來解決多線程問題的這種做法不被推薦,但也算是一種替代方案。只要一個servlet實現了SingleThreadModel接口,則servlet容器就會保證在同一時刻,一個請求線程只對應一個service方法。Servlet容器通過序列化一個servlet的請求或者維持一個servlet實例池來保證客戶端請求的線程安全。

如果在一個分佈式的web應用中,servlet容器會在每一個jvm中維持一個servlet實例池的。

如果servlet沒有實現SingleThreadModel接口,但是service方法或者在service方法中調用的方法(比如doGet,doPost等等)聲明瞭synchronized標誌,那麼servlet容器就不能使用servlet實例池了,而是必須序列化這個請求。因此,強烈建議在開發過程中不要對service方法或者在service方法中調用的方法(比如doGet,doPost等等)聲明synchronized標誌,因爲這樣做會對程序造成不利的影響。

2.3.3.2     請求處理中的異常

當一個servlet處理請求時,不外乎會拋出2種類型的異常:ServletException和UnavailableException。當拋出ServletException類型的異常意味着servlet在處理請求的過程中出現了錯誤,當這種類型的異常發生時,servlet容器應當採取適當的措施去清理這個請求;

當拋出UnavailableException類型的異常意味着,無論何時(分爲暫時性和永久性),這個servlet都無法處理這個請求。

如果UnavailableException異常信息裏面表明是永久性不可用,那麼servlet容器會讓這個servlet停止服務,並且調用其destroy方法,接着釋放servlet實例資源。(這裏對比一下 .2.3.2.1 初始化中的異常 中對destroy方法的說明)。最後返回狀態碼404;

如果UnavailableException異常信息裏面表明是暫時性不可用,servlet容器會在一段時間內不讓這個servlet處理任何請求,並且返回錯誤狀態碼503.和一個Retry-After響應頭,這個響應頭代表這段不可訪問的時間會持續多久。

不過,servlet容器會忽略永久性和暫時性的區別。只要servlet拋出UnavailableException類型的異常,都視爲永久性不可用,處理方法按照永久性不可用的來。

2.3.3.3     異步處理(待續,請繼續關注)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章