每一个自定义的servlet都要继承HttpServlet,所以从HttpServlet开始。首先看一下Servlet的结构:
从上图我们可以看出HttpServlet继承GenericServlet,GenericServlet实现了Servlet和ServletConfig接口。
一、Servlet接口
1.init(ServletConfig)
这是Servlet的初始化方法,由服务器执行,init的执行仅在第一次访问的时候执行,而且只执行一次,在servlet接收任何请求时,init方法必须被成功执行完成。
2.getServletConfig()
此方法返回ServletConfig对象,该对象包括servlet的初始化和启动参数。ServletConfig的初始化参数放在web.xml中的servlet标签下的字标签
3.service(ServletRequest,ServletResponse)
这是servlet的服务方法,由服务器执行,请求一次执行一次。servlet通常运行在可同时处理多个请求的servlet容器中。
4.getServletInfo()
返回有关servlet的信息
5.destroy()
servlet的销毁方法,由服务器执行,仅当servlet被移除或者服务器正常关闭时才执行,仅执行一次。
二、ServletConfig接口
1.getServletName()
获取此servlet实例的名字,在web.xml中配置的
2.getServletContext()
此方法返回一个ServletContext对象,这个ServletContext非常重要。
ServletContext被称作是上下文或者是全局管理者,它可以被看作是一个存储共享对象的map容器。通过setAttribute(key,value)设置对象,getAttribute(key)获取对象值,removeAttribute(key)移除对象。ServletContext被看作是一个项目的引用,代表了当前的项目,当项目启动时服务器为每一个项目创建了一个ServletContext,项目被移除时,ServletContext销毁。ServletContext的初始化参数放在web.xml的根标签下的
3. getInitParameter(String name)
返回指定初始化参数的值,若为空则返回null
4. Enumeration
返回servlet的所有初始化参数,若没有则返回一个空的Enumeration
三、GenericServlet
Servlet的第一个实现类。此类是一个抽象类,只有一个抽象方法即service(ServletRequest req, ServletResponse res)
同时提供了init()的无参方法,若我们想对servlet进行自定义初始化,即在servlet接受请求之前完成相应的逻辑,则只要在当前的servlet中重写init()方法即可。如下:
四、HttpServlet
自定义的servlet在继承HttpServlet时,一般要重写以下方法:
service(ServletRequest req, ServletResponse res)方法:
如源码所示,会把ServletRequest强转为HttpServletRequest,把ServletResponse强转为HttpServletResponse然后调用下面的service方法:
在这个方法中会先通过req.getMethod()判断请求方式是get还是post,然后调用相应的方法。
=========================================================
总结servlet生命周期:servlet是单实例多线程,默认第一次访问时,服务器创建servlet并执行init方法,实现初始化操作,每一次请求来临时都会调用一次service方法,每次请求时都会创建一个线程,调用service方法执行相应的逻辑,在servlet被移除或者服务器正常关闭时执行destroy方法进行销毁。