Servlet是一个接口,接口中有5个方法:init、service、destroy、getServletInfo、getServletConfig。对于Servlet来说,生命周期就是init,service,destroy三步,其中service可能会调用多次。
GenericServlet实现了Servlet接口,它只是通用的Servlet,和协议无关。
HttpServlet继承了GernericServlet,增加了doGet、doPost等方法,需要开发者去复写,默认动作是报错。在service方法中还检测了LastModify,看情况返回304 Not Modified。
我们日常生活中所说的Servlet一般是指HttpServlet。因此Servlet完整的生命周期是init、service、doGet/doPost、destroy。init方法是在Servlet被实例化之后调用的,service方法是在请求到达之后调用的。
Servlet和CGI的区别。Servlet一个实例可以服务多个请求,每个请求使用一个单独的线程,一般Web容器中会使用线程池技术,所以每个请求的额外开销非常少。而CGI每个请求需要启动一个单独的进程。进程的开销比线程要大很多,因此Servlet性能更加优越。
Servlet不是线程安全的,它没有多线程保护机制。在Servlet中,每个请求都会有一个专门的线程进行处理。如果多个请求同时到来,那么同一个Servlet对象中的service方法会被这些线程同时调用。为了保护多线程的安全,可以让Servlet类实现SingleThreadModel接口。这种方法一次只能处理一个请求,因此性能很差。不过也有Web容器会建立对象池,也就是每个线程一个Servlet对象,这样性能稍微好一点。如果需要更好的性能,还需要手动加入代码同步块。如果允许的话,使用ThreadLocal来定义变量。Java面试题经常会问到“Servlet是否线程安全?”其实这种描述容易给新手造成误解,“什么?大名鼎鼎的Servlet居然也有安全问题?”个人认为更加明确一点的描述应该是“你在实现Servlet中的service方法时,要不要考虑多线程的问题?为什么?”
Java Servlet 总结,布布扣,bubuko.com