其实最近一直在做Web方面的开发,Servlet最近也一直在使用,前一阵子研究了Struts,最近又在研究一个小日本写的Servlet 做的Web网站的框架,但是感觉好像一直身在此山之中,不识庐山真面目,只是注重于流转,写法,但是没有好好的看看Servlet的定义和概念,看来最近要好好看一下JAVA的基的基础,光会做做出来是不行的啊。
一、什么是Servlet :
Servlet容器(以前称Servelt引擎)实际上是执行servlet的软件。所有支持servlet的服务器包括一个servelt容器(集成的或通过插件。)术语支持java的服务器常指一个增强的servletHTTP服务器(即它包括一个用于运行servlet的 servlet容器)
二、Servlet的生命周期 :
Servlet生命周期:以下是一个服务器调用servlet的过程。
1、 在服务器启动时,当servlet被客户首次请求或被配置好,这时由服务器加载servlet.Servlet的加载可以通过合用一个自定义的Java类加载工具(可允许自动Servlet重载)从本地或远程地址来实现。这一步等同于:
Class c = Class.forName(“com.sourceStream.MyServlet”);
这里用的术语加载指同时加载和初始化servlet的过程。
2、 服务器创建一个servlet类实例来为所有请求服务。利用多线程,可以由单个servlet实例来服务于并行的请求。惟五的例外是,因为事先SingleThreadModel接口的servlet,这样,服务器会创建一个实例池并从中选择一个来服务于每一新的得求。此时相当于以下java代码:
Servlet s = (Servlet)c.newInstance();
3、 服务器调用Servlet的init()方法。它用来保证完成在首次请求servlet理以前的执行过程。如果servlet创建了多个servlet实例,则为每个实例调用一次init()方法。
4、 服务器从包括在客户请求中的数据里构造一个ServletRequest或HttpServletRequest对象,还构造一个ServletResponse或HttpServletResponse对象来返回响应提供方法。其参数类型依赖于servlet是否分别扩展GenericServlet或HttpServlet.(注意:如果服务器没有收到对这一servlet的请求,此步骤与以下5---7步骤将不会发生。)
5、 服务器调用servlet的service()方法(对于Httpservlet,service()将调用更为具体的方法:如:doGet() 或doPost()),在此步骤中作为参数传递结构化对象。当并行的请求到来时,多个service()方法能够同时运行在独立的线程中。(除非servlet实现了SingleThreadModel接口)
6、 通过分析ServletReuest或HttpServletRequest对象。Service()方法处理客户的请求.并调用ServletResponse或HttpServletResponse对象来响应。
7、 如果服务器收到另一对该servlet的请求,这个处理过程从5步骤重复。
8、 一旦servlet容器测试到一个servlet要被卸在,这可能是因为要回收资源或因为它正在被关闭,服务器会在所有servlet的service()线程完成之后(或在服务器规定时间后)调用servlet的destroy()方法。然后servlet就可以进行无用存储单元收集清理。Servlet容器不需要为保留一个servlet而指定时间。
以上8个步骤就是servlet的生命周期。
三、Servlet和CGI的区别:
概括来讲,Servlet可以完成和CGI相同的功能。
网上还有一篇文章:
CGI应用开发比较困难,因为它要求程序员有处理参数传递的知识,这不是一种通用的技能。CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服于多个客户。Servlet提供了Java应用程序的所有优势——可移植、稳健、易开发。使用Servlet Tag技术,Servlet能够生成嵌于静态HTML页面中的动态内容。
Servlet对CGI的最主要优势在于一个Servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完整的进程。多个客户能在同一个进程中同时得到服务。一般来说,Servlet进程只是在Web Server卸载时被卸载。