什么是Servlet:
从狭义上看,Servlet是指Servlet接口,而从广义上看,Servlet是指所有实现了Servlet接口的类。所以,我们可以认为,Servlet是运行在服务器端的小程序,作为(MVC中的C),也就是控制器,用于处理及响应客户端的请求。
Servlet类的继承和实现:
在查看Java Api后,我们发现,我们自己编写的Servlet类,首先会继承与HttpServlet,而HttpServlet又会继承于GenericServlet,最后GenericServlet实现类Servlet接口。
我们可以看到Servlet接口定义了5个方法,分别是:
void destory();
ServletConfig getServletConfig();
String getServletInfo();
void init(ServletConfig config);
void service(ServletRequest request, ServletResponse response);
Servlet接口规定,所有的Servlet都要实现这些方法。由于我们写的程序是基于Http协议的,所以我们只要继承与HttpServlet类。
Servlet的实例创建方式:
首先,我们要知道servlet的生命周期不是由程序员决定的,而是由Web容器进行控制的,创建Servlet实例有两种方式:
(1)客户端第一次请求某个Servlet时,系统创建该Servlet的实例(大部分情况都是这种)
(2)Web应用启动,立即创建Servlet实例(load-on-startup Servlet)
Servlet的生命周期:
那么,Servlet的生命周期遵循以下4步
(1)第一次访问Servlet的时候,会创建Servlet实例,此时会调用Servlet的构造器。且,只会调用一次,证明Servlet在Tomcat服务器中是单例的。
注意:多线程并发访问服务器时,只创建一个Servlet对象,多线程共享,但是每一个线程的Request和Response不同
(2)创建完Servlet实例后,Web容器调用Init(ServletConfig config)方法,对Servlet进行初始化
注意:实际上,Init(ServletConfig config)又会调用无参数的init方法,我们如果要想初始化Servlet,只要在Servlet类中,重写无参数的init方法就可以,但一般情况下,我们不会写。
(3)Servlet初始化之后,会一直存在于容器中,用于响应客户端请求。客户端每次发出请求的时候,会调用service方法。
注意:service方法并不会处理请求,而是根据请求的类型去调用doPost或者doGet方法,是一个转向的作用,所以,我们在实际用于中,只需要重写HttpServlet中的doPost或者doGet方法就可以完成请求的处理。
(4)停止服务器或者重新部署Web应用的时候,会销毁Servlet对象,此时,调用destory方法,在整个Servlet生命周期中,只会调用一次。