【JavaWeb學習】servlet及生命週期

servlet介紹

servlet是一個運行在web服務器上的小Java程序,Servlet接收來自web客戶端的請求並響應,通常通過http協議。

你可以繼承javax.servlet.GenericServlet普通的servlet或者javax.servlet.http.HttpServlet一個http servlet

servlet生命週期

servlet定義了五個方法,說到這5個方法就要先說一下servlet的生命週期了。

servlet在客戶端第一次調用的時候創建,創建時會調用init方法,然後執行service方法,當再次有請求該servlet時,不需要重新創建,也就是servlet是單例的,會存在線程安全問題,所以不建議在servlet中定義類變量,而要定義局部變量。那麼servlet什麼時候銷燬呢?servlet實例會常駐內存當中,除非重新啓動了服務器,servlet會通過垃圾回收,並且調用destory方法。

  • init(ServletConfig config):servlet容器一旦創建了servelt就會創建調用init,並把包含servlet的配置和初始化信息的ServletConfig 傳遞給init
  • ServletConfig getServletConfig():返回ServletConfig,包含了servlet初始化參數和啓動參數
  • service:接收並響應web客戶端的方法
  • getServletInfo: 返回servlet的信息,例如作者,版本號,版權
  • destroy:servlet銷燬方法。

servlet繼承圖

在這裏插入圖片描述
Servlet是一個接口,而GenericServlet定義了一個普通,無協議依賴的servlet.當然你可以繼承HttpServlet來實現一個基於HTTP協議的servlet.GenericServlet繼承了ServletConfig接口和Servlet接口。GenericServlet讓寫servelt變得更加容易,它提供了最簡單版本的生命週期方法,init方法和destory方法。以及定義在ServletConfig接口裏的方法。如果繼承該類,那麼需要你重寫service方法。

HttpServlet提供了適用與web網站的servlet.子類必須重寫至少一個方法,doGet和doPost等,分別對應http請求的get和post方法。繼承該類就無需重寫service方法,service方法已經根據標準的HTTP請求方法把請求分發給具體的doGet等方法。由於Servlet是單實例,線程安全需謹記。

搭建實例

新建一個servlet,讓其直接繼承HttpServlet

public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LoginServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.print("get");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

然後在web.xml中配置這個servlet,以變讓web容器能否找到它。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>HelloWord</display-name>
	<servlet>
		<servlet-name>login</servlet-name>
		<servlet-class>com.controller.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>login</servlet-name>
		<url-pattern>/login</url-pattern>
	</servlet-mapping>
</web-app>

pattern>/login


<url-pattern>是請求路徑,支持通配符\*進行模糊匹配,\*可以匹配任意的字符。然後匹配成功後,找到對應的servlet名稱,根據這個servlet名稱找到對應的servlet類,並構建servlet.注意,前面我們說過servlet只有第一次訪問的時候纔會構建,然後一直存在於內存中,知道web容器重啓才清除。

#### 參考文章
[代理設計模式](http://c.biancheng.net/view/1359.html)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章