Servlet 生命周期:Servlet 加载--->实例化并初始化--->服务--->销毁。
- servlet加载:当容器启动的时候加载(或第一次访问servlet时加载);可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet
- init():在Servlet的生命周期中,仅执行一次init()方法。在服务器装入Servlet时,实例化servlet,并调用init()方法初始化。
- service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的 Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应” (ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法 相应的do功能。
- destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资 源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
servlet的工作原理
- browser向servlet容器(tomcat)发送一个请求,容器将请求封装进httpRequest对象,同时new 一个httpResponse对象,将这两个对象传递给servlet的service(request,response)方法,service方法进行业务处理,并将结果set进response对象,容器解封httpRequest对象、httpResponse对象,对jsp进行渲染,将结果返回给browser;
- 自定义servlet,必须实现servlet接口,servlet接口定义了5个方法分别是getServletConfig()、getServletInfo()、init(ServletConfig arg0)、service(ServletRequest arg0, ServletResponse arg1)、destroy()方法。容器加载servlet时会调用init()方法,容器卸载时会调用destroy()方法,当用户发出请求时会调用service()方法。httpServlet实现了servlet接口,只暴露出dopost(),doget()方法,一般我们只要继承httpservlet就可以了。
- servlet和GenericServlet是不特定任何协议的,而httpServlet是特定http协议的类,所以httpServlet实现了service方法,并将servletRequest和servletResponse强转成httpRequest和httpReponse;
servlet创建时机:
- servlet容器启动时读取web.xml配置文件的信息,根据配置<load-on-startup>1</load-on-startup>来决定何时加载servlet.
- 如果该值是一个负数或元素不存在,容器是空闲的时候加载。
- 如果该值是一个正整数或0,容器必须加载和初始化servlet。