Servlet 生命周期
Servlet 的生命周期
- 服务器只创建Servlet的单一实例,所以他的init方法只会调用一次,每个用户发送的请求都会创建一个新的线程,调用service方法 然后service方法开始检查HTTP请求的类型(GET,POST,PUT,DELETE),然后调用相应的类型方法
- service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
- servlet类中有几个抽象的方法,其中一个就是service()方法。每次有请求传入时,开启一个新线程调用service方法.
- JDK只是定义了servlet接口,而实现servlet接口的比如tomcat, jboss等服务器
分析源码就可以知道 service 会根据请求的类型来调用相应的请求的方法
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { ... doGet(req, resp); ... } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { ... } }
如果重写了service方法
Servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段、初始化阶段、服务阶段和实例销毁阶段。
1、初始化阶段 调用init()方法 初次载入Servlet时只会执行一次
2、响应客户请求阶段。调用service()方法,由service()方法根据提交的方式选择执行doGet()或者doPost()方法
3、终止阶段 调用destroy()方法
如果系统有多个请求同时访问一个servlet实例那么会不会产生 并发情况,事实上,大多数情况下,系统将所有的请求排队,一次只将一个请求转给单个Servlet实例,但是服务器可以创建有多个实例组成的池,同一时间每个实例都能够处理请求,所以还是应该共享变量进行同步