Servlet 是Java Web開發(fā)的規(guī)范袱蚓,作為后臺開發(fā)人員有必要好好理解良蒸。
Servlet是什么遥巴?
servlet是基于JavaTM技術的Web組件,由容器管理悴务,可以生成動態(tài)內容睹限。與其他基于Java技術的組件一樣,servlets是獨立于平臺的Java類讯檐,它們被編譯成平臺無關的字節(jié)碼羡疗,可以動態(tài)地加載到支持Java技術的Web服務器中并由其運行。容器别洪,有時稱為servlet引擎叨恨,是提供servlet功能的Web服務器擴展。servlet通過servlet容器實現的請求/響應范式與Web客戶機交互蕉拢。
Servlet 容器是什么特碳?
servlet容器是Web服務器或應用程序服務器的一部分诚亚,它提供網絡服務,通過這些服務發(fā)送請求和響應午乓,解碼基于MIME的請求站宗,并格式化基于MIME的響應。servlet容器還包含并管理servlet的整個生命周期益愈。
servlet容器支持安裝到服務器上梢灭,也支持構建到應用程序中。
所有servlet容器都必須支持HTTP作為請求和響應的協(xié)議蒸其,但可能支持基于請求/響應的其他協(xié)議敏释,如HTTPS(HTTP over SSL)。
JavaSE8是底層Java平臺的最低版本摸袁,必須用它來構建servlet容器钥顽。
servlet與其他技術的比較?
在功能上靠汁,servlet提供了比公共網關接口(Common Gateway Interface蜂大,CGI)程序更高級別的抽象,但比JavaServer Faces等web框架提供的抽象級別更低蝶怔。
與其他服務器擴展機制相比奶浦,servlet具有以下優(yōu)勢:
1、它們通常比CGI腳本快得多踢星,因為使用了不同的處理模型澳叉。
2、它們使用許多Web服務器支持的標準API沐悦。
3成洗、它們具有Java編程語言的所有優(yōu)點,包括易用性開發(fā)和平臺獨立性所踊。
4泌枪、他們可以訪問Java平臺上可用的大量api。
Servlet接口
Servlet接口是JavaServletAPI的中心抽象秕岛。所有servlet要么直接實現該接口碌燕,要么更常見地通過擴展實現該接口的類來實現。JavaServletAPI中實現Servlet接口的兩個類是GenericServlet和HttpServlet继薛。大多數情況下修壕,開發(fā)人員都會擴展HttpServlet來實現他們的servlet。
Servlet請求處理方法
基本Servlet接口定義了一個用于處理客戶機請求的服務(service)方法遏考。對于servlet容器路由到servlet實例的每個請求慈鸠,都會調用此方法。
處理對Web應用程序的并發(fā)請求通常要求Web開發(fā)人員設計servlet來處理在特定時間在服務(service)方法中執(zhí)行的多個線程灌具。
通常青团,Web容器通過在不同線程上并發(fā)執(zhí)行服務方法來處理對同一servlet的并發(fā)請求譬巫。
HttpServlet抽象子類在基本Servlet接口之外添加了其他方法,這些方法由HttpServlet類中的服務方法自動調用督笆,以幫助處理基于HTTP的請求芦昔。這些方法包括:
? doGet doPost? doPut doDelete doHead? doOptions
通常在開發(fā)基于HTTP的Servlet時,Servlet開發(fā)人員只關心doGet和doPost方法娃肿。其他方法被認為是非常熟悉HTTP編程的程序員使用的方法咕缎。
HttpServlet接口定義getLastModified方法以支持條件GET操作。條件GET操作僅當資源在指定時間后被修改時才請求發(fā)送該資源料扰。在適當的情況下凭豪,這種方法的實現可以幫助有效地利用網絡資源。
Servlet生命周期
通過Servlet接口可知晒杈,Servlet包含初始化嫂伞,提供服務,摧毀等過程拯钻,如下代碼所示:
javax.servlet.Servlet#initjavax.servlet.Servlet#servicejavax.servlet.Servlet#destroy
提供服務service方法其實有兩種情況末早,一種是同步處理,另外一種是異步處理说庭,本文將講解同步處理請求的生命周期,異步情況下文再進行分析:
1郑趁、Servlet容器實例化Servlet對象(可能是容器啟動就實例化刊驴,也可能是延遲到需要處理對應請求的時候實例化)
2、初始化servlet javax.servlet.Servlet#init ServletConfig參數寡润,允許訪問系統(tǒng)環(huán)境配置捆憎,和ServletContext對象
? ? 特殊情況:可能存在初始化失敗的情況,拋出UnavailableException ServletException梭纹,在這種情況下躲惰,servlet不能放在活動服務中,必須由servlet容器釋放变抽。不調用destroy方法础拨,因為它被視為初始化不成功。
初始化失敗后绍载,容器可能會實例化和初始化新實例诡宗。此規(guī)則的例外情況是,當不可用異常指示不可用的最短時間時击儡,容器必須等待該時間段過去塔沃,然后才能創(chuàng)建和初始化新的servlet實例。
? ? ?注意事項:當工具加載和內省Web應用程序時阳谍,靜態(tài)初始化方法的觸發(fā)與init方法的調用是不同的蛀柴。在調用servlet接口的init方法之前螃概,開發(fā)人員不應假定servlet在活動容器運行時中。例如鸽疾,當只調用靜態(tài)(類)初始化方法時吊洼,servlet不應嘗試建立到數據庫或企業(yè)JavaBeansTM容器的連接。
3肮韧、處理請求 在正確初始化servlet之后融蹂,servlet容器可以使用它來處理客戶機請求,請求由ServletRequest類型的請求對象表示弄企。servlet通過調用ServletResponse類型的提供對象的方法來填寫對請求的響應超燃。這些對象作為參數傳遞給Servlet接口的服務(service)方法。對于HTTP請求拘领,容器提供的對象屬于HttpServletRequest和HttpServletResponse類型意乓。
? 3.1 多線程問題:一個servlet容器可能并發(fā)調用servlet的service方法
? 為了處理請求,Servlet開發(fā)人員必須為服務方法中的多個線程的并發(fā)處理做好充分的準備约素。
? 盡管不建議這樣做届良,但開發(fā)人員的另一種選擇是實現SingleThreadModel接口,該接口要求容器保證在服務方法中一次只有一個請求線程圣猎。servlet容器可以通過序列化servlet上的請求或維護servlet實例池來滿足此需求士葫。如果servlet是已標記為可分發(fā)的Web應用程序的一部分,那么容器可以在應用程序分布的每個JVM中維護一個servlet實例池送悔。
? 對于沒有實現SingleThreadModel接口的servlet慢显,如果服務方法(或HttpServlet抽象類的服務方法被分派到的doGet或doPost等方法)已用synchronized關鍵字定義,則servlet容器不能使用實例池方法欠啤,而必須通過實例池方法序列化請求荚藻。強烈建議開發(fā)人員在這些情況下不要同步服務方法(或分派給它的方法),因為這會對性能產生不利影響洁段。
? 3.2 處理過程中異常:ServletException 或者 UnavailableException
? UnavailableException分為臨時和永久性不可用:
? 如果不可用異常指示永久不可用应狱,則servlet容器必須從服務中刪除servlet,調用其destroy方法祠丝,然后釋放servlet實例疾呻。容器因該原因拒絕的任何請求都必須返回SC_NOT_FOUND(404)響應。
? 如果不可用異常指示臨時不可用纽疟,容器可以選擇在臨時不可用期間不通過servlet路由任何請求罐韩。任何服務請求都必須在服務不可用的情況下被拒絕,并在服務期間返回一個服務不可用的服務(SC_SERVICE_UNAVAILABLE 503)污朽。
容器可以選擇忽略永久性不可用性和臨時性不可用性之間的區(qū)別散吵,并將所有不可用性異常視為永久性的,從而移除從服務拋出任何不可用異常的servlet。?
javax.servlet.Servlet#service
Servlet服務完成矾睦,實例銷毀?晦款。
javax.servlet.Servlet#destroy
到此,本篇Servlet規(guī)范理解就到這了枚冗,本文介紹了Servlet和Servlet容器缓溅,介紹了Servlet的接口,分析了Servlet異步處理請求的生命周期等內容赁温,但是Servlet規(guī)范?還有很多內容坛怪,后面將陸續(xù)更新。?