国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Servlet 2.1規(guī)范概述(中文版)

2019-11-18 15:08:39
字體:
供稿:網(wǎng)友

  1概述
和傳統(tǒng)的Server端擴(kuò)展機(jī)制相比,Servlet有如下優(yōu)點(diǎn):
1. 比CGI腳本快,因?yàn)镾ervlet采用了不同的處理模式。
2. Servlet使用的標(biāo)準(zhǔn)API為大多數(shù)Web Server所接受。
3. 因?yàn)槭?a href="http://m.survivalescaperooms.com/article.asp?typeid=160">java語言開發(fā)的,所以擁有Java的所有優(yōu)點(diǎn),包括易于開發(fā)和平臺(tái)無關(guān)等。
4. 可以方便地訪問大量的Java類庫資源。

2 Servlet生命周期
一個(gè)Servlet有一個(gè)生命周期,定義了一個(gè)Servlet 如何被加載和被初始化,它怎樣接收請(qǐng)求、響應(yīng)請(qǐng)求、怎樣提供服務(wù)。

在代碼中,Servlet生命周期由接口:javax.servlet.Servlet 所定義。 所有的Java Servlet 必須,直接或間接地實(shí)現(xiàn)javax.servlet.Servlet接口,這樣才能在Servlet Engine上運(yùn)行。Servlet Engine提供network Service, 響應(yīng)MIME request, 運(yùn)行Servlet Container。 javax.servlet.Servlet接口定義了一些方法,在Servlet 的生命同期中這些方法會(huì)在特定時(shí)間按照一定的順序被調(diào)用。如下圖:

2.1 Servlet 如何被加載(Load),被實(shí)例化(Instantiated)
Servlet Engine 負(fù)責(zé)實(shí)例化和加載Servlet,這個(gè)過程可以在Servlet Engine 加載時(shí)執(zhí)行,可以在Servlet 響應(yīng)請(qǐng)求時(shí)執(zhí)行,也可以在兩者之間的任何時(shí)候執(zhí)行。

2.2 Servlet如何被初始化(Initialized)
Servlet Engine 加載好Servlet 后,必須要初始化它。初始化時(shí)Servlet 可以從數(shù)據(jù)庫里讀取初始數(shù)據(jù),建立JDBC Connection,或者建立對(duì)其它有價(jià)值的資源的引用。
在初始化階段,Init( )方法被調(diào)用。這個(gè)方法在javax.servlet.Serlet接口中定義。Init( )方法以一個(gè)Servlet 配置文件(ServletConfig 型)為參數(shù)。Servlet configuration 對(duì)象由Servlet Engine 實(shí)現(xiàn),可以讓Servlet 從中讀取一些name-value對(duì)的參數(shù)值。ServletConfig對(duì)象還可以讓Servlet access 一個(gè)Servlet Context對(duì)象。

2.3 Servlet 如何處理請(qǐng)求
Servlet 被初始化以后,就處于能響應(yīng)請(qǐng)求的就緒狀態(tài)。每個(gè)對(duì)Servlet 的請(qǐng)求由一個(gè)Servlet Request 對(duì)象代表。Servlet 給客戶端的響應(yīng)由一個(gè)Servlet Response對(duì)象代表。
當(dāng)客戶端有一個(gè)請(qǐng)求時(shí),Servlet Engine 將ServletRequest 和ServletResponse對(duì)象都轉(zhuǎn)發(fā)給Servlet,這兩個(gè)對(duì)象以參數(shù)的形式傳給Service方法。這個(gè)方法由javax.servlet.Servlet定義、并由具體的Servlet 實(shí)現(xiàn)。
Servlet還可以實(shí)現(xiàn) ServletRequest 和ServletResponse接口。ServletRequest接口可以讓Servlet 獲取客戶端請(qǐng)求中的參數(shù)。如form data, request信息,協(xié)議類型等等。Servlet 可以從ServletInputStream流中讀取request 數(shù)據(jù)。ServletResponse接口答應(yīng)Servlet設(shè)置response headers和status codes 。實(shí)現(xiàn)這個(gè)接口可以使Servlet能訪問ServletOutputStream流用來向客戶端返回?cái)?shù)據(jù)。

