1. 程式人生 > 實用技巧 >Servlet與servlet容器

Servlet與servlet容器

一、servlet

​ Servlet服務端小程式,純Java語言,非指令碼語言,比其他程式語言的伺服器要快,我所瞭解的大多數是直接執行伺服器指令碼語言。Servlet是java語言,jsp雖然也是指令碼語言,但是第一次執行後會產生對應的servlet物件,這也是javaweb相對其他程式語言高效的原因之一。

javaweb存在三種Servlet

  1. Servlet
  2. GenericServlet
  3. 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