servlet的加载过程

总结步骤

> 0.用户发出一个请求,浏览器先从本地host文件中,查找域名和ip的对应关系,如果没有,则去dns服务器去查,
> 	得到目标服务器ip地址后,发送一个探测包,看目标服务器是否有回应,如果有,则向目标服务器发送http请求
> 1:Web服务器接收到Http请求
> 2:Web服务器将请求转发给Servlet容器,然后Servlet容器产生两个对象:
> 	请求对象(HttpServletRequest),	响应对象(HttpServletResponce)
> 3:Servlet容器解析url,去容器中找对应的servlet,如果容器中不存在所需的servlet,容器就会通过web.xml或者webServlet注解,
> 找到对应的用户自己编写的servlet类,然后加载并初始化,并将其加载到servlet容器中
> 4:Servlet容器根据url找到目标Servlet,然后Servlet容器创建一个线程/从线程池里取出一个线程
> 	,并且将刚才创建的请求对象和响应对象传递给线程
> 5:容器调用Servlet的service()方法来处理Http请求,并传入请求对象(HttpServletRequest),响应对象(HttpServletResponce)> 	根据请求类型调用doGet()doPost()方法
> 6:Web服务器将动态生成的结果返回到正确的地址,然后创建的线程被销毁或者放到线程池中。
> 	注意:servlet对象在服务器运行期间只会被创建一次,即是单例的,当服务器关闭的时候,销毁已经初始化的Servlet对象。
> 	如果不是第一次访问这个路径,则直接取出提前初始化好的servlet的对象(应该是存在一个hash<url,servlet>里)。

在这里插入图片描述

在这里插入图片描述

如果是第一次加载,需要执行servlet的init的方法

在这里插入图片描述

①:对象创建好之后,首先要执行init方法,但是我们发现我们自定义类下没有init方法,所以程序会到其父类HttpServlet里找
②:我们发现HttpServlet里也没有init方法,所以继续向上找,既向其父类GenericServlet中继续寻找,在GenericServlet中我们发现了init方法,则执行init方法(对接口Servlet中的init方法进行了重写)
注意: 在GenericServlet中执行public void init(ServletConfigconfig)方法的时候,又调用了自己无惨无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法

服务器调用Servlet的Service方法

在这里插入图片描述

接着,在调用service方法之前,服务器会先创建两个对象:ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据
①:接着服务器会默认在我们写的类里寻找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那么会到其父类中寻找
②:到父类HttpServlet中发现有此方法,则直接调用此方法,并将之前创建好的两个对象传入
③:然后将传入的两个参数强转,并调用HttpServlet下的另外个service方法
④:接着执行service(HttpServletRequest req, HttpServletResponseresp)方法,在此方法内部进行了判断请求方式,并执行doGet和doPost,但是doGet和doPost方法已经被我们自己重写了,所以会执行我们重写的方法

HttpServlet的service方法

     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 = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    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);
        }
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值