介紹
Servlet(Server Applet),全稱Java Servlet,未有中文譯文。是用Java編寫的伺服器端程式。其主要功能在於互動式地瀏覽和修改資料,生成動態Web內容。狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的類,一般情況下,人們將Servlet理解為後者。
Servlet執行於支援Java的應用伺服器中。從實現上講,Servlet可以響應任何型別的請求,但絕大多數情況下Servlet只用來擴充套件基於HTTP協議的Web伺服器。
其實我們可以將servlet想簡單一點,不用考慮那麼多。
它就是用Java語言編寫的一套介面,介於瀏覽器(HTTP客戶端)和資料庫(HTTP伺服器)之間(實際存在伺服器上),用於處理HTTP請求。
程式碼編寫好之後,還不能直接使用,需要部署到一個servlet容器(比如tomcat)。由這個容器接收請求,並分發給對應的servlet去處理,最後再由容器響應。
生命週期
servlet部署在容器中,他的生命週期也是由容器管理的。需要注意的是容器啟動的時候,servlet不一定被載入,servlet只在收到請求的時候才會被載入和例項化。而這之後,如果沒有特殊情況(比如容器記憶體回收),那麼servlet例項會直到伺服器關閉才被銷燬。
servlet可以由 javax.servlet 和 javax.servlet.http 包建立,它裡面提供了五個方法:
- init(ServletConfig)
- getServletConfig()
- service(ServletRequest,ServletResponse)
- getServletInfo()
- destroy()
我們重點關注 1、3、5 三個方法。
init()是初始化方法,只在servlet第一次接受請求時執行一次,與之相似的是destroy()方法,只在servlet銷燬時執行才執行一次,這兩個方法在一個servlet例項中都只執行一次。
service()方法就是處理HTTP請求的方法,每次請求的時候都會呼叫這個方法,這個方法可以被執行多次。
建立方式
這裡講解三種建立servlet的方式
- 第一種:實現Servlet介面
public class ServletDemo1 implements Servlet {
//public ServletDemo1(){}
//當Servlet第一次被建立物件時執行該方法,該方法在整個生命週期中只執行一次
public void init(ServletConfig arg0) throws ServletException {
System.out.println("=======init=========");
}
//對客戶端響應的方法,該方法會被執行多次,每次請求該servlet都會執行該方法
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("hehe");
}
//當Servlet被銷燬時執行該方法
public void destroy() {
System.out.println("******destroy**********");
}
//當停止tomcat時銷燬的servlet。
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
複製程式碼
- 第二種:繼承GenericServlet 類
這種方法比較少用
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("heihei");
}
}
複製程式碼
- 第三種:繼承HttpServlet 類
最常用的方法
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("haha");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("ee");
doGet(req,resp);
}
}
複製程式碼
關於HttpServlet、GenericServlet 和 Servlet 的關係是這樣的:
GenericServlet 是 Servlet 的一個子類抽象類,對其中的 init() 和 destroy() 提供了預設實現,可以直接呼叫 ServletConfig 中的方法。繼承這個類必須重寫service()方法。
HttpServlet 也是一個抽象類,它進一步繼承並封裝了 GenericServlet,由於這個類還擴充套件了HTTP的內容,因此還需要傳入HttpServletRequest 和 HttpServletResponse兩個引數。
這裡需要了解的是,JSP也是HttpServlet的擴充套件,只不過是使用了HTML的書寫格式,在其中加入Java程式碼。也就是說JSP也是一個servlet。