首页 > 代码库 > Java Servlet 总结
Java Servlet 总结
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方法时,要不要考虑多线程的问题?为什么?”
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方法时,要不要考虑多线程的问题?为什么?”
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。