Servlet -doGet() doPost()原理


一、自定義類只需要重寫doGet(HttpServletRequest request, HttpServletResponse response) 和doPost(HttpServletRequest request, HttpServletResponse, response)的原因:

1、在HttpServlet接口中重寫了父類的service(ServletRequest request, ServletResponse response),在這里面主要完成了將父類的request和response對象轉化成專門用於處理HTTP請求響應的HttpServletRequest和HttpServletResponse對象,然后再調用一個重載的service方法,該方法接收HttpServletRequest和HttpServletResponse對象:

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

2、在重載的service方法中,調用了doGet(HttpServletRequest request, HttpServletResponse)和doPost(HttpServletRequest request, HttpServletResponse),用於處理Get和Post請求和響應:

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即可。

 

二、Servlet的生命周期:

1、加載和實例化Servlet對象:由Servlet窗口負責加載Servlet,當Servlet窗口啟動或是檢測到需要這個Servlet響應第一個請求時,將加載這個Servlet。加載的方式是通過反射的API去調用Servelet的無參構造方法完成,所以在自定義的Servlet中不應該出現帶參數的構造方法,如果需要定義有參的構造方法,則一定要把無參的也寫出來。

2、初始化Servlet對象:調用init()方法完成相應的初始化,如讀取初始化參數、連接DB等。

3、處理請求:調用service()方法處理請求。之前一這是init()方法執行成功。

4、銷毀Servlet對象:調用detroy()方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM