首页 > 代码库 > Java Drp项目实战——Servlet

Java Drp项目实战——Servlet

由来

 

在讲解Servlet之前需要先介绍一个词语CGI即Common GatewayInterface是通用网关接口的意思,它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口的意思。Web应用运行在服务器上,客户端的请求,刚开始,是通过CGI程序实现数据在Web上的传输,但是对于客户端做出的每个请求,必须创建CGI程序的一个新实例,这将占用大量的内存,正是为了解决这个问题,我们的Servlet应运而生。

 

 

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

 

 

 

 

应用体系结构

 

Servlet容器将Servlet动态的加载到服务器上,HTTPServlet使用HTTP请求和HTTP响应与客户端进行交互。因此Servlet容器支持请求和相应所用的HTTP协议。Servlet应用程序体系结构如图所示:


 

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

 

在上一篇文章中我们了解过omcat,它是一个小型的轻量级应用服务器,在中小型系统和并发用户不是很多的情况下被广泛应用,和IIS、Apache一样,具有处理HTML的功能,同时我们也学过,它还是一个Servlet和JSP的容器,对于上图中,Tomcat就是HTTP服务器和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对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。

 

 

请求处理

 

Servlet容器调用Servlet的service()方法对请求进行处理,传递请求和响应对象作为参数,service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息,service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。

 

服务终止

 

当容器检测到一个Servlet实例应该从服务中被移除的时候(一般当Server关闭时),容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

 

 

 

注意

 

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

 

 

总结

 

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

Java Drp项目实战——Servlet