Servlet 的生命周期

本文详细介绍了Servlet的概念、作用及生命周期,对比了Servlet与CGI脚本的区别,并深入探讨了Servlet的加载、初始化、请求处理和服务终止等关键阶段。
[color=#345286] [b]什么是 Servlet?[/b][/color]
[color=#345286] Servlet 是用 Java 编写的服务器端程序,它与协议和平台无关。Servlet 运行于 Java-enabled Web Server 中。Java Servlet 可以动态地扩展服务器的能力,并采用请求-响应模式提供 Web 服务。[/color]
[color=#345286] Servlet 可以被认为是服务器端的 applet。Servlet 被 Web 服务器加载和执行,就如同 applet 被浏览器加载和执行一样。Servlet 从客户端(通过 Web 服务器)接收请求,执行某种作业,然后返回结果。[/color]
[color=#345286] 由于 Servlet 是在服务器上执行,通常与 applet 相关的安全性的问题并不需实现。Servlet 使相当数量的不可能或者至少是很难由 applet 实现的功能的实现成为可能。与现有系统通过 CORBA,RMI,socket 和本地(native)调用的通信就是其中的一些例子。另外,一定要注意:Web 浏览器并不直接和 Servlet 通信,Servlet 是由 Web 服务器加载和执行的。这意味着如果你的 Web 服务器有防火墙保护,那么你的 Servlet 也将得到防火墙的保护。[/color]

[color=#345286] [b]为什么要使用 Servlet?[/b][/color]
[color=#345286] 最起码,Servlet 可以很好地替代公共网关接口(Common Gateway Interface,CGI)脚本。通常 CGI 脚本是用 Perl 或者 C 语言编写的,它们总是和特定的服务器平台紧密相关。而 Servlet 是用 Java 编写的,所以它们一开始就是平台无关的。这样,Java 编写一次就可以在任何平台运行(write once, run anywhere)的承诺就同样可以在服务器上实现了。[/color]

[color=#345286] [b]Servlet 的生命周期[/b][/color]
[color=#345286] Servlet 运行在 Servlet 容器中,其生命周期由容器来管理。Servlet 的生命周期通过 javax.servlet.Servlet 接口中的 init(ServletConfig), service(ServletRequest, ServletResponse) 和 destroy() 方法来表示。[/color]

[color=#345286] Servlet 的生命周期包含了下面四个阶段。[/color]

[color=#345286] [b](1) 加载和实例化[/b][/color]
[color=#345286] Servlet 容器负责加载和实例化 Servlet。当 Servlet 容器启动时,或者在容器检测到需要这个 Servlet 来响应第一个请求时,创建 Servlet 实例。[/color][color=#FF0000][b]对于 tomcat 而言,Servlet 的实例化和初始化的时机是:当容器检测到对该 Servlet 的第一次请求时。[/b][/color]

[color=#345286] [b](2) 初始化[/b][/color]
[color=#345286] 在 Servlet 实例化之后,容器必须调用 Servlet 的 init 方法初始化这个对象。初始化的目的是为了让 Servlet 对象在处理客户端请求前完成一些初始化的工作。[b]对于每一个 Servlet 实例,init 方法只能被调用一次。[/b]在初始化期间,Servlet 实例可以使用容器为它准备的 ServletConfig 对象从 Web 应用程序的配置信息(在 web.xml 中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet 实例可以抛出 ServletException 异常或者 UnavailableException 异常来通知容器。ServletException 异常用于指明一般的初始化失败,此时请求该 Servlet 时会得到 500 错误,例如没有找到初始化参数;而 UnavailableException 异常用于通知容器该 Servlet 实例不可用,这种情况下请求该 Servlet 时会得到 404 错误。若在 init 方法中发生其它异常,请求该 Servlet 时同样会得到 500 错误。[/color]

[color=#345286] [b](3) 请求处理[/b][/color]
[color=#345286] Servlet 容器调用 Servlet 的 service 方法对请求进行处理。要注意的是,[b]在 service 方法调用之前,init 方法必须成功执行。[/b]在 service 方法中,Servlet 实例通过 ServletRequest 对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用 ServletResponse 对象的方法设置响应信息。在 service 方法执行期间,如果发生错误,Servlet 实例可以抛出 ServletException 异常或者 UnavailableException 异常。如果 UnavailableException 异常指示了该实例永久不可用,Servlet 容器将调用实例的 destroy 方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的 HTTP 404(请求的资源不可用) 响应。如果 UnavailableException 异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的 HTTP 503(服务器暂时忙,不能处理请求) 响应。[/color]

[color=#345286] [b](4) 服务终止[/b][/color]
[color=#345286] 当容器检测到一个 Servlet 实例应该从服务中被移除的时候,容器就会调用实例的 destroy 方法,以便让该实例可用释放它所使用的资源。当需要释放内存或者容器关闭时,容器就会调用 Servlet 实例的 destroy 方法。在 destroy 方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 java 的垃圾回收器所回收。如果再次需要这个 Servlet 处理请求,Servlet 容器会创建一个新的 Servlet 实例。这里,容器会重新创建 Servlet 的实例并没有与 [b]"对于每一个 Servlet 实例,init 方法只能被调用一次"[/b] 相违背,因为重新创建的 Servlet 实例已进入了一个新的生命周期,原来 Servlet 实例的生命周期已经结束。[/color]

[color=#345286] [b]在整个 Servlet 的生命周期过程中,创建 Servlet 实例、调用实例的 init 和 destroy 方法都只进行一次,[/b]当初始化完成后,Servlet 容器会将该实例保存在内存中,通过调用它的 service 方法,为接收到请求服务。[/color]

[color=#345286] 由于我们更多的情况是 HTTP 调用,所以我们编写的 Servlet 更多的是 HttpServlet。我在附件中画了一张 Servlet API 中主要接口与类的 UML 类图 的 visio 图(vsd 格式文件和 jpg 图片均提供),大家可以拿来作为参考。[/color]

[color=#345286] 另外,大家可以参考[url=http://renpeng301.iteye.com/blog/608688]这篇关于 Servlet 的文章[/url],作者提供的类图更加详细。[/color]
欢迎使用“可调增益放大器 Multisim”设计资源包!本资源专为电子爱好者、学生以及工程师设计,旨在展示如何在著名的电路仿真软件Multisim环境下,实现一个具有创新性的数字控制增益放大器项目。 项目概述 在这个项目中,我们通过巧妙结合模拟电路与数字逻辑,设计出一款独特且实用的放大器。该放大器的特点在于其增益可以被精确调控,并非固定不变。用户可以通过控制键,轻松地改变放大器的增益状态,使其在1到8倍之间平滑切换。每一步增益的变化都直观地通过LED数码管显示出来,为观察和调试提供了极大的便利。 技术特点 数字控制: 使用数字输入来调整模拟放大器的增益,展示了数字信号对模拟电路控制的应用。 动态增益调整: 放大器支持8级增益调节(1x至8x),满足不同应用场景的需求。 可视化的增益指示: 利用LED数码管实时显示当前的放大倍数,增强项目的交互性和实用性。 Multisim仿真环境: 所有设计均在Multisim中完成,确保了设计的仿真准确性和学习的便捷性。 使用指南 软件准备: 确保您的计算机上已安装最新版本的Multisim软件。 打开项目: 导入提供的Multisim项目文件,开始查看或修改设计。 仿真体验: 在仿真模式下测试放大器的功能,观察增益变化及LED显示是否符合预期。 实验与调整: 根据需要调整电路参数以优化性能。 实物搭建 (选做): 参考设计图,在真实硬件上复现实验。
【数据融合】【状态估计】基于KF、UKF、EKF、PF、FKF、DKF卡尔曼滤波KF、无迹卡尔曼滤波UKF、拓展卡尔曼滤波数据融合研究(Matlab代码实现)内容概要:本文围绕状态估计与数据融合技术展开,重点研究了基于卡尔曼滤波(KF)、无迹卡尔曼滤波(UKF)、扩展卡尔曼滤波(EKF)、粒子滤波(PF)、固定区间卡尔曼滤波(FKF)和分布式卡尔曼滤波(DKF)等多种滤波算法的理论与Matlab实现,涵盖了非线性系统状态估计、多源数据融合、目标跟踪及传感器优化等应用场景。文中通过Matlab代码实例演示了各类滤波方法在动态系统中的性能对比与适用条件,尤其强调在复杂噪声环境和非线性系统中的实际应用价值。; 适合人群:具备一定信号处理、控制理论基础的研究生、科研人员及从事自动化、导航、机器人、电力电子等相关领域的工程技术人员。; 使用场景及目标:①用于动态系统的状态估计与噪声抑制,如目标跟踪、无人机姿态估计、电池SOC估算等;②为科研项目提供主流滤波算法的Matlab实现参考,支持算法复现与性能对比;③辅助教学与课程设计,帮助理解滤波算法的核心原理与编程实现。; 阅读建议:建议结合Matlab代码实践操作,重点关注不同滤波算法在非线性、非高斯环境下的表现差异,建议读者按章节顺序学习,并参考文档中提供的网盘资源获取完整代码与仿真模型以加深理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值