在HttpServlet類中,service負責更具http請求的類型分發給各doXxx()方法處理,源碼如下:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod();//根據http請求method的不同作不同處理 if (method.equals("GET")) { //擷取嵌在http請求中的If-Modified-Since參數,這個欄位是瀏覽器最後一次重新整理緩衝的時間,如果第一次請求就沒有 //比較If-Modified-Since參數和lastModified 的新舊,決定是否重新整理瀏覽器緩衝。如果lastModified 使用預設的-1L,總是重新整理。 //If-Modified-Since參數:伺服器制定客戶只想要那些自特定日期以來發生改變的頁面 lastModified :伺服器端返回的東西需要調整的時間點,比如代碼 做了修改,或者別的。 long lastModified = getLastModified(req); if (lastModified == -1L) { doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader("If-Modified-Since"); if (ifModifiedSince < lastModified / 1000L * 1000L) { maybeSetLastModified(resp, lastModified);//重新設定瀏覽器的參數 doGet(req, resp); } else { resp.setStatus(304); } } } else if (method.equals("HEAD")) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals("POST")) { doPost(req, resp); } else if (method.equals("PUT")) { doPut(req, resp); } else if (method.equals("DELETE")) { doDelete(req, resp); } else if (method.equals("OPTIONS")) { doOptions(req, resp); } else if (method.equals("TRACE")) { doTrace(req, resp); } else { String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(501, errMsg); } }