posts - 108,comments - 56,trackbacks - 0
     ☆Servlet与CGI区别 
  Servlet可以和其他资源(文件、数据库、Applet、Java应用程序等)交互,以生成返回给客户端的响应内容。如果需要,还可以保存请求-响应过程中的信息。
 
  采用Servlet,服务器可以完全授权对本地资源的访问(如数据库),并且Servlet自身将会控制外部用户的访问数量及访问性质。 
  
  Servlet可以是其它服务的客户端程序,例如,它们可以用于分布式的应用系统中。 

  可以从本地硬盘,或者通过网络从远端硬盘激活Servlet。 

  Servlet可被链接(chain)。一个Servlet可以调用另一个或一系列Servlet,即成为它的客户端。 

 采用Servlet Tag技术,可以在HTML页面中动态调用Servlet。 

 Servlet API与协议无关。它并不对传递它的协议有任何假设。 

 像所有的Java程序一样,Servlet拥有面向对象Java语言的所有优势。 

 Servlet与CGI-BIN概括来讲,Servlet可以完成和CGI相同的功能。 

 CGI应用开发比较困难,因为它要求程序员有处理参数传递的知识,这不是一种通用的技能。CGI不可移植,为某一特定平台编写的CGI应用只能运行于这一环境中。每一个CGI应用存在于一个由客户端请求激活的进程中,并且在请求被服务后被卸载。这种模式将引起很高的内存、CPU开销,而且在同一进程中不能服务多个客户。 

 Servlet提供了Java应用程序的所有优势:可移植、稳健、易开发。使用Servlet Tag技术,Servlet能够生成嵌于静态HTML页面中的动态内容。 

 Servlet对CGI的最主要优势在于一个Servlet被客户端发送的第一个请求激活,然后它将继续运行于后台,等待以后的请求。每个请求将生成一个新的线程,而不是一个完整的进程。多个客户能够在同一个进程中同时得到服务。一般来说,Servlet进程只是在Web Server卸载时被卸载。


     ☆Servlet与Applet的共同点
  1、都不是独立的运用程序,没有main()方法;
 
   2、都不是由用户或者程序员调用,而是由另外一个容器调用;

   3、都由一个生命周期,包含init()和destroy()方法;


     ☆生命周期
  1、在服务器启动时,当servlet被客户首次请求或被配置好,这时由服务器加载servlet。Servlet的加载可以通过和用一个自定义的Java类加载工具(可允许自动Servlet重载)从本地或远程地址来实现。

  2、服务器创建一个servlet类实例来为所有请求服务。利用多线程,可以由单个servlet实例来服务于并行的请求。惟一的例外是,因为实现SingleThreadModel接口的servlet,这样,服务器会创建一个实例池并从中选择一个来服务于每一新的请求。此步相当于以下java代码:Servlet s = (Servlet)c.newInstance();

  3、服务器调用Servlet的init()方法。它用来保证完成在首次请求servlet处理以前的执行过程。如果servlet创建了多个servlet实例,则为每个实例调用一次init()方法。在调用初始化时,要给init()方法传入一个ServletConfig对象,ServletConfig对象包含了初始化参数和容器环境的信息。

  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而指定时间。 


     ☆几个主要的类/接口
  1、Servlet接口
  javax.servlet.Servlet接口是所有java servlet的基本接口,Servlet的生命周期由这个接口定义。

  2、GenericServlet类
  GenericServlet类实现了Servlet接口,因此可以通过扩展此类间接实现Servlet接口。GenericServlet中具体实现了Servlet接口中的init()、destroy()、getServletConfig()和getServletInfo()方法,但是只定义了抽象service()方法。因此在扩展的时候必须实现service()方法。

  3、HttpServlet类
  HttpServlet是GenericServlet的子类,为Servlet接口提供了面向HTTP协议的实现代码。

  4、HttpServletRequest接口
  HttpServletRequest接口是对Http协议请求信息的封装,用(key/value)对的形式来存储数据。

  5、HttpServletResponse接口
  HttpServletResponse接口是对Http协议响应信息的封装。
posted on 2007-10-14 20:16 破茧而出 阅读(413) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: