關於servlet的理解

恆222發表於2019-04-22

介紹

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.servletjavax.servlet.http 包建立,它裡面提供了五個方法:

  1. init(ServletConfig)
  2. getServletConfig()
  3. service(ServletRequest,ServletResponse)
  4. getServletInfo()
  5. 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。

相關文章