java進階知識--Servlet技術
一、初識Servlet
1.1 概述
Servlet就是一個用java語言編寫的介面,定義了Java類被瀏覽器訪問到的規則。
Servlet技術是應用到web伺服器端的擴充套件技術,對http請求進行處理,主要用於處理各種業務邏輯。
注意:1. 對http請求進行處理,實際為servlet介面的實現類HttpServlet提供了處理請求的方法;
2. Servlet的具體細節需要由Servlet容器進行實現,Servlet物件在Servlet容器啟動時被初始化。
1.2 特點
功能強大、可移植、效能高效、安全性高、可擴充套件性好。
1.3 生命週期
1. 建立:執行init方法,只執行一次
* Servlet什麼時候被建立?
* 預設情況下,第一次被訪問時,Servlet被建立
* 可以配置執行Servlet的建立時機,預設下的預設值為-1。
* 在<servlet>標籤下配置
1. 第一次被訪問時建立
* <load-on-startup>的值為負數
2. 在伺服器啟動時建立
* <load-on-startup>的值為0或正整數
* Servlet的init方法,只執行一次,說明一個Servlet在記憶體中只存在一個物件,Servlet是單例的
* 多個使用者同時訪問時,可能存線上程安全問題。
* 解決:儘量不要在Servlet中定義成員變數。即使定義了成員變數,也不要對其修改值。
2. 執行:執行service方法,執行多次
* 每次訪問Servlet時,Service方法都會被呼叫一次。
3. 銷燬:執行destroy方法,只執行一次
* Servlet被銷燬時執行。伺服器關閉時,Servlet被銷燬。
* destroy方法在Servlet被銷燬之前執行,一般用於釋放資源。
* 只有伺服器正常關閉時,才會執行destroy方法。
1.4Servlet的體系結構
|
GenericServlet -- 抽象類
|
HttpServlet -- 抽象類 * GenericServlet:將Servlet介面中其他的方法做了預設空實現,只將service()方法作為抽象
* 將來定義Servlet類時,可以繼承GenericServlet,實現service()方法即可
* HttpServlet:對http協議的一種封裝,簡化操作:
1. 定義類繼承HttpServlet
2. 複寫doGet/doPost方法
二、Servlet配置
2.1web.xml配置
在web.xml中配置,以告知web容器哪一個請求呼叫哪一個Servlet物件處理,對Servlet起到一個註冊的作用。
// 宣告Servlet物件 <servlet> <servlet-name>WfxServlet</servlet-name> --Servlet名稱 <servlet-class>com.wfx.WfxServlet</servlet-class> --Servlet物件的完整位置 </servlet> // 對映Servlet <servlet-mapping> <servlet-name>WfxServlet</servlet-name> --Servlet名稱 <url-pattern>/WfxServlet</url-pattern> --對映訪問URL </servlet-mapping>
執行原理:
1. 當伺服器接收到客戶端瀏覽器的請求後,會解析請求URL路徑,獲取訪問的Servlet的資源路徑;
2. 查詢web.xml檔案,是否有對應的<url-pattern>標籤體內容與資源路徑一致;
3. 如果有,則在找到對應的<servlet-class>全類名;
4. tomcat會將位元組碼檔案載入進記憶體,並且建立其物件;
5. 呼叫其方法。如:service()方法。
2.2Servlet3.0 註解配置
小貼士:
Servlet3.0新特性
①支援註解配置。新增註解@WebServlet、@WebFilter、@WebListener、@WebInitParam等,通過使用註釋就無需在web.xml檔案中對Servlet、過濾器或者監聽器等進行配置。
②對檔案上傳的支援。檔案上傳需兩步:a.新增@MultipartConfig註釋。b.從request物件中獲取Part檔案物件。
③非同步處理:Servlet執行緒將請求交給一個非同步執行緒來執行業務處理,執行緒本身返回至容器,非同步執行緒處理完業務後,可以直接生成響應資料,或者將請求繼續轉發給其他Servlet。
(這樣,Servlet執行緒不再是一直處於阻塞狀態以等待業務邏輯的處理,而是啟動非同步之後可以立即返回。)
非同步處理機制可以應用於Servlet和過濾器兩種元件,那麼如何開啟非同步處理特性?(預設情況下為關閉非同步處理)
==》方法一(配置檔案):<async-supported>true</async-supported>
==》方法二(註解):@WfxServlet和@WfxFilter註釋提供了asyncSupported屬性,預設情況下為false,將其設定成true即可。