servlet的生命周期是由容器进行管理,而容器就是所谓的应用服务器或者web服务器,但是咱们这里是指Tomcat服务器。所以运行在Tomcat上的servlet的生命周期就是Tomcat在管理。这里生命周期主要经历三个阶段。
第一个就是init()初始化这个方法:这个方法的其实是servlet接口中的一个抽象方法,在servlet的实现类GenericServlet中实现,在GenericServlet中对init方法的实现其实就是一个空的方法体,如果你自己有任何初始化只需要在自己的Servlet中对init方法进行重写,因为Servlet继承了HttpServlet,而HttpServlet又继承了GenericServlet,所以可以直接在自己的Servlet中直接重写init方法。当客户端浏览器第一次发送请求Servlet 时,Tomcat容器会实例化这个Servlet(这里只是会实例化一次,请求结束后,会把这个实例对象保存在缓存当中,下个请求会优先到缓存中找实例对象),然后实例会调用init这个方法进行初始化。(注意这里的init方法并不是进行实例对象,而是初始化对象)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>com.bjsxt.servlet.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
第二个就是service服务:其实Servlet是基于单进程多线程运行的,我们在前期工作中会在web.xml(项目的配置文件)文件中配置Servlet与URL的绑定,Tomcat会对请求的解析获取到请求行、请求头、请求体,然后放入HttpRequest中。首先Tomcat会根据解析到URL在缓存中寻找对应的实例对象,如果找到并会在一个新的线程中执行Service方法。如果在缓存中找不到对应的实例对象,那么Tomcat就会实例新的对象,会在web.xml文件中找到对应的项目名利用JAVA的反射机制进行实例化。这时候根据请求时基于什么方式进行发送,这里假设是根据get方法进行发送的,那么在自己的Service中重写了toget方法,所以就会产生响应。
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>");
out.println("<HTML>");
out.println("<HEAD><TITLE> ITBZ </TITLE></HEAD>");
out.println("<BODY>");
out.println("<font color=blue>HelloWorld</font>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
第三个就是destroy()销毁:当Tomcat关闭时会销毁缓存中的Servlet实例对象,但是在销毁之前会调用一次destroy()方法,这里需要注意下destroy()方法并不是用来销毁Servlet对象的,只是用来释放资源的。跟init方法一样,这个destroy也是在GenericServlet中进行实现,也是一个空方法体,可以在自己的Servlet中进行重写。