Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的,Java applet 是一种当作单独文件跟网页一起发送的小程序,它通常用于在客户端运行,结果得到为用户进行运算或者根据用户互作用定位图形等服务。
     服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口Common GatewayInterface,CGI)应用程序完成的。然而,在服务器上运行 Java,这种程序可使用 Java 编程语言实现。在通信量大的服务器上,JavaServlet 的优点在于它们的执行速度更快于 CGI 程序。各个用户请求被激活成单个程序中的一个线程,而无需创建单独的进程,这意味着服务器端处理请求的系统开销将明显降低。
1.实现过程
       最早支持 Servlet 技术的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 开始支持标准的 Servlet API。Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。这个过程为:
     1) 客户端发送请求至服务器端;
     2) 服务器将请求信息发送至 Servlet;
     3) Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
     4) 服务器将响应返回给客户端。
     Servlet 看起来像是通常的 Java 程序。Servlet 导入特定的属于 Java Servlet API 的包。因为是对象字节码,可动态地从网络加载,可以说 Servlet 对 Server 就如同 Applet对 Client 一样,但是,由于 Servlet 运行于 Server 中,它们并不需要一个图形用户界面。从这个角度讲,Servlet 也被称为 FacelessObject。
一个 Servlet 就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过“请求-响应”编程模型来访问的应用程序。虽然 Servlet 可以对任何类型的请求产生响应,但通常只用来扩展 Web 服务器的应用程序。
目前最新版本为 3.1。

2.生命周期

  1. 客户端请求该 Servlet;
  2. 加载 Servlet 类到内存;
  3. 实例化并调用init()方法初始化该 Servlet;
  4. service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doGet()、doPut()、doTrace()、doDelete()、doOptions());
  5. destroy()。
加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在 Server 启动时强制装载和初始化特定的 Servlet。
Server 创建一个 Servlet的实例
第一个客户端的请求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
一个客户端的请求到达 Server
Server 创建一个请求对象,处理客户端请求
Server 创建一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。

3 工作模式

客户端发送请求至服务器
服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端
 
4 与 JSP 比较
     JSP 和 Servlet 的区别到底在应用上有哪些体现,很多人搞不清楚。简单的说,SUN 首先发展出 Servlet,其功能比较强劲,体系设计也很先进,只是,它输出 HTML 语句还是采用了老的 CGI 方式,是一句一句输出,所以,编写和修改 HTML 非常不方便。
     Java Server Pages(JSP)是一种实现普通静态HTML 和动态 HTML 混合编码的技术,JSP 并没有增加任何本质上不能用 Servlet 实现的功能。但是,在 JSP 中编写静态HTML 更加方便,不必再用 println语 句来输出每一行 HTML 代码。更重要的是,借助内容和外观的分离,页面制作中不同性质的任务可以方便地分开:比如,由页面设计者进行 HTML设计,同时留出供 Servlet 程序员插入动态内容的空间。
      后来 SUN 推出了类似于 ASP 的镶嵌型的 JSP,把 JSP TAG 镶嵌到 HTML 语句中,这样,就大大简化和方便了网页的设计和修改。新型的网络语言如 ASP,PHP,JSP 都是镶嵌型的语言。 这是 JSP 和 Servlet 区别的运作原理层面。
      从网络三层结构的角度看 JSP 和 Servlet 的区别,一个网络项目最少分三层:data layer(数据层),business layer(业务层),presentation layer(表现层)。当然也可以更复杂。Servlet 用来写 business layer 是很强大的,但是对于写 presentation layer 就很不方便。JSP 则主要是为了方便写 presentation layer 而设计的。当然也可以写 business layer。写惯了 ASPPHP,CGI的朋友,经常会不自觉的把 presentation layer 和 business layer 混在一起。
根据 SUN 自己的推荐,JSP中应该仅仅存放与 presentation layer 有关的东西,也就是说,只放输出 HTML 网页的部分。而所有的数据计算,数据分析,数据库联结处理,统统是属于 business layer,应该放在 Java BEANS 中。通过 JSP 调用 Java BEANS,实现两层的整合。
      实际上,微软前不久推出的 DNA 技术,简单说,就是 ASP+COM/DCOM 技术。与J SP+BEANS 完全类似,所有的 presentation layer 由 ASP 完成,所有的 business layer 由 COM/DCOM 完成。通过调用,实现整合。
      为什么要采用这些组件技术呢?因为单纯的 ASP/JSP 语言是非常低效率执行的,如果出现大量用户点击,纯 SCRIPT 语言很快就到达了他的功能上限,而组件技术就能大幅度提高功能上限,加快执行速度。
      另外一方面,纯 SCRIPT 语言将 presentation layer 和 business layer 混在一起,造成修改不方便,并且代码不能重复利用。如果想修改一个地方,经常会牵涉到十几页 code,采用组件技术就只改组件就可以了。
      综上所述,Servlet 是一个早期的不完善的产品,写 business layer 很好,写 presentation layer 就很臭,并且两层混杂。
