对于Servlet,服务器只建立每一个servlet的单一实例,每一个用户请求都会引起新的线程-----将用户请求将会给相应的doGet/doPost进行处理。那么,servlet是如何进行建立和销毁的? web
当首次建立servlet时,它的init方法会获得调用,在这以前首先是服务器加载相应的servlet。init是放置一次性代码 的地方,在这以后,针对每一个用户请求,都会建立一个线程,该线程调用前面建立的实例的service方法。多个并发请求通常会致使多个线程的同时调用 service(尽管能够实现特殊的接口,如 SingleThreadModel,规定任什么时候间只容许单个线程运行)。在调用service方法后,根据service方法收到的HTTP请求的类型,调用doGet,doPost,若其余doXxx方法,最后,若是服务决定缷载某个service,它会首先调用servlet的destroy方法。 数据库
service方法 服务器
服务器每次接收到对servlet的请求,都会产生一个新的线程,调用service方法,service方法检查HTTP请求的类型(GET,POST,PUT,DELETE等)并相应地调用doGet,doPost,doPut,doDelete等方法,GET请求原由于正常的URL请求,或没有指定method="post"的表单请求。POST请求原由于特别将POST列为method的HTML表单,其余HTTP请求都由定制客户生成。 cookie
若是咱们须要在servlet中等同地处理POST和GET请求,咱们有可能会不去实现doPost doGet方法,而是直接配覆写service方法。可是这样作不是一个好的思想,咱们应该在doPost方法中调用doGet或相反。 多线程
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{ 并发
doGet(request,response); post
} spa
public void doGet()throws ServletException,IOException{ // 相应的业务处理方法代码 线程
} 接口
这样作有几处优势:首先,咱们还能够添加doPut,doTrace等方法,支持HTTP请求方法;其次,能够经过添加getLastModified方法加入对修改日期的支持。
destroy方法
服务器能够会决定移除以前载入的servlet实例,这时候它会调用servlet的destroy方法,从而使得servlet有机会关闭数据库链接、中止后台运行的线程、将cookie列表和点击计数写入到磁盘,并执行其余清理活动。在这里,要注意的是 web服务器可能会崩溃;因此咱们不该该将destory机制做为向磁盘上保存状态的唯一机制。若是服务器执行诸如点击计数,或对cookie值(表示特殊的访问 )的列表进行累加等活动,应该主动地按期将数据写到磁盘上。
Servlet 与CGI的区别:
与CGI的区别在于servlet处于服务器进程中,它经过多线程方式运行其service方法,一个实例能够服务于多个请求,而且其实例通常不会销毁,而CGI对每一个请求都产生新的进程,服务完成后就销毁,因此效率上低于servlet。