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

posted @ 2021-01-03 19:47  站在巨人肩上的人  阅读(140)  评论(0编辑  收藏  举报