Servlet的講解

1.什麼是servlet?

Servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連接器,用Java編寫的服務器端程序,具有獨立於平臺和協議的特性,主要功能在於交互式地瀏覽和生成數據,生成動態Web內容。
狹義的Servlet是指Java語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的類,一般情況下,人們將Servlet理解爲後者。Servlet運行於支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet只用來擴展基於HTTP協議的Web服務器。

2.servlet實現過程:

最早支持 Servlet 技術的是 JavaSoft 的 Java Web Server。此後,一些其它的基於 Java 的 Web Server 開始支持標準的 Servlet API。Servlet 的主要功能在於交互式地瀏覽和修改數據,生成動態 Web 內容。這個過程爲:

1.客戶端發送請求至服務器端;
2.服務器將請求信息發送至 Servlet;
3.Servlet 生成響應內容並將其傳給服務器。響應內容動態生成,通常取決於客戶端的請求;
4.服務器將響應返回給客戶端。
在這裏插入圖片描述

3.servlet實現的三種方式

1.實現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("servlet進來了");

    }

    //生命週期方法:當Servlet被銷燬時執行該方法
    public void destroy() {
        System.out.println("******destroy**********");
    }

    //當停止tomcat時也就銷燬的servlet。
    public ServletConfig getServletConfig() {

        return null;
    }

    public String getServletInfo() {

        return null;
    }
}

請求 http://localhost:8080/web01/demo 發現int() service() 方法都輸出了
第二次請求只輸出了servlet進來了 int()方法只執行一次
在這裏插入圖片描述
關閉服務器tomcat bin目錄下的shutdown.bat 會實現destory()方法
在這裏插入圖片描述
2.繼承 GenericServlet 類 一般很少用

public class ServletDemo2 extends GenericServlet {

    @Override
    public void service(ServletRequest arg0, ServletResponse arg1)
            throws ServletException, IOException {
        System.out.println("servlet進來了");
    }
}

3、繼承 HttpServlet 方法 (常用)

public class ServletDemo3 extends HttpServlet {
   @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        System.out.println("servlet進來了");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doGet(req,resp);
    }
}

4.HttpServlet、GenericServlet、servlet的關係

對於一個 Servlet 類,我們日常最常用的方法是繼承自 HttpServlet 類,提供了 Http 相關的方法,HttpServlet 擴展了 GenericServlet 類,而 GenericServlet 類又實現了 Servlet 類和 ServletConfig 類。

GenericServlet

GenericServlet 是一個抽象類,實現了 Servlet 接口,並且對其中的 init() 和 destroy() 和 service() 提供了默認實現。在 GenericServlet 中,主要完成了以下任務:

將 init() 中的 ServletConfig 賦給一個類級變量,可以由 getServletConfig 獲得;
爲 Servlet 所有方法提供默認實現;
可以直接調用 ServletConfig 中的方法;

abstract class GenericServlet implements Servlet,ServletConfig{
 
   //GenericServlet通過將ServletConfig賦給類級變量
   private trServletConfig servletConfig;
 
   public void init(ServletConfig servletConfig) throws ServletException {

      this.servletConfig=servletConfig;

      /*自定義init()的原因是:如果子類要初始化必須覆蓋父類的init() 而使它無效 這樣
       this.servletConfig=servletConfig不起作用 這樣就會導致空指針異常 這樣如果子類要初始化,
       可以直接覆蓋不帶參數的init()方法 */
      this.init();
   }
   
   //自定義的init()方法,可以由子類覆蓋  
   //init()不是生命週期方法
   public void init(){
  
   }
 
   //實現service()空方法,並且聲明爲抽象方法,強制子類必須實現service()方法 
   public abstract void service(ServletRequest request,ServletResponse response) 
     throws ServletException,java.io.IOException{
   }
 
   //實現空的destroy方法
   public void destroy(){ }
}

HttpServlet

HttpServlet 也是一個抽象類,它進一步繼承並封裝了 GenericServlet,使得使用更加簡單方便,由於是擴展了 Http 的內容,所以還需要使用 HttpServletRequest 和 HttpServletResponse,這兩個類分別是 ServletRequest 和 ServletResponse 的子類。代碼如下:

abstract class HttpServlet extends GenericServlet{
 
   //HttpServlet中的service()
   protected void service(HttpServletRequest httpServletRequest,
                       HttpServletResponse httpServletResponse){
        //該方法通過httpServletRequest.getMethod()判斷請求類型調用doGet() doPost()
   }
 
   //必須實現父類的service()方法
   public void service(ServletRequest servletRequest,ServletResponse servletResponse){
      HttpServletRequest request;
      HttpServletResponse response;
      try{
         request=(HttpServletRequest)servletRequest;
         response=(HttpServletResponse)servletResponse;
      }catch(ClassCastException){
         throw new ServletException("non-http request or response");
      }
      //調用service()方法
      this.service(request,response);
   }
}

我們可以看到,HttpServlet 中對原始的 Servlet 中的方法都進行了默認的操作,不需要顯式的銷燬初始化以及 service(),在 HttpServlet 中,自定義了一個新的 service() 方法,其中通過 getMethod() 方法判斷請求的類型,從而調用 doGet() 或者 doPost() 處理 get,post 請求,使用者只需要繼承 HttpServlet,然後重寫 doPost() 或者 doGet() 方法處理請求即可。

我們一般都使用繼承 HttpServlet 的方式來定義一個 servlet。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章