20160314 Servlet 入門

破玉發表於2016-03-14

一、Servlet
1.sun提供的一種動態web資源開發技術.本質上就是一段java小程式.可以將Servlet加入到Servlet容器中執行.
*Servlet容器 -- 能夠執行Servlet的環境就叫做Servlet容器. --- tomcat
*web容器 -- 能夠執行web應用的環境就叫做web容器 --- tomcat

2.
寫一個類實現sun公司定義的Servlet介面
將寫好的類配置到tomcat中的web應用的web.xml中,(配置對外訪問路徑)

3.Servlet的呼叫過程/生命週期


4.Servlet的繼承結構
Servlet介面 -- 定義了Servlet應該具有的基本方法
|
|--GenericServlet --通用基本Servlet實現,對於不常用的方法在這個實現類中進行了基本的實現,對於Service設計為了抽象方法,需要子類去實現
|
|--HttpServlet --在通用Servlet的基礎上基於HTTP協議進行了進一步的強化:實現了GenericServlet中的Service方法,判斷當前的請求方式,呼叫對應到doXXX方法,這樣一來我們開發Servlet的過程中只需繼承HttpServlet ,覆蓋具體要處理的doXXX方法就可以根據不同的請求方式實現不同的處理.一般不要覆蓋父類中的Service方法只要覆蓋doGet/doPost就可以了

5.Servlet的細節
(1)一個<servlet>可以對應多個<serlvet-mapping>,從而一個Servlet可以有多個路徑來訪問
(2)url-partten中的路徑可以使用*匹配符號進行配置,但是要注意,只能是/開頭/*結尾或*.字尾這兩種方式
~由於*的引入,有可能一個路徑被多個urlpartten匹配,這是優先順序判斷條件如下:
哪個最像找哪個
*.字尾永遠匹配級最低
(3)<serlvet>可以配置<load-on-startup>可以用來指定啟動順序
(4)預設Servlet:如果有一個Servlet的url-partten被配置為了一根正斜槓,這個Servlet就變成了預設Serlvet.其他Servlet 都不處理的請求,由預設Servlet來處理.
其實對於靜態資源的訪問就是由預設Servlet來執行
設定404頁面500頁面等提示頁面也是由預設Servlet來執行
通常我們不會自己去配置預設Servlet
(5)執行緒安全問題
由於預設情況下Servlet在記憶體中只有一個物件,當多個瀏覽器併發訪問Servlet時就有可能產生執行緒安全問題
解決方案:
加鎖--效率降低
SingleThreadModel介面 -- 不能真的防止執行緒安全問題
最終解決方案:在Servlet中儘量少用類變數,如果一定要用類變數則用鎖來防止執行緒安全問題,但是要注意鎖住內容應該是造成執行緒安全問題的核心程式碼,儘量的少鎖主內容,減少等待時間提高servlet的響應速度

二、ServletConfig -- 代表當前Servlet在web.xml中的配置資訊
String getServletName() -- 獲取當前Servlet在web.xml中配置的名字
String getInitParameter(String name) -- 獲取當前Servlet指定名稱的初始化引數的值
Enumeration getInitParameterNames() -- 獲取當前Servlet所有初始化引數的名字組成的列舉
ServletContext getServletContext() -- 獲取代表當前web應用的ServletContext物件

三、ServletContext -- 代表當前web應用
1.做為域物件可以在整個web應用範圍內共享資料
域物件:在一個可以被看見的範圍內共享資料用到物件

作用範圍:整個web應用範圍內共享資料
生命週期:當伺服器啟動web應用載入後建立出ServletContext物件後,域產生。當web應用被移除出容器或伺服器關閉,隨著web應用的銷燬域銷燬。

void setAttribute(String,Object);
Object getAttribute(String);
void removeAttribute(String);

2.用來獲取web應用的初始化引數


請求引數 parameter --- 瀏覽器傳送過來的請求中的引數資訊
初始化引數 initparameter --- 在web.xml中為Servlet或ServletContext配置的初始化時帶有的基本引數
域屬性 attribute --- 四大作用於中存取的鍵值對

3.實現Servlet的轉發

重定向 : 302+Location
請求轉發 : 伺服器內不進行資源流轉

*請求轉發是一次請求一次響應實現資源流轉.請求重定向兩次請求兩次響應.

4.載入資原始檔
在Servlet中讀取資原始檔時:
如果寫相對路徑和絕對路徑,由於路徑將會相對於程式啟動的目錄--在web環境下,就是tomcat啟動的目錄即tomcat/bin--所有找不到資源
如果寫硬碟路徑,可以找到資源,但是隻要一換髮布環境,這個硬碟路徑很可能是錯誤的,同樣不行.
為了解決這樣的問題ServletContext提供了getRealPath方法,在這個方法中傳入一個路徑,這個方法的底層會在傳入的路徑前拼接當前web應用的硬碟路徑從而得到當前資源的硬碟路徑,這種方式即使換了釋出環境,方法的底層也能得到正確的web應用的路徑從而永遠都是正確的資源的路徑
this.getServletContext().getRealPath("config.properties")

如果在非Servlet環境下要讀取資原始檔時可以採用類載入器載入檔案的方式讀取資源
Service.class.getClassLoader().getResource("../../../config.properties").getPath()

相關文章