求解servlet生命周期疑惑!

duanjianbo26 2009-05-26 01:15:59
大家都知道,servlet生命周期分为几个阶段:创建servlet对象,调用init()方法,调用service方法,调用destory方法。从用户发出一个servlet请求到此请求结束,servlet是怎么运作的?我还是不太明白!
比如“创建servlet对象”这个阶段,有些是tomcat启动就创建(比如在web.xml文件中的servlet定义了加载顺序的),有些是有用户请求才创建。创建完了它就一直存在?就算是用户发出另外一个请求它还存在?如果存在的话当另外一个人发送相同的请求时,这时直接调用原来的servlet对象,但还会执行init()方法么?如果不存在是否是由于这个servlet请求结束了(这个结束是指servlet发送了返回结果)调用destory方法从而销毁servlet对象??
希望大侠能指点下我!
...全文
345 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
存在666 2010-01-30
  • 打赏
  • 举报
回复
我怎么看不到呢!
whqcfp 2009-06-01
  • 打赏
  • 举报
回复
顶一下!
duanjianbo26 2009-05-27
  • 打赏
  • 举报
回复
我觉得理论很重要,只有知道其中原理才能应用自如。否则仅仅是一知半解
lvsh870228 2009-05-27
  • 打赏
  • 举报
回复
找本书好好看看吧,这是理论,不是应用,很难问到精确的答案的!
duanjianbo26 2009-05-27
  • 打赏
  • 举报
回复
经过测试init()方法只调用一次,service方法请求一次调用一次。但init()方法中的数据是不是servletContext级别的数据?就是可以从servletContext中直接取?但我测试的是只有经过setAttribute方法后然后再通过getAttribue方法取。是不是只有在listener中初始化的数据才可以直接通过servletcontext取?但该怎么取呢?
默然说话 2009-05-27
  • 打赏
  • 举报
回复
最近不知道怎么了,看到简单的不想回答,看到难的又回答不了。。。
lababawan 2009-05-27
  • 打赏
  • 举报
回复
Servlet运行机制和Applet类似,Servlet是载服务器端运行的,但是Applet是在客户端运行的。Servlet是javax.servlet包中HttpServlet类的子类,由服务器完成该子类的创建和初始化。
Servlet的生命周期主要由3个过程组成。
1、init()方法:服务器初始化Servlet。
2、service()方法:初始化完毕,Servlet对象调用该方法相应客户的请求。
3、destroy()方法:调用该方法消灭Servlet对象。
其中,init()方法只在Servlet第一次被请求加载的时候被调用一次,当有客户再请求Servlet服务时,Web服务器将启动一个新的线程,在该线程中,调用service方法相应客户的请求。
lovenewkobe24 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xnjnmn 的回复:]
LZ的困惑网上说的有很多
http://www.javaeye.com/topic/154146
[/Quote]
是的,这个页面说的很清楚了!
kaz33 2009-05-27
  • 打赏
  • 举报
回复
当多个请求同一个Servlet时,只实例化一次servlet,调用用一次init()方法,开启多个线程处理多个请求
duanjianbo26 2009-05-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 java2000_net 的回复:]
第一次使用,肯定要装载。
而且容器会预先设置几个作为池使用。

一般情况下,不会被删除,除非容器停止,或者内存不够,导致池缩小。
[/Quote]
那能否讲下在哪些地方加载是全局的,哪些又不是?
老紫竹 2009-05-27
  • 打赏
  • 举报
回复
第一次使用,肯定要装载。
而且容器会预先设置几个作为池使用。

一般情况下,不会被删除,除非容器停止,或者内存不够,导致池缩小。
BTomcat 2009-05-26
  • 打赏
  • 举报
回复
学习
xnjnmn 2009-05-26
  • 打赏
  • 举报
回复
LZ的困惑网上说的有很多
http://www.javaeye.com/topic/154146

想深入可以看servlet源代码
下载地址
http://apache.mirror.phpchina.com/tomcat/tomcat-6/v6.0.18/src/apache-tomcat-6.0.18-src.zip
下载后看
apache-tomcat-6.0.18-src\apache-tomcat-6.0.18-src\java\javax\servlet
duanjianbo26 2009-05-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qiheia 的回复:]
要知道servlet是怎么运行的,就是用输出控制,如
在init()方法中写个输出语句System.out.println("调用init()方法");
在service方法中写个输出语句System.out.println("调用service()方法");
在destory方法写个输出语句System.out.println("调用destory()方法");
这样去跟踪程序的流程,就知道了。。。
[/Quote]
你说的有道理,但servlet对象的创建和销毁怎么测?
Defonds 2009-05-26
  • 打赏
  • 举报
回复
mark
qiheia 2009-05-26
  • 打赏
  • 举报
回复
要知道servlet是怎么运行的,就是用输出控制,如
在init()方法中写个输出语句System.out.println("调用init()方法");
在service方法中写个输出语句System.out.println("调用service()方法");
在destory方法写个输出语句System.out.println("调用destory()方法");
这样去跟踪程序的流程,就知道了。。。

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