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  
    }  
}