Servlet與servlet容器
阿新 • • 發佈:2021-01-03
一、servlet
Servlet服務端小程式,純Java語言,非指令碼語言,比其他程式語言的伺服器要快,我所瞭解的大多數是直接執行伺服器指令碼語言。Servlet是java語言,jsp雖然也是指令碼語言,但是第一次執行後會產生對應的servlet物件,這也是javaweb相對其他程式語言高效的原因之一。
javaweb存在三種Servlet
- Servlet
- GenericServlet
- HttpServlet
後兩種與Servlet分別是實現或繼承關係。GenericServlet實現了Servlet介面,HttpServlet繼承了GenericServlet。兩者相比,主要的區別在於Service方法,GenericServlet的service方法是一個抽象方法,而HttpServlet實現了service方法,並對其進行了一些優化,通過不同的http請求方式,執行不同的方法。具體如下:
//GenericServlet public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException; //HttpServlet protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); long lastModified; if (method.equals("GET")) { lastModified = this.getLastModified(req); if (lastModified == -1L) { this.doGet(req, resp); } else { long ifModifiedSince; try { ifModifiedSince = req.getDateHeader("If-Modified-Since"); } catch (IllegalArgumentException var9) { ifModifiedSince = -1L; } if (ifModifiedSince < lastModified / 1000L * 1000L) { this.maybeSetLastModified(resp, lastModified); this.doGet(req, resp); } else { resp.setStatus(304); } } } else if (method.equals("HEAD")) { lastModified = this.getLastModified(req); this.maybeSetLastModified(resp, lastModified); this.doHead(req, resp); } else if (method.equals("POST")) { this.doPost(req, resp); } else if (method.equals("PUT")) { this.doPut(req, resp); } else if (method.equals("DELETE")) { this.doDelete(req, resp); } else if (method.equals("OPTIONS")) { this.doOptions(req, resp); } else if (method.equals("TRACE")) { this.doTrace(req, resp); } else { String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[]{method}; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(501, errMsg); }
二、servlet容器
Servlet就是一個javaBean,而且是單例模式,交給Servlet容器執行,通過建立Servlet類將給Servlet容器去執行。tomcat是一個輕量級的伺服器,實現了servlet/規範,他也是一個servlet容器。一個tomcat有一個或多個容器,且容器不共享。在webapp檔案中,每一個資料夾,都是一個servlet容器,存放著不同的server,彼此之間contex域不共享。
如有不足或錯誤,請指正!謝謝QAQ