2.4 多線程和映射(Mapping)
在多線程環(huán)境中,大多數(shù)Servlet 必須能處理同時(shí)發(fā)生的多個(gè)請(qǐng)求。但一種情況例外,就是當(dāng)一個(gè)Servlet 實(shí)現(xiàn)了 SingleThreadModel接口,這樣的Servlet 只會(huì)響應(yīng)同一時(shí)間的一個(gè)請(qǐng)求。
Servlet根據(jù)Servlet Engine 的Mapping 來響應(yīng)客戶端請(qǐng)求、Mapping將URL和Servlet實(shí)例相對(duì)應(yīng)。比如:/hello/index.Html可以對(duì)應(yīng)HelloServlet。 然而,一個(gè)對(duì)應(yīng)也可以將一個(gè)URL和多個(gè)Servlet實(shí)例相對(duì)應(yīng)。比如,一個(gè)分布式的Servlet Engine 運(yùn)行在多臺(tái)機(jī)器上時(shí), 同一個(gè)Servlet 可以有多個(gè)實(shí)例運(yùn)行在不同的服務(wù)器上,以均衡處理的負(fù)載。作為一個(gè)Servlet 開發(fā)者。你不能假定Servlet將來只有一個(gè)實(shí)例。

2.5 Servlet如何被釋放
Servlet Engine 沒有必要在Servlet 生命周期的每一段時(shí)間內(nèi)都保持Servlet的狀態(tài)。Servlet Engine可以隨時(shí)隨意使用或釋放Servlet。因此,你不能依靠Servlet class或其成員來存貯信息。
當(dāng)Servlet Engine 判定一個(gè)Servlet應(yīng)當(dāng)被釋放時(shí),(比如說engine預(yù)備Shut down 或需要回收資源)engine必須讓Servlet 能釋放其正在使用的任何資源,并保存持續(xù)性的狀態(tài)信息。這些可以通過調(diào)用Servlet的destroy方法來實(shí)現(xiàn)。
當(dāng)Servlet Engine 釋放一個(gè)servlet 以前必須讓其完成當(dāng)前實(shí)例的service方法或是等到timeout(假如engine定義了timeout)。當(dāng)engine釋放一個(gè)Servlet以后,engine將不能再將請(qǐng)求轉(zhuǎn)發(fā)給它,engine必須徹底釋放該servlet并將其標(biāo)明為可回收的(給garbage collection)。

3 Servlet Mapping技術(shù)
作為一個(gè)Servlet Engine 開發(fā)者,你可以隨意規(guī)定如何將客戶端的請(qǐng)求映射到Servlets。Specification本身并不強(qiáng)制這種規(guī)則,然而你可以使用下面任何一種建議:

1. 你可以使一個(gè)servlet 只和一個(gè)URL對(duì)應(yīng)。 如:URL/feedback/index.html對(duì)應(yīng)feedBack class。
2. 可以認(rèn)為指定的某些目錄下全是Servlet。
3. 可以指定以非凡的后綴名結(jié)尾的請(qǐng)求為Servlet請(qǐng)求。 如:*.thtml認(rèn)為是Servlet。
4. 使用特定的URL:/servlet/servlet_name.
5. 可以直接用Servlet的class名來激活它。 如:/servlet/com.foo.servlet.MailServlet.

