1、自定義類只須要重寫doGet(HttpServletRequest request, HttpServletResponse response) 和doPost(HttpServletRequest request, HttpServletResponse, response)的緣由:less
一、在HttpServlet接口中重寫了父類的service(ServletRequest request, ServletResponse response),在這裏面主要完成了將父類的request和response對象轉化成專門用於處理HTTP請求響應的HttpServletRequest和HttpServletResponse對象,而後再調用一個重載的service方法,該方法接收HttpServletRequest和HttpServletResponse對象:spa
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方法中,調用了doGet(HttpServletRequest request, HttpServletResponse)和doPost(HttpServletRequest request, HttpServletResponse),用於處理Get和Post請求和響應:rest
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } }
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_get_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg); } else { resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg); } }
由上可知,Servlet引擎在處理用戶請求時所調用的service(ServletRequest req, ServletResponse rep)最終會執行doGet和doPost方法中的代碼完成。這就是在自定義的Servlet類中,只要繼承了HttpServlet就只須要重寫doGet和doPost便可。code
2、Servlet的生命週期:對象
一、加載和實例化Servlet對象:由Servlet窗口負責加載Servlet,當Servlet窗口啓動或是檢測到須要這個Servlet響應第一個請求時,將加載這個Servlet。加載的方式是經過反射的API去調用Servelet的無參構造方法完成,因此在自定義的Servlet中不該該出現帶參數的構造方法,若是須要定義有參的構造方法,則必定要把無參的也寫出來。blog
二、初始化Servlet對象:調用init()方法完成相應的初始化,如讀取初始化參數、鏈接DB等。繼承
三、處理請求:調用service()方法處理請求。以前一這是init()方法執行成功。接口
四、銷燬Servlet對象:調用detroy()方法。生命週期