<servlet></servlet> 在向servlet或JSP頁面制定初始化參數(shù)或定制URL時(shí),必須首先命名servlet或JSP頁面撒璧。Servlet元素就是用來完成此項(xiàng)任務(wù)的答朋。?
<servlet-mapping></servlet-mapping> 服務(wù)器一般為servlet提供一個(gè)缺省的URL:http://host/webAppPrefix/servlet/ServletName津辩。?但是,常常會(huì)更改這個(gè)URL施无,以便servlet可以訪問初始化參數(shù)或更容易地處理相對(duì)URL辉词。在更改缺省URL時(shí),使用servlet-mapping元素猾骡。?
首頁: 用welcome-file標(biāo)簽添加主頁较屿,逐級(jí)向下找
<welcome-file-list>
? ? <welcome-file>index.jsp</welcome-file>
? </welcome-file-list>
<load-on-startup> 8</load-on-startup>? //servlet初始化時(shí)的加載優(yōu)先級(jí),int數(shù)值越小越優(yōu)先卓练。
Servlet的生命周期包含了下面4個(gè)階段:
1.加載和實(shí)例化
2.初始化
3.請(qǐng)求處理
4.服務(wù)終止
Web服務(wù)器在與客戶端交互時(shí)Servlet的工作過程是:
1.?????在客戶端對(duì)web服務(wù)器發(fā)出請(qǐng)求
2.???? web服務(wù)器接收到請(qǐng)求后將其發(fā)送給Servlet
3.???? Servlet容器為此產(chǎn)生一個(gè)實(shí)例對(duì)象并調(diào)用ServletAPI中相應(yīng)的方法來對(duì)客戶端HTTP請(qǐng)求進(jìn)行處理,然后將處理的響應(yīng)結(jié)果返回給WEB服務(wù)器.
4.???? web服務(wù)器將從Servlet實(shí)例對(duì)象中收到的響應(yīng)結(jié)構(gòu)發(fā)送回客戶端.
servlet的生命周期:
1.加載和實(shí)例化
Servlet容器負(fù)責(zé)加載和實(shí)例化Servlet隘蝎。當(dāng)Servlet容器啟動(dòng)時(shí),或者在容器檢測(cè)到需要這個(gè)Servlet來響應(yīng)第一個(gè)請(qǐng)求時(shí)襟企,創(chuàng)建Servlet實(shí)例嘱么。當(dāng)Servlet容器
啟動(dòng)后,它必須要知道所需的Servlet類在什么位置顽悼,Servlet容器可以從本地文件系統(tǒng)曼振、遠(yuǎn)程文件系統(tǒng)或者其他的網(wǎng)絡(luò)服務(wù)中通過類加載器加載Servlet類几迄,
成功加載后,容器創(chuàng)建Servlet的實(shí)例冰评。因?yàn)槿萜魇峭ㄟ^Java的反射API來創(chuàng)建Servlet實(shí)例映胁,調(diào)用的是Servlet的默認(rèn)構(gòu)造方法(即不帶參數(shù)的構(gòu)造方法),所
以我們?cè)诰帉慡ervlet類的時(shí)候甲雅,不應(yīng)該提供帶參數(shù)的構(gòu)造方法解孙。
2.初始化
在Servlet實(shí)例化之后,容器將調(diào)用Servlet的init()方法初始化這個(gè)對(duì)象抛人。初始化的目的是為了讓Servlet對(duì)象在處理客戶端請(qǐng)求前完成一些初始化的工作弛姜,
如建立數(shù)據(jù)庫的連接,獲取配置信息等妖枚。對(duì)于每一個(gè)Servlet實(shí)例廷臼,init()方法只被調(diào)用一次。在初始化期間绝页,Servlet實(shí)例可以使用容器為它準(zhǔn)備的
ServletConfig對(duì)象從Web應(yīng)用程序的配置信息(在web.xml中配置)中獲取初始化的參數(shù)信息荠商。在初始化期間,如果發(fā)生錯(cuò)誤续誉,Servlet實(shí)例可以拋出
ServletException異忱趁唬或者UnavailableException異常來通知容器。ServletException異常用于指明一般的初始化失敗屈芜,例如沒有找到初始化參數(shù)郊愧;而
UnavailableException異常用于通知容器該Servlet實(shí)例不可用朴译。例如井佑,數(shù)據(jù)庫服務(wù)器沒有啟動(dòng),數(shù)據(jù)庫連接無法建立眠寿,Servlet就可以拋出
UnavailableException異常向容器指出它暫時(shí)或永久不可用躬翁。
I.如何配置Servlet的初始化參數(shù)?
?? 在web.xml中該Servlet的定義標(biāo)記中盯拱,比如:
TimeServlet
com.allanlxf.servlet.basic.TimeServlet
user
username
blog
http://盒发。。狡逢。
配置了兩個(gè)初始化參數(shù)user和blog它們的值分別為username和http://宁舰。。奢浑。蛮艰, 這樣以后要修改用戶名和博客的地址不需要修改Servlet代碼,只需修改配置文件即可雀彼。
II.如何讀取Servlet的初始化參數(shù)壤蚜?
?????? ServletConfig中定義了如下的方法用來讀取初始化參數(shù)的信息:
?????? public String getInitParameter(String name)
參數(shù):初始化參數(shù)的名稱即寡。
返回:初始化參數(shù)的值,如果沒有配置袜刷,返回null聪富。
III.init(ServletConfig)方法執(zhí)行次數(shù)
?????? 在Servlet的生命周期中,該方法執(zhí)行一次著蟹。
IV.init(ServletConfig)方法與線程
?????該方法執(zhí)行在單線程的環(huán)境下墩蔓,因此開發(fā)者不用考慮線程安全的問題。
V.init(ServletConfig)方法與異常
???該方法在執(zhí)行過程中可以拋出ServletException來通知Web服務(wù)器Servlet實(shí)例初始化失敗草则。一旦ServletException拋出钢拧,Web服務(wù)器不會(huì)將客戶端請(qǐng)求交給該Servlet實(shí)例來處理,而是報(bào)告初始化失敗異常信息給客戶端炕横,該Servlet實(shí)例將被從內(nèi)存中銷毀源内。如果在來新的請(qǐng)求,Web服務(wù)器會(huì)創(chuàng)建新的Servlet實(shí)例份殿,并執(zhí)行新實(shí)例的初始化操作
3.請(qǐng)求處理
Servlet容器調(diào)用Servlet的service()方法對(duì)請(qǐng)求進(jìn)行處理膜钓。要注意的是,在service()方法調(diào)用之前卿嘲,init()方法必須成功執(zhí)行颂斜。在service()方法中,
Servlet實(shí)例通過ServletRequest對(duì)象得到客戶端的相關(guān)信息和請(qǐng)求信息拾枣,在對(duì)請(qǐng)求進(jìn)行處理后沃疮,調(diào)用ServletResponse對(duì)象的方法設(shè)置響應(yīng)信息。在service
()方法執(zhí)行期間梅肤,如果發(fā)生錯(cuò)誤司蔬,Servlet實(shí)例可以拋出ServletException異常或者UnavailableException異常姨蝴。如果UnavailableException異常指示了該實(shí)
例永久不可用俊啼,Servlet容器將調(diào)用實(shí)例的destroy()方法,釋放該實(shí)例左医。此后對(duì)該實(shí)例的任何請(qǐng)求授帕,都將收到容器發(fā)送的HTTP 404(請(qǐng)求的資源不可用)響應(yīng)
。如果UnavailableException異常指示了該實(shí)例暫時(shí)不可用浮梢,那么在暫時(shí)不可用的時(shí)間段內(nèi)跛十,對(duì)該實(shí)例的任何請(qǐng)求,都將收到容器發(fā)送的HTTP 503(服務(wù)器暫
時(shí)忙秕硝,不能處理請(qǐng)求)響應(yīng)芥映。
I.?service()方法的職責(zé)
???? service()方法為Servlet的核心方法,客戶端的業(yè)務(wù)邏輯應(yīng)該在該方法內(nèi)執(zhí)行,典型的服務(wù)方法的開發(fā)流程為:
??? 解析客戶端請(qǐng)求-〉執(zhí)行業(yè)務(wù)邏輯-〉輸出響應(yīng)頁面到客戶端
II.service()方法與線程
???? 為了提高效率屏轰,Servlet規(guī)范要求一個(gè)Servlet實(shí)例必須能夠同時(shí)服務(wù)于多個(gè)客戶端請(qǐng)求颊郎,即service()方法運(yùn)行在多線程的環(huán)境下,Servlet開發(fā)者必須保證該方法的線程安全性霎苗。
III.service()方法與異常
service()方法在執(zhí)行的過程中可以拋出ServletException和IOException姆吭。其中ServletException可以在處理客戶端請(qǐng)求的過程中拋出,比如請(qǐng)求的資源不可用唁盏、數(shù)據(jù)庫不可用等内狸。一旦該異常拋出,容器必須回收請(qǐng)求對(duì)象厘擂,并報(bào)告客戶端該異常信息昆淡。IOException表示輸入輸出的錯(cuò)誤,編程者不必關(guān)心該異常刽严,直接由容器報(bào)告給客戶端即可昂灵。
編程注意事項(xiàng)說明:
1) 當(dāng)Server Thread線程執(zhí)行Servlet實(shí)例的init()方法時(shí),所有的Client Service Thread線程都不能執(zhí)行該實(shí)例的service()方法舞萄,更沒有線程能夠執(zhí)行該實(shí)例的destroy()方法眨补,因此Servlet的init()方法是工作在單線程的環(huán)境下,開發(fā)者不必考慮任何線程安全的問題倒脓。
2) 當(dāng)服務(wù)器接收到來自客戶端的多個(gè)請(qǐng)求時(shí)撑螺,服務(wù)器會(huì)在單獨(dú)的Client Service Thread線程中執(zhí)行Servlet實(shí)例的service()方法服務(wù)于每個(gè)客戶端。此時(shí)會(huì)有多個(gè)線程同時(shí)執(zhí)行同一個(gè)Servlet實(shí)例的service()方法崎弃,因此必須考慮線程安全的問題甘晤。
3) 請(qǐng)大家注意,雖然service()方法運(yùn)行在多線程的環(huán)境下饲做,并不一定要同步該方法线婚。而是要看這個(gè)方法在執(zhí)行過程中訪問的資源類型及對(duì)資源的訪問方式。分析如下:
???? i. 如果service()方法沒有訪問Servlet的成員變量也沒有訪問全局的資源比如靜態(tài)變量艇炎、文件酌伊、數(shù)據(jù)庫連接等腾窝,而是只使用了當(dāng)前線程自己的資源缀踪,比如非指向全局資源的臨時(shí)變量、request和response對(duì)象等虹脯。該方法本身就是線程安全的驴娃,不必進(jìn)行任何的同步控制。
????? ii. 如果service()方法訪問了Servlet的成員變量循集,但是對(duì)該變量的操作是只讀操作唇敞,該方法本身就是線程安全的,不必進(jìn)行任何的同步控制。
????? iii. 如果service()方法訪問了Servlet的成員變量疆柔,并且對(duì)該變量的操作既有讀又有寫咒精,通常需要加上同步控制語句。
????? iv. 如果service()方法訪問了全局的靜態(tài)變量旷档,如果同一時(shí)刻系統(tǒng)中也可能有其它線程訪問該靜態(tài)變量模叙,如果既有讀也有寫的操作,通常需要加上同步控制語句鞋屈。
????? v. 如果service()方法訪問了全局的資源范咨,比如文件、數(shù)據(jù)庫連接等厂庇,通常需要加上同步控制語句渠啊。
4.服務(wù)終止
當(dāng)容器檢測(cè)到一個(gè)Servlet實(shí)例應(yīng)該從服務(wù)中被移除的時(shí)候,容器就會(huì)調(diào)用實(shí)例的destroy()方法权旷,以便讓該實(shí)例可以釋放它所使用的資源替蛉,保存數(shù)據(jù)到持久存
儲(chǔ)設(shè)備中。當(dāng)需要釋放內(nèi)存或者容器關(guān)閉時(shí)拄氯,容器就會(huì)調(diào)用Servlet實(shí)例的destroy()方法灭返。在destroy()方法調(diào)用之后,容器會(huì)釋放這個(gè)Servlet實(shí)例坤邪,該實(shí)例
隨后會(huì)被Java的垃圾收集器所回收熙含。如果再次需要這個(gè)Servlet處理請(qǐng)求,Servlet容器會(huì)創(chuàng)建一個(gè)新的Servlet實(shí)例艇纺。
在整個(gè)Servlet的生命周期過程中怎静,創(chuàng)建Servlet實(shí)例、調(diào)用實(shí)例的init()和destroy()方法都只進(jìn)行一次黔衡,當(dāng)初始化完成后蚓聘,Servlet容器會(huì)將該實(shí)例保存在內(nèi)存中,通過調(diào)用它的service()方法盟劫,為接收到的請(qǐng)求服務(wù)夜牡。