由来

在解说Servlet之前须要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思。它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的意思。

Web应用执行在server上,client的请求。刚開始。是通过CGI程序实现数据在Web上的传输,可是对于client做出的每一个请求,必须创建CGI程序的一个新实例,这将占用大量的内存,正是为了解决问题,我们的Servlet应运而生。

Servlet是java编写的一个应用程序,在server上执行。处理请求的信息并将其发送到client,所以它的名字的由来是Server+Applet。对于client的多次请求,Servlet的实例仅仅须要创建一次。因此节省了大量的内存,Servlet在初始化后即驻留在内存中。因此每次作用请求时无需再实例了。

应用体系结构

Servlet容器将Servlet动态的载入到server上,HTTPServlet使用HTTP请求和HTTP响应与client进行交互。因此Servlet容器支持请求和对应所用的HTTP协议。Servlet应用程序体系结构如图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvendrNjI2NTQyNDE3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

上图说明client对Servlet的请求首先会被HTTPserver接收。HTTPserver将客户的HTTP请求提交Servlet容器,Servlet容器调用对应的Servlet。Servlet作出的响应传递到Servlet容器,并进而由HTTPserver将响应传输给client。HTTPserver提供静态内容并将全部client对Servlet作出的请求传递到Servlet容器。

在上一篇文章中我们了解过omcat。它是一个小型的轻量级应用server。在中小型系统和并发用户不是非常多的情况下被广泛应用。和IIS、Apache一样,具有处理HTML的功能,同一时候我们也学过,它还是一个Servlet和JSP的容器。对于上图中。Tomcat就是HTTPserver和Servlet容器两个部分的组合。

生命周期

Servlet的生命周期例如以下图:

Servlet执行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。

载入和实例化

Servlet容器负责载入和实例化Servlet。这项操作通常是动态运行的。

。当Servlet容器启动时。或者在容器检測到需要这个Servlet来响应第一个请求时,创建Servlet实例。

以下我们介绍下。容器是怎样动态实例化Servlet的。当Servlet容器启动后。它必需要知道所需的Servlet类在什么位置,Servlet容器通过类载入器载入Servlet类,成功载入后。容器创建Servlet的实例。由于容器是通过Java的反射API来创建Servlet实例。调用的是Servlet的默认构造方法(即不带參数的构造方法)。所以我们在编写Servlet类的时候,不应该提供带參数的构造方法。

初始化

容器将调用Servlet的init()方法初始化这个对象(在web.xml中<servlet>标签下配置)。

初始化的目的是为了让Servlet对象在处理client请求前完毕一些初始化的工作,如建立数据库的连接。获取配置信息等。对于每个Servlet实例。init()方法仅仅被调用一次。

请求处理

Servlet容器调用Servlet的service()方法对请求进行处理,传递请求和响应对象作为參数,service()方法获得关于请求对象的信息,处理请求。訪问其他资源,获得须要的信息。service()方法使用响应对象的方法。将响应传回Server。终于到达client。

service()方法可能激活其他方法以处理请求。如doGet()或doPost()或程序猿自己开发的新的方法。

服务终止

当容器检測到一个Servlet实例应该从服务中被移除的时候(一般当Server关闭时),容器就会调用实例的destroy()方法。以便让该实例能够释放它所使用的资源。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。

假设再次须要这个Servlet处理请求。Servlet容器会创建一个新的Servlet实例。

注意

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

总结

使用Servlet会使我们开发出的系统可移植性更好、使我们的系统性能更加优越、也有效的保障了安全性的问题。关于Servlet在项目中的使用。在兴许的文章中我们会继续介绍。

最新文章

  1. WCF初探-27:WCF中的实例化
  2. Isolation-based Anomaly Detection
  3. 新手ui设计师必备——切图规范
  4. PHP漏洞全解
  5. 自定义Dialog
  6. Halcon 10.0 Sample:完整性检查(圆形)
  7. C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件
  8. 使用苏飞httphelper开发自动更新发布文章程序
  9. edtftpj让Java上传FTP文件支持断点续传
  10. gdb与adb相关命令总结
  11. 【树形DP/搜索】BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
  12. Communications link failure报错的处理
  13. C# Quartz.Net 定时任务的简单使用
  14. java 线程关闭小结(转)
  15. 在vc正在使用xtremetoolkit接口库-----使用简单的控制
  16. 【福利大放送】不止是Android,Github超高影响力开源大放送,学习开发必备教科书
  17. 关于Android WebView上传文件的解决方案
  18. 使用Mkdocs构建你的项目文档
  19. Python爬虫入门教程 24-100 微医挂号网医生数据抓取
  20. SpringBoot在自定义类中调用service层等Spring其他层

热门文章

  1. Gym - 100625D Destination Unknown 最短路
  2. SQL Server 2005高可用性模式下创建数据库镜像
  3. javaScript 对象学习笔记
  4. tensorflow学习之路---Session、Variable(变量)和placeholder
  5. 【Django】ORM操作#2
  6. 菜鸟之路——Java并发(二)ThreadLocal
  7. [Python] Slicing Lists
  8. hdu5024
  9. sdut 2805(最小生成树)
  10. jquery源码10-提交的数据和ajax()