一
1. sun 提供的一種動(dòng)態(tài)web資源開發(fā)技術(shù).本質(zhì)上就是一段java小程序.可以將Servlet加入到Servlet容器中運(yùn)行.
Servlet容器 -- 能夠運(yùn)行Servlet的環(huán)境就叫做Servlet容器. --- tomcat
web容器 -- 能夠運(yùn)行web應(yīng)用的環(huán)境就叫做web容器 --- tomcat
2.寫一個(gè)類實(shí)現(xiàn)sun公司定義的Servlet接口 將寫好的類配置到tomcat中的web應(yīng)用的web.xml中,(配置對(duì)外訪問路徑)
3.Servlet 的調(diào)用過程/生命周期
4.Servlet 的繼承結(jié)構(gòu)
Servlet接口 -- 定義了Servlet應(yīng)該具有的基 本方法
GenericServlet --通用基本Servlet實(shí)現(xiàn),對(duì)于不常用的方法在這個(gè)實(shí)現(xiàn)類中進(jìn)行了基本的實(shí)現(xiàn),對(duì)于Service設(shè)計(jì)為了抽象 方法,需要子類去實(shí)現(xiàn)
HttpServlet --在通用Servlet的基礎(chǔ)上基于HTTP協(xié)議進(jìn)行了進(jìn)一步的強(qiáng)化:實(shí)現(xiàn)了GenericServlet中的Service方 法,判斷當(dāng)前的請(qǐng)求方式,調(diào)用對(duì)應(yīng)到doXXX方法,這樣一來我們開發(fā)Servlet的過程中只需繼承HttpServlet ,覆蓋具體要處理的doXXX方法 就可以根據(jù)不同的請(qǐng)求方式實(shí)現(xiàn)不同的處理.一般不要覆蓋父類中的Service方法只要覆蓋doGet/doPost就可以了
5.Servlet 的細(xì)節(jié)
一個(gè)<servlet>可以對(duì)應(yīng)多個(gè)<serlvet-mapping>,從而一個(gè)Servlet可以有多個(gè)路徑來訪問
url-partten中的路徑可以使用匹配符號(hào)進(jìn)行配置,但是要注意,只能是/開頭/結(jié)尾或*.后綴這兩種方式
~由于*的引入,有可能一個(gè)路徑被多個(gè)urlpartten匹配,這是優(yōu)先級(jí)判斷條件如下: 哪個(gè)最像找哪個(gè)
*.后綴永遠(yuǎn)匹配級(jí)最低
<serlvet>可以配置<load-on-startup>可以用來指定啟動(dòng)順序
缺省Servlet:如果有一個(gè)Servlet的url-partten被配置為了一根正斜杠,這個(gè)Servlet就變成了缺省Serlvet.其他Servlet 都不
處理的請(qǐng)求,由缺省Servlet來處理. 其實(shí)對(duì)于靜態(tài)資源的訪問就是由缺省Servlet來執(zhí)行 設(shè)置404頁面500頁面等提示頁面也是由缺省Servlet來執(zhí)行 通常我們不會(huì)自己去配置缺省Servlet線程安全問題 由于默認(rèn)情況下Servlet在內(nèi)存中只有一個(gè)對(duì)象,當(dāng)多個(gè)瀏覽器并發(fā)訪問Servlet時(shí)就有可能產(chǎn)生線程安全問題 解決方案:
加鎖--效率降低
SingleThreadModel接口 -- 不能真的防止線程安全問題 最終解決方案:在Servlet中盡量少用類變量,如果一定要用類變量則用鎖來防止線程安全問題,但是要注意鎖住內(nèi)容應(yīng)該是造
成線程安全問題的核心代碼,盡量的少鎖主內(nèi)容,減少等待時(shí)間提高servlet的響應(yīng)速度
二
- ServletConfig -- 代表當(dāng)前Servlet在web.xml中的配置信息
- String getServletName() -- 獲取當(dāng)前Servlet在web.xml中配置的名字
- String getInitParameter(String name) -- 獲取當(dāng)前Servlet指定名稱
的初始化參數(shù)的值 - Enumeration getInitParameterNames() -- 獲取當(dāng)前Servlet所有初始化參數(shù)的名字組成的枚舉
- ServletContext getServletContext() -- 獲取代表當(dāng)前web應(yīng)用的ServletContext對(duì)象
三
ServletContext -- 代表當(dāng)前web應(yīng)用
1.做為域?qū)ο罂梢栽谡麄€(gè)web應(yīng)用范圍內(nèi)共享數(shù)據(jù)
域?qū)ο?在一個(gè)可以被看見的范圍內(nèi)共享數(shù)據(jù)用到對(duì)象
作用范圍:整個(gè)web應(yīng)用范圍內(nèi)共享數(shù)據(jù)
生命周期:當(dāng)服務(wù)器啟動(dòng)web應(yīng)用加載后創(chuàng)建出ServletContext對(duì)象后,域產(chǎn)生。當(dāng)web應(yīng)用被移除出容器或服務(wù)器關(guān)閉,隨著web應(yīng)用 的銷毀域銷毀。
void setAttribute(String,Object);
Object getAttribute(String);
void removeAttribute(String);
2.用來獲取web應(yīng)用的初始化參數(shù)
請(qǐng)求參數(shù) parameter --- 瀏覽器發(fā)送過來的請(qǐng)求中的參數(shù)信息
初始化參數(shù) initparameter --- 在web.xml中為Servlet或
ServletContext配置的初始化時(shí)帶有的基本參數(shù) 域?qū)傩?attribute --- 四大作用于中存取的鍵值對(duì)
3.實(shí)現(xiàn)Servlet的轉(zhuǎn)發(fā) 重定向 : 302+Location
請(qǐng)求轉(zhuǎn)發(fā) : 服務(wù)器內(nèi)不進(jìn)行資源流轉(zhuǎn)
請(qǐng)求轉(zhuǎn)發(fā)是一次請(qǐng)求一次響應(yīng)實(shí)現(xiàn)資源流轉(zhuǎn).請(qǐng)求重定向兩次請(qǐng)求兩次響應(yīng).
4.加載資源文件 在Servlet中讀取資源文件時(shí):
有找不到資源
如果寫相對(duì)路徑和絕對(duì)路徑,由于路徑將會(huì)相對(duì)于程序啟動(dòng)的目錄--在web環(huán)境下,就是tomcat啟動(dòng)的目錄即tomcat/bin--所
如果寫硬盤路徑,可以找到資源,但是只要一換發(fā)布環(huán)境,這個(gè)硬盤路徑很可能是錯(cuò)誤的,同樣不行.
為了解決這樣的問題ServletContext提供了getRealPath方法,在這個(gè)方法中傳入一個(gè)路徑,這個(gè)方法的底層會(huì)在傳入的路徑 前拼接當(dāng)前web應(yīng)用的硬盤路徑從而得到當(dāng)前資源的硬盤路徑,這種方式即使換了發(fā)布環(huán)境,方法的底層也能得到正確的web應(yīng)用的路徑從而永 遠(yuǎn)都是正確的資源的路徑
this.getServletContext().getRealPath("config.properties")
如果在非Servlet環(huán)境下要讀取資源文件時(shí)可以采用類加載器加載文件的方式讀取資源
Service.class.getClassLoader().getResource("../../../config.properties").getPath()
