servlet篇(一)【servlet簡介+servlet的生命週期+ServletConfig對象和ServletContext對象+常用API】

僅供參考

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) 轉發(和請求轉發類似)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章