- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 14 章 生命周期
第?14?章?生命周期
注意
讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计。
如果你不满足以下任一条件,请继续阅读,否则请跳过此后的部分,进入下一章:第?15?章 分页。
了解servlet的生命周期。
了解servlet运行时的线程模型,及设计程序时需要注意的部分。
14.1.?生命周期
我们之前使用的都是javax.servlet.http.HttpServlet,这个类实现了javax.servlet.Servlet接口,而这个接口中定义的三个方法是所有servlet都必须实现的。
package javax.servlet;
public interface Servlet {
void init(ServletConfig config);
void service(ServletRequest request, ServletResponse response);
void destroy();
}
如图所示,tomcat之类的服务器首先根据web.xml中的定义实例化servlet,然后调用它的init()方法进行初始化,init()方法的ServletConfig参数是服务器传递进servlet的,其中包含web.xml配置的初始化信息和ServletContext对象等共享内容。
初始化后的servlet实例便进入等待请求的状态,当有与servlet-mapping匹配的请求进入时,服务器会调用servlet实例的service方法,传入ServletRequest与ServletResponse两个参数等待servlet处理完毕。
注意一点,对于每个web应用,内存中只存在一个servlet实例,所有请求都是调用这个servlet实例,所以我们说servlet不是线程安全的,所有操作都要限制在service()方法中进行,不要在servlet中定义类变量。(doGet()和doPost()是HttpServlet覆盖service()方法后分支出来的辅助方法,实际上服务器调用的还是service()。)
当web应用卸载时,服务器会调用每个已经初始化的servlet的destroy(),然后销毁这些servlet实例,如果你需要在servlet销毁时释放什么资源的话,可以写在destory()方法中。
那么servlet是在什么时候进行初始化的呢?我们可以通过web.xml中的load-on-startup标签。
servlet
servlet-nameTestServlet/servlet-name
servlet-classanni.TestServlet/servlet-class
load-on-startup1/load-on-startup
/servlet
load-on-startup的值是一个整数,当它大于等于零的时候服务器会在web发布的时候初始化servlet。当它小于零或者我们没有设置load-on-startup的时候,服务器会在用户第一次访问servlet的时候才去初始化servlet。
或许你对load-on-startup为什么是一个整数存有疑问,为什么不是true和false呢?这是因为如果我们在web.xml中设置了多个servlet的时候,可以使用load-on-startup来指定servlet的加载顺序,服务器会根据load-on-startup的大小依次对servlet进行初始化。不过即使我们将load-on-startup设置重复也不会出现异常,服务器会自己决定初始化顺序。
回头看看javax.servlet.Filter中也有init()和destroy()方法,它的声明周期与servlet基本一致,服务器使用init()对Filter初始化,销毁Filter的时候调用destroy()方法,只是过滤器就不在有load-on-startup设置了,它总是会在服务器启动的时候进行初始化,然后按照web.xml定义的顺序依次执行。
14.2.?线程模型
我们做一个试验,以此来证明某些编写servlet的方法是绝对错误的。
第一步,我们打开浏览器,浏览14-02的index.jsp页面,输入“叮咚”。
第二步,我们再打开一个14-02/index.jsp页面,输入“lingirl”。
第三步,点击第一个页面的提交按钮,然后在10秒之内点击另一个页面的提交按钮,等两个页面都提交成功后,我们会看到如下页面。
url上有乱码这个就是提交“叮咚”的页面,会惊讶吧?本来这时应该显示“叮咚”的。
这个页面对应提交“ling
您可能关注的文档
最近下载
- 2015三峡大学(修改版)水电站课程设计计算书3.pdf VIP
- 视频脚本(解析版)-2025年高考语文一轮复习(新高考通用).pdf VIP
- 2019年广东高考理科数学真题及答案.docx VIP
- 2025年度感染病科五年发展规划.docx
- 再生资源有限责任公司突发环境事件风险评估报告(2024年修订版).docx VIP
- 乐山市2025年公需科目考试答案.docx
- TCSUS04-2019城市旧居住区综合改造技术标准.pdf VIP
- 电子技术基础第六版完整版.pdf VIP
- “规则的天空”:中国低空空域管理与安全体系演进趋势研究.pdf VIP
- 2015年广东高考理科数学真题及答案.doc VIP
文档评论(0)