所以,推出JSP+BEAN,用 JSP 写 presentation layer,用 BEAN 写 business layer。SUN 自己的意思也是将来用 JSP 替代 Servlet。这是技术更新方面 JSP 和 Servlet 的区别。
      可是,这不是说,学了 Servlet 没用,实际上,你还是应该从 Servlet 入门,再上 JSP,再上 JSP+BEAN。
      强调的是:学了JSP,不会用 Java BEAN 并进行整合,等于没学。大家多花点力气在 JSP+BEAN 上。
      我们可以看到,当 ASP+COM 和 JSP+BEAN 都采用组件技术后,所有的组件都是先进行编译,并驻留内存,然后快速执行。所以,大家经常吹的 Servlet/JSP 先编译驻内存后执行的速度优势就没有了。
      反之,ASP+COM+IIS+NT 紧密整合,应该会有较大的速度优势呈现。而且,ASP+COM+IIS+NT 开发效率非常高,虽然bug 很多。
       那么,为什么还用 JSP+BEAN?因为 Java 实在前途远大。微软分拆后,操作系统将群雄并起,应用软件的开发商必定要找一个通用开发语言进行开发,Java 一统天下的时机就到了。如果微软分拆顺利,从中分出的应用软件公司将成为 Java 的新领导者。目前的 Java 大头 SUN 和 IBM 都死气沉沉,令人失望。希望新公司能注入新活力。不过,新公司很有可能和旧 SUN 展开 Java 标准大战,双方各自制定标准,影响 Java 跨平台。
      简单分析了一下 JSP 和 Servlet 的区别和 Java Web 开发方面的发展。随着机器速度越来越快,Java 的速度劣势很快就可以被克服。

Servlet 的由来和实现过程的更多相关文章

  1. servlet请求和响应的过程

    1.加载 Servlet类被加载到Java虚拟机中,并且实例化.在这个过程中,web容器(例如tomcat)会调用Servlet类的公开无参构造函数,产生一个Servlet类的实例对象.默认情况下Se ...

  2. Servlet读取Excel标准化数据库过程记录

    完成数据库的连接 获取连接参数 拷贝1.数据库URL 2.驱动程序类 3.用户 编写Servlet 1.创建连接对象 Connection con = null; PreparedStatement ...

  3. javaweb学习总结二十一(servlet开发入门、servlet生命周期以及调用过程)

    一:servlet开发入门 servlet是sun公司一门开发动态web资源的技术,下面编写一个servlet入门程序: 1:在tomcat服务器webapps目录下新建firstServlet目录, ...

  4. JSP+Servlet 无数据库模拟登录过程

    程序目录结构: index.jsp: <%@ page language="java" contentType="text/html; charset=utf-8& ...

  5. Servlet简单实现开发部署过程

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512008683445027331/ 主要是从下面三个步骤实现我们的预期: (1)构建开发环境: (2)开发Ser ...

  6. Servlet的特点及运行过程

  7. Servlet主要相关类核心类 容器调用的过程浅析 servlet解读 怎么调用 Servlet是什么 工作机制

      WEB简介   Web项目 是 B/S结构 浏览器/服务器模式的 浏览器发起请求,服务器作出响应   请求的发起和响应使用HTTP协议进行通讯 所谓协议也就是一种固定格式   而Socket是应用 ...

  8. Servlet容器启动过程

    参考:https://blog.csdn.net/fredaq/article/details/9366043 一.概念 所谓Servlet容器其实说白了是符合Servlet规范的Java web容器 ...

  9. Spring mvc源码分析系列--Servlet的前世今生

    Spring mvc源码分析系列--Servlet的前世今生 概述 上一篇文章Spring mvc源码分析系列--前言挖了坑,但是由于最近需求繁忙,一直没有时间填坑.今天暂且来填一个小坑,这篇文章我们 ...

随机推荐

  1. 彻底解决iOS项目中 &quot;_OBJC_CLASS_$_XXXService&quot;, referenced from: 的相似问题

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmllcGVuZzEwOQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  2. windows API 实现截图

    參考:http://bbs.csdn.net/topics/330154355 #include "stdio.h" #include "windows.h" ...

  3. zTree实现地市县三级级联DAO接口实现

    zTree实现地市县三级级联DAO接口实现 ProvinceDaoImpl.java: /** * @Title:ProvinceDaoImpl.java * @Package:com.gwtjs.d ...

  4. android109 结构体,联合体,枚举,自定义

    #include <stdio.h> #include <stdlib.h> void study(){ printf("吃饭睡觉打李志\n"); } // ...

  5. OOM-killer 线上设置 +vm +OOM机制

    http://blog.csdn.net/tenfyguo/article/details/9409743 http://blog.csdn.net/tenfyguo/article/details/ ...

  6. C++面试题算法

    #include <iostream> #include <string> using namespace std ; /* 题目:给一个字符串.例如 "ababc& ...

  7. Debian 6解决中文乱码

    DEBIAN下中文显示 一.首先检查LOCALE情况 说明:DEBIAN因为基于GNU所以,对不同地域进行了不同的包支持,以LOCALE形式存在. 1.挂载ISO文件包,前8个ISO包就可以(这里不在 ...

  8. AutoInvoice in Oracle Apps R12

    AutoInvoice in Oracle Apps R12 AutoInvoice is a powerful, flexible tool you can use to import and va ...

  9. 20160326 javaweb 请求转发和请求包含

    (1)请求转发: this.getServletContext().getRequestDispatcher("").forward(request,response); requ ...

  10. javaweb 中的乱码问题

    一.post 方式 首先我们看下面一段代码,在该HTML中我们指定的编码为“UTF-8”,如图所示. 在该代码中,我们将表单数据提交给ParamServlet 处理 servlet 会将接收到的数据打 ...