僅供參考
1 servlet簡介
Servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解爲後者。
當然,這些都是百度上給的定義;個人還是把servlet看成是符合一定規範的Java類,它繼承自 java.servlet.http.HttpServlet 類(當然,HttpServlet又繼承了 GenericServlet 等等),一般在使用它時,需要重寫其中的 doGet() 或者 doPost() 方法(即service方法)。
servlet 的工作流程:
- 1.客戶端(簡述就是前端)發送請求到服務器
- 2.服務器接收請求並調用servlet,servlet根據接收的請求做出響應並傳遞給服務器
- 3.服務器將響應返回給客戶端
如下圖:
2 servlet的生命週期
現在很多人認爲servlet的生命週期只有三個階段;其實不然,servlet的生命週期有五個階段:
- 加載。當服務器第一次訪問該servlet時,servlet容器會自動加載該servlet.
- 初始化。當servlet被實例化後,servlet會調用
init()
方法初始化這個servlet. - 服務。當瀏覽器訪問servlet的時候,servlet會調用
service()
方法處理請求並做出響應. - 銷燬。當服務器關閉時或者檢測到servlet要從服務器刪除的時候會自動調用
destroy()
方法,讓該servlet實例釋放掉它所佔的資源。一個servlet如果長時間不被使用的話,也會被服務器自動銷燬. - 卸載。當servlet調用完
destroy()
方法後,等待垃圾回收,servlet容器會自動處理該卸載。
以上服務器都指的是Tomcat。
下面通過一個簡單實例認識一下servlet的出生到死亡:
歷程:
1.start Tomcat後,控制檯沒有來自servlet的任何輸出。
2.從瀏覽器中訪問該servlet:
前端顯示:
控制檯輸出:
可見,客戶端訪問該servlet(第一次訪問),服務器實例化該servlet,調用init()
初始化該servlet,同時調用service()
方法提供服務。
3.再次訪問該servlet(從瀏覽器再次訪問):
前端顯示不變;
控制檯輸出:
顯然,再次訪問該servlet時,只調用了 service()
方法。
4.以後訪問該servlet都只調用service()
對請求進行處理。
5.直到關閉服務器(關閉Tomcat)時:
可見,當關閉服務器時,servlet調用destroy()
方法銷燬該servlet.
以上就是servlet的一個完整的生命週期。
ServletConfig對象
ServletConfig對象主要用於加載servlet的初始化參數,在一個web應用中可以存在多個ServletConfig對象(一個servlet對應一個ServletConfig對象)。
簡單來說ServletConfig對象的作用就是 通過此對象讀取web.xml中配置的初始化參數。通過web.xml存取初始化參數可以提高程序的靈活性【如果需要更變servlet的初始化參數,只需要更改web.xml文件即可】
1.看看servlet是如何創建和獲得這個ServletConfig對象:
創建:在實例化該servlet時創建
看看之前的init()
方法,是不是有一個ServletConfig config
參數呢!一般來說,init()
是繼承GenericServlet得到的(GenericServlet是HttpServlet的父類):如圖
ServletConfig對象在GenericServlet中的init()
方法中創建。
獲得:直接從繼承自GenericServlet直接獲取ServletConfig對象,即this.config
或者getServletConfig()
2.那麼我們如何來使用它呢??!!
使用(此處需要注意區分配置驅動和註解驅動,這裏我使用的是配置驅動):
web.xml文件:添加了兩個參數,修改了驅動方式
服務器(Tomcat)加載程序時讀取web.xml配置文件時把<init-param>
中的參數封裝到ServletConfig對象中,然後調用init方法傳給ServletConfig對象。
servlet:需要注意的是,去除註解。
結果:控制檯輸出(在瀏覽器訪問該servlet之後)
3.ServletConfig對象常用API:
- getServletConfig() 獲取ServletConfig對象
- getInitParameter(String name) 根據參數名獲取參數值
- getInitParameterNames() 獲取在web.xml文件配置的全部參數
- getServletName() 獲得該servlet的名稱
- getServletContext() 獲取servlet上下文對象
ServletContext對象
ServletContext對象,也叫做servlet的上下文對象。代表當前的web站點。一個web程序中只能有一個ServletContext對象。
ServletContext對象的作用:
- ServletContext對象代表着當前web站點,所有servlet都共享着一個ServletContext對象,所以servlet之間可以通過ServletContext對象進行通訊。
- ServletConfig對象獲取的是配置的是單個servlet的參數信息,ServletContext對象獲取的是配置整個web站點的參數信息。
- 利用ServletContext對象讀取web站點的資源文件。
- 實現servlet的轉發【用ServletContext對象轉發不多,主要使用request/response轉發】
1.看看是如何創建和獲取ServletContext對象!!
創建:加載web程序時創建ServletContext對象(即服務器啓動開始就會創建一個唯一的ServletContext對象)。
獲得:從ServletConfig對象的getServletContext()
方法可以獲得ServletContext對象。
2.ServletContext對象的使用
注:設置ServletContext對象域的參數需要在web.xml重新設置
獲取ServletContext對象域的參數和轉發:
web.xml修改:
服務器(Tomcat)加載程序時創建ServletContext對象並讀取web.xml配置文件時把<context-param>
中的參數封裝到ServletContext對象中。
servlet:
Test03Servlet:
Test02Servlet:
結果:控制檯輸出
瀏覽器顯示:
訪問的Test03Servlet,經過Test03Servlet的context.getRequestDispatcher("/Test02Servlet").forward(request, response);;
轉發到Test02Servlet。
實現servlet之間的通信:
Test03Servlet:
//通信
String value = "asd";
context.setAttribute("name", value);
Test02Servlet:
//通信
String name = (String) context.getAttribute("name");
System.out.println(name);
結果:控制檯輸出
讀取資源文件:
Test03Servlet:
//讀取web程序上的資源
InputStream in = context.getResourceAsStream("1.jpg");
System.out.println(in);
結果:控制檯輸出
表示流得到了資源。
注:讀取資源時特別需要注意的是資源在web項目中放置的路徑:該path默認WebContent爲其讀取的根目錄。
3.ServletContext對象常用API
- getContextPath() 獲得當前web程序的路徑
- getInitParameter(String name) 根據參數名獲取參數值
- getInitParameterNames() 獲取在web.xml文件配置的全部參數
- setAttribute(String name,Object object) 創建ServletContext對象域的參數,第一個參數是關鍵字,第二個參數是你要存儲的對象
- getAttribute(String name) 根據關鍵字獲取ServletContext對象域對應的參數
- removeAttribute(String name) 刪除該關鍵字的ServletContext對象域對應的參數
- getRealPath(String path) 獲取當前web程序的資源
- getResourceAsStream(String path) 以流的形式獲取當前web程序的資源
- getRequestDispather(String path) 轉發(和請求轉發類似)