Servlet工作流程


Servlet是如何工作的?

了解servlet如何工作對了解servlet內部工作流程很重要。 在這裡,我們將以第一個servlet程式來講解它的內部細節。

伺服器檢查servlet是否為第一次被請求

如果是第一次被請求,則 -

  • 載入servlet類。
  • 範例化servlet類。
  • 呼叫init方法傳遞ServletConfig物件

如果不是第一次被請求,則 -

  • 呼叫service方法傳遞請求和響應物件

Web容器在需要刪除servlet時呼叫destroy方法,例如:在停止伺服器或取消部署專案時。

Web容器如何處理servlet請求?

Web容器負責處理請求。下面來看看看它如何處理請求。

  • 將請求與web.xml檔案中的servlet進行對映。
  • 為請求建立請求和響應物件
  • 呼叫執行緒上的service方法
  • 公共service方法內部呼叫受保護的service方法
  • 受保護的service方法根據請求的型別呼叫doGet方法。
  • doGet方法生成響應,並將其傳遞給用戶端。
  • 傳送響應後,Web容器將刪除請求和響應物件。執行緒包含線上程池中或刪除取決於伺服器實現。

在公共service方法中寫什麼?

公共service方法將ServletRequest物件轉換為HttpServletRequest型別和ServletResponse物件轉為HttpServletResponse型別。然後呼叫傳遞這些物件的service方法。下面來看看內部程式碼:

public void service(ServletRequest req, ServletResponse res)  
        throws ServletException, IOException  
{  
        HttpServletRequest request;  
        HttpServletResponse response;  
        try  
        {  
            request = (HttpServletRequest)req;  
            response = (HttpServletResponse)res;  
        }  
        catch(ClassCastException e)  
        {  
            throw new ServletException("non-HTTP request or response");  
        }  
        service(request, response);  
}

在受保護的service方法中編寫什麼?

受保護的service方法檢查請求的型別,如果請求型別為get,則呼叫doGet方法,如果請求型別為post,則呼叫doPost方法。下面來看看內部程式碼:

protected void service(HttpServletRequest req, HttpServletResponse resp)  
        throws ServletException, IOException  
{  
    String method = req.getMethod();  
    if(method.equals("GET"))  
    {  
        long lastModified = getLastModified(req);  
        if(lastModified == -1L)  
        {  
            doGet(req, resp);  
        }   
        ....  
        //rest of the code  
    }  
}