Servlet的运行离不开Tomcat,那我们先弄清楚Tomcat的容器模型。
由上图可以看出,在Tomcat下有一个Container容器,这个容器有什么作用?它装载了我们所有的JavaWeb项目,当我们每创建一个JavaWeb项目,Tomcat就会把它“装进”Container容器里。而在这个大容器下,它又“装载着”Servlet容器,可是它是我们今天的主角吗?依然不是。
我们今天的主角是Context容器下的Wrapper,这个Wrapper又是什么?
Wrapper(StandardWrapper)是Servlet 在容器中的包装类,而我们每一个JavaWeb项目则对应一个Context容器,我们每一个项目下都有web.xml文件,它指定了容器的配置属性。
为什么需要Wrapper包装类?因为StandardWrapper 是 Tomcat 容器中的一部分,它具有容器的特征,而 Servlet 为一个独立的 web 开发标准,不应该强耦合在 Tomcat 中。
生命周期 : 创建(加载) --> 初始化 --> 服务 --> 销毁
1.创建 : Web容器负责加载Servlet,当web容器启动时或者在第一次使用这个Servlet的时候,容器会负责创建Servlet实例,但是用户必须通过web.xml指定Servlet的位置,成功加载后,Web容器会通过反射的方式对Servlet进行实例化。
2.初始化 :
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
3.服务 :
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req,resp);
}
它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
4.销毁 :
@Override
public void destroy() {
super.destroy();
}
仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
1 在客户端对web服务器发出请求;
2 web服务器接收到请求后将其发送给Servlet;
3 Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给web服务器;
4 web服务器从Servlet实例对象中收到的响应结构发送回客户端。