4 Servlet Context ServletContext 接口
定義了一個(gè)Servlet context 對(duì)象,保存著Servlet engine 的信息。通過Servlet context, Servlet 可以記日志文件,可以獲取資源和對(duì)象(比如RequestDispatcher)。一個(gè)Servlet 只能在一個(gè)Servlet context 下運(yùn)行,但不同的Servlet能擁有Servlet Engine 的不同視圖。
假如一個(gè)Servlet Engine支持虛擬主機(jī),每個(gè)虛擬主機(jī)擁有一個(gè)Servlet context,它不能被多個(gè)虛擬主機(jī)共享。
Servlet Engine 可以讓Servlet Context擁有自己的范圍,就象作為URL的一部分。如一個(gè)Servlet Context 屬于一個(gè)銀行應(yīng)用,可以被映射到/bank,這時(shí)一個(gè)getContext請(qǐng)求(由/bank/fooServlet發(fā)出)將返回/bank的Servlet Context。

5 HTTP sessions
HTTP是一個(gè)stateless的協(xié)議,為了建立有效的Web Server application, 你必須能識(shí)別來自遠(yuǎn)程客戶端的眾多請(qǐng)求中哪些是屬于同一個(gè)客戶端的。有許多追蹤session的方法,但都很復(fù)雜,難于使用。
但是Java Servlet API提供了一個(gè)簡單的接口,答應(yīng)Servlet Engine來通過任何途徑追蹤一個(gè)用戶的session。

5.1創(chuàng)建一個(gè)session
因?yàn)镠TTP是一種"請(qǐng)求--應(yīng)答"式的協(xié)議。一個(gè)session總是被認(rèn)為是新的,直到有客戶端join進(jìn)來。Join意思是客戶端向Server端返回了session的追蹤信息,指明了session已經(jīng)被建立。
假如客戶端沒有join一個(gè)session,你就不能假定接下來的客戶端響應(yīng)是屬于當(dāng)前的session。
假如有下述情況出現(xiàn)session就被認(rèn)為是新的:
1.客戶端還不知道任何關(guān)于此session的信息。
2. 客戶端選擇不加入session,比如客戶端拒絕接受cookies。
作為一個(gè)servlet開發(fā)者,你必須設(shè)計(jì)Web Application能處理客戶端沒有或不能加入一個(gè)session的情況。Server將保持session對(duì)象一段時(shí)間,這個(gè)時(shí)間可以由Server或Servlet指定。當(dāng)一個(gè)session過期后,Server將釋放session對(duì)象和其它與之綁定在一起的所有對(duì)象。

5.2 綁定對(duì)象到一個(gè)session
假如有需要,比如能幫助你處理應(yīng)用中的數(shù)據(jù)需要,你可能會(huì)綁定一些對(duì)象到一個(gè)session中。你可以綁定任何對(duì)象到HttpSession對(duì)象中,只要用唯一的標(biāo)識(shí)名。任何綁定到session中的對(duì)象對(duì)其它任何一個(gè)處理同一個(gè)session中的請(qǐng)求的Servlet來講,都是可見的。一些對(duì)象需要知道自己什么時(shí)候被放入或移出一個(gè)session,你可以通過HttpSession Binding Listener接口來獲得這些信息。當(dāng)你的servlet在session中存儲(chǔ)或釋放數(shù)據(jù)時(shí),servlet engine檢查對(duì)象是否通過實(shí)現(xiàn)Http Session Binding Listener的類來綁定,假如是,接口中的方法將通知對(duì)象,它已被綁定。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠东县| 太保市| 山东省| 晋宁县| 通化市| 许昌县| 米易县| 辽宁省| 承德市| 旌德县| 股票| 安吉县| 原阳县| 喀什市| 略阳县| 武鸣县| 瑞丽市| 类乌齐县| 信丰县| 福州市| 蓝田县| 镇安县| 威宁| 巴林左旗| 泰宁县| 吴川市| 庆安县| 苗栗县| 大兴区| 茌平县| 蓬莱市| 汕尾市| 清徐县| 牟定县| 华宁县| 仪陇县| 延庆县| 连南| 故城县| 习水县| 涪陵区|