Servlet解读

每一个自定义的servlet都要继承HttpServlet,所以从HttpServlet开始。首先看一下Servlet的结构:

Servlet解读

从上图我们可以看出HttpServlet继承GenericServlet,GenericServlet实现了Servlet和ServletConfig接口。

一、Servlet接口

Servlet解读

1.init(ServletConfig)

这是Servlet的初始化方法,由服务器执行,init的执行仅在第一次访问的时候执行,而且只执行一次,在servlet接收任何请求时,init方法必须被成功执行完成。

2.getServletConfig()

此方法返回ServletConfig对象,该对象包括servlet的初始化和启动参数。ServletConfig的初始化参数放在web.xml中的servlet标签下的字标签<init-param>中。

3.service(ServletRequest,ServletResponse)

这是servlet的服务方法,由服务器执行,请求一次执行一次。servlet通常运行在可同时处理多个请求的servlet容器中。

4.getServletInfo()

返回有关servlet的信息

5.destroy()

servlet的销毁方法,由服务器执行,仅当servlet被移除或者服务器正常关闭时才执行,仅执行一次。

二、ServletConfig接口

Servlet解读

1.getServletName()

获取此servlet实例的名字,在web.xml中配置的<servlet-name>

2.getServletContext()

此方法返回一个ServletContext对象,这个ServletContext非常重要。

ServletContext被称作是上下文或者是全局管理者,它可以被看作是一个存储共享对象的map容器。通过setAttribute(key,value)设置对象,getAttribute(key)获取对象值,removeAttribute(key)移除对象。ServletContext被看作是一个项目的引用,代表了当前的项目,当项目启动时服务器为每一个项目创建了一个ServletContext,项目被移除时,ServletContext销毁。ServletContext的初始化参数放在web.xml的根标签下的<context-param>标签下。

3. getInitParameter(String name)

返回指定初始化参数的值,若为空则返回null

4.    Enumeration<E> getInitParameterNames()

返回servlet的所有初始化参数,若没有则返回一个空的Enumeration

三、GenericServlet

Servlet的第一个实现类。此类是一个抽象类,只有一个抽象方法即service(ServletRequest req, ServletResponse res)

同时提供了init()的无参方法,若我们想对servlet进行自定义初始化,即在servlet接受请求之前完成相应的逻辑,则只要在当前的servlet中重写init()方法即可。如下:

Servlet解读

四、HttpServlet

自定义的servlet在继承HttpServlet时,一般要重写以下方法:

Servlet解读

service(ServletRequest req, ServletResponse res)方法:

Servlet解读

如源码所示,会把ServletRequest强转为HttpServletRequest,把ServletResponse强转为HttpServletResponse然后调用下面的service方法:

Servlet解读

在这个方法中会先通过req.getMethod()判断请求方式是get还是post,然后调用相应的方法。

=========================================================

总结servlet生命周期:servlet是单实例多线程,默认第一次访问时,服务器创建servlet并执行init方法,实现初始化操作,每一次请求来临时都会调用一次service方法,每次请求时都会创建一个线程,调用service方法执行相应的逻辑,在servlet被移除或者服务器正常关闭时执行destroy方法进行销毁。