Servlet

Servlet 是個特殊的Java 類,這個Java 類必須繼承HttpServlet 。每個Servlet 可以響應客戶端的請求。Servlet 提供不同的方法用於響應客戶端請求。
• doGet: 用於響應客戶端的get 請求。
• doPost: 用於響應客戶端的post 請求。
• doPut: 用於響應客戶端的put 請求。
• doDelete: 用於響應客戶端的delete 請求。
事實上,客戶端的請求通常只有get 和post 兩種; Servlet 爲了響應這兩種請求,必須重寫doGet 和doPost 兩個方法。如果Servlet 爲了響應四個方法,則需要同時重寫上面的四個方法。
大部分時候, Servlet 對於所有請求的響應都是完全一樣的。此時,可以採用重寫一個方法來代替上面的幾個方法, Servlet 只需重寫service 方法即可響應客戶端的所有請求。
另外, HttpServlet 還包含兩個方法。
• init(ServletConfig config): 創建Servlet 實例時,調用的初始化方法。
• destroy(): 銷燬Servlet 實例時,自動調用的資源回收方法。
通常無須重寫init()和destroy()兩個方法,除非需要在初始化Servlet 時,完成某些資源初始化的方法,才考慮重寫init 方法。如果需要在銷燬Servlet 之前,先完成某些資源的回收,比如關閉數據庫連接等,才需要重寫destroy 方法。
注意:如果重寫了init(ServletConfig config)方法,則應在重寫該方法的第一行調用super.init(config) 。該方法將調用HttpServlet 的init 方法。
Servlet 和JSP 的區別在於:
• Servlet 中沒有內置對象,原來JSP 中的內置對象都必須通過HttpServletRequest對象,或由HttpServletResponse 對象生成;
• 對於靜態的HTML 標籤, Servlet 都必須使用頁面輸出流逐行輸出。
JSP 是Servlet 的一種簡化,使用JSP 只需要完成程序員需要輸出到客戶端的內容,至於JSP 中的Java 腳本如何鑲嵌到一個類中,由JSP 容器完成。而Servlet 則是個完整的Java 類,這個類的service 方法用於生成對客戶端的響應。

編輯好的Servlet 源文件並不能響應用戶請求,還必須將其編譯成class 文件。將編譯後的FirstServlet. class 文件放在WEB-INF/classes 路徑下,如果Servlet 有包,則還應該將class 文件放在對應的包路徑下。
爲了讓Servlet 能響應用戶請求,還必須將Servlet 配置在Web 應用中。配置Servlet時,需要修改web.xrnl 文件。
配置Servlet 需要配置兩個部分。
·配置Servlet 的名字:對應web.xml 文件中的<servlet/>元素。
·配置Servlet 的URL: 對應web.xml 文件中的<servlet-mapping/>元素。
因此,配置一個能響應客戶請求的Servlet ,至少需要配置兩個元素,例:
<! -- 配置Servlet 的名字-->
<servlet>
<! -- 指定Servlet 的名字-->
<servlet-name>firstServlet</servlet-name>
<! -- 指定Servlet 的實現類--〉
<servlet-class>lee.FirstServlet</servlet-class>
</servlet>
<! -- 配置Servlet 的URL-->
<servlet-mapping>
<!--指定Servlet 的名字-->
<servlet-name>firstServlet</servlet-name>
<!--指定Servlet 映射的URL 地址-->
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>


Servlet 的創建有兩個選擇。
·客戶端請求對應的Servlet 時,創建Servlet 實例:大部分的Servlet 都是這種Servlet 。
• Web 應用啓動時,立即創建Servlet 實例:即load-on-startup Servlet 。
每個Servlet 的運行都遵循如下生命週期。
(1)創建Servlet 實例。
(2) Web 容器調用Servlet 的init 方法,對Servlet 進行初始化。
(3) Servlet 初始化後,將一直存在於容器中,用於響應客戶端請求。如果客戶端有get 請求,容器調用Servlet 的doGet 方法處理並響應請求。對於不同的請求,有不同的處理方法,或者統一使用service 方法處理來響應用戶請求。
(4) Web 容器角色銷燬Servlet 時,調用Servlet 的destroy 方法,通常在關閉Web容器之時銷燬Servlet。
Servlet生命週期:
開始-->創建實例完成-->初始化-->響應客戶端請求-->被銷燬-->結束
在標準的MVC 模式中, Servlet 僅作爲控制器使用。
M: Model,即模型,對應JavaBean 。
V: View ,即視圖,對應JSP 頁面。
C: Controller,即控制器,對應Servlet。

load-on-startup Servlet
Servlet 的實例化有兩個時機:用戶請求之時,或應用啓動之時。應用啓動時就啓動的Servlet 通常是用於某些後臺服務的Servlet ,或者攔截很多請求的Servlet; 這種Servlet 通常作爲應用的基礎Servlet 使用,提供重要的後臺服務。
如果需要Web 應用啓動時,可使用load-on-startup 元素完成Servlet 的初始化。load-on-startup 元素只接收一個整型值,這個整型值越小, Servlet 就越優先初始化。
<servlet>
<! -- Servlet 名-->
<servlet-name>timerServlet</servlet-name>
<!-- Servlet 的實現類-->
<servlet-class>lee.TimerServlet</servlet-class>
<!-- 配置應用啓動時,創建Servlet 實例-->
<load-on-startup>l</load-on-startup>
</servlet>
該Servlet 將一直作爲後臺服務執行。

訪問Servlet 的配置參數:
訪問Servlet 配置參數要通過ServletConfig 類的實例完成, ServletConfig提供如下
方法。
• java.lang.String getInitParameter(java.lang.String name): 用於獲取初始化參數。
注意: JSP 的內直對象config 就是此處的ServletConfig
//獲取ServletConfig對象
ServletConfig config = getServletConfig();
//通過ServletConfig對象獲取配置參數: dirver
String driver = config.getInitParameter("driver");

Servlet 訪問配置參數的方式非常類似於application方式。只是application 的配置參
數對整個Web 應用有效,而Servlet 配置參數僅對該Servlet 有效,下面是配置該Servlet的配置片段:
<servlet>
<!--配置Servlet 名-->
<servlet-name>testServlet</servlet-name>
<!--指定Servlet 的實現類-->
<servlet-class>lee.TestServlet</servlet-class>
<!--配置Servlet 的初始化參數: driver-->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!--確定Servlet 名-->
<servlet-name>testServlet</servlet-name>
<!--配置Servlet 映射的URL-->
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章