当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象(有可能随着应用的启动而创建),如果有直接使用该Servlet对象,如果没有就创建Servlet实例对象,然后通过调用init()方法实现Servlet的初始化工作。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。
这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次。
当服务器关闭或web应用被移除出容器时,Servlet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。
- package cn.itcast.firstapp.servlet;
- import javax.servlet.*;
- public class HelloWorldServlet extends GenericServlet {
- public void init(ServletConfig config) throws ServletException {
- System.out.println("init methed is called");
- }
- public void service(ServletRequest request, ServletResponse response) throws ServletException {
- System.out.println("Hello World");
- }
- public void destroy() {
- System.out.println("destroy method is called");
- }
-
- }
- <servlet>
- <servlet-name>HelloWorldServletservlet-name>
- <servlet-class>cn.itcast.firstapp.servlet.HelloWorldServletservlet-class>
- servlet>
-
- <servlet-mapping>
- <servlet-name>HelloWorldServletservlet-name>
- <url-pattern>/HelloWorldServleturl-pattern>
- servlet-mapping>
http://localhost:8080/chapter03/HelloWorldServlet
刷新浏览器,多次访问
在实际开发时,有时候会希望某些Servlet可以在Tomcat启动时随即启动。例如,当启动一个Web项目时,首先需要对数据库信息进行初始化。这时,只需要使用web.xml文件中
在web.xml中增加
- <servlet>
- <servlet-name>HelloWorldServletservlet-name>
- <servlet-class>cn.itcast.firstapp.servlet.HelloWorldServletservlet-class>
-
- <load-on-startup>1load-on-startup>
- servlet>
再重新启动tomcat,就能看到初始化方法被调用,如下: