CGI(Common Gateway Interface),通用网管接口

通用网管接口,简称CGI,是一种根据请求信息动态产生回应内容的技术。通过CGI,web服务器可以根据请求的不同,启动不同的外部程序。也就是说,对于每个请求,都要产生一个新的进程进行处理。因为每个进程都会占有很多服务器的资源和时间,这就导致了服务器无法同时处理很多的并发请求。另外CGI程序都是与操作系统平台相关的。

Servlet

Servlet最初是在1995年由James Gosing提出的,因为使用技术需要复杂的Web服务器支持,所以当时并没有得到重视,也就放弃了。后来随着Web应用复杂度的提升,并要求提供跟高的并发处理能力,Servlet被重新捡起,并在Java平台上得到实现。

Java Servlet要求必须运行在Web服务器当中,与Web服务器之间属于分工和互补关系。确切的说,在实际运行的时候Java Servlet与Web服务器会融合到一块,如同一个程序一样运行在同一个Java虚拟机当中。与CGI不同的是,Servlet对每个请求都是单独启动一个线程,而不是进程。这种处理方式大幅度的降低了系统中的进程数量,提供了系统的并发处理能力。另外因为Java Servlet是运行在虚拟机上的,也就解决了 跨平台的问题。如果没有Servlet的出现,也就没有互联网的今天。
Servlet侧重解决运算和业务逻辑,JSP侧重于解决展示问题。

两者的对比


  • servlet处于服务器进程中,它通过多线程的方式运行service方法。
  • CGI是一个HTTP请求都会产生一个新的进程,服务完成后就销毁。

  • CGI主要用shell Script或C语言编写
  • Servlet主要使用Java语言编写

  • CGI进程在服务完成后就会被销毁,所以效率上低于Servlet。
  • Servlet进程出于服务器进程中,只有在服务器被卸载时才会被卸载

  • CGI是不可被移植的,是运行于特定平台上的。
  • Servlet是可移植的,运行在JVM上的。

Servlet是线程安全的吗?为什么?

servlet是线程不安全的,因为在tomcat容器中所创建出的servlet对象是单例的,每次请求到达后就会从线程池中启用一个线程去操作servlet对象,如果多个线程操作的是同一个servlet对象,并且使用servlet处理请求的代码中包含有实例对象或者静态变量,就可能造成线程安全问题。但是也要分具体的情况来处理问题。

如果service方法没有访问成员变量或者是静态变量、文件、数据库连接等,而是只是用了当前线程自己的资源,比如临时变量、request、response对象等。该方法本身就是线程安全的那就不需要再进行同步操作。
如果service方法访问 servlet的成员变量但是只对其读操作那就不必进行同步控制,如果进行写操作就需要加上同步语句;如果访问了全局静态变量,既有读也有写操作,通常需要加上同步控制。

解决线程安全问题也可以通过加锁

或者实现 SingleThreadModel 接口。(该接口已经过时)
实现这个接口后,就意味着web容器能够为每个请求创建一个Servlet对象,而不再使用默认的单例模式。

Servlet的生命周期

servlet的生命周期就是从servlet出现到销毁的过程
分以下几个阶段
加载--->实例化---->初始化(为对象的属性赋值)---->请求处理---->销毁
服务器启动时(web.xml中配置load-on-startup=1,默认是0)或者第一次请求该servlet时,会初始化一个Servlet对象,也就是会执行初始化方法init ,该Servlet对象会处理所有客户端请求,service方法中执行,最后服务器关闭时才会调用destory方法销毁该对象,其中加载阶段无法观察,但是初始化,服务,销毁阶段是可以观察到的。

创建Servlet的时机:在tomcat启动时,客户端首次向容器发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有就创建它,然后根据客户端的请求创建HTTPRequest、HTTPResponse对象,从而调用Servlet对象的service方法。

有关Servlet的面试题的更多相关文章

  1. jsp、Servlet的面试题

    3. 谈谈Servlet的生命周期 当接收到请求的时候,容器察看对应的Servlet对象是否存在,如果不存在,需要加载Servetl,实例化Servlet,调用init方法进行初始化.如果已经存在,根 ...

  2. Servlet 的面试题

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

  3. Servlet request 面试题

    使用request获得请求行:String getmethod():获得请求的资源:String getcontextpath():----web应用名称request是一个域对象request完成请 ...

  4. java面试宝典2019(好东西先留着)

    java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...

  5. Tomcat+Servlet面试题都在这里

    下面是我整理下来的Servlet知识点:  图上的知识点都可以在我其他的文章内找到相应内容. Tomcat常见面试题 Tomcat的缺省端口是多少,怎么修改 Tomcat的缺省端口是多少,怎么修改 ...

  6. Java面试题总结系列 Servlet

    Servlet技术主要是为了使用Web上的HTTP协议而设计的.servlet是在WEB服务器上运行的程序.Java Servlet可以用于处理客户请求或生成动态Web网页.先一个实例.然后解释. 先 ...

  7. Java面试题精选(三) JSP/Servlet Java面试逻辑题

    --   JSP/Servlet  Java面试逻辑题   --     很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HT ...

  8. Java面试题:Servlet是线程安全的吗?

    Servlet不是线程安全的. 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP请求时 ...

  9. Servlet面试题归纳

    尊重原创:http://blog.csdn.net/caohaicheng/article/details/38116481 1.说一说Servlet生命周期 Servlet生命周期包括三部分: 初始 ...

随机推荐

  1. 【APIO2018】选圆圈(平面分块 | CDQ分治 | KDT)

    Description 给定平面上的 \(n\) 个圆,用三个参数 \((x, y, R)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出 ...

  2. 使用MySQL乐观锁解决超卖问题

    在秒杀系统设计中,超卖是一个经典.常见的问题,任何商品都会有数量上限,如何避免成功下订单买到商品的人数不超过商品数量的上限,这是每个抢购活动都要面临的难点. 1 超卖问题描述 在多个用户同时发起对同一 ...

  3. css3动画帧

    动画帧实现: css3使用steps来实现逐帧动画,动画过程中可能出现抖动,实乃精度偏差问题. 通常在动画里用到百分比单位时会出现抖动或位移现象,解决方法就是转换成具体的rem或px长度单位. 动画一 ...

  4. STL—— 容器(vector)数据插入insert()方法 的返回值

    vector 容器下的 insert() 方法拥有返回值,由于insert() 方法拥有4种重载函数,他的返回值不尽相同. 第一种,插入单个元素后的返回值: 1 #include <iostre ...

  5. JavaSE20-线程&同步

    1.线程 1.1 基本概念 线程的概念 线程(Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并 ...

  6. jenkins 配置任务

    新建筑任务 ""imuke 建一个自由风格的 要执行python .py程序,我们需要把.py所在的目录设置进去 如果保存的是在svn,需要把他的地址放进去 如图: 设置自动构建时 ...

  7. html 09-HTML5详解(三)

    09-HTML5详解(三) #Web 存储 随着互联网的快速发展,基于网页的应用越来越普遍,同时也变的越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据,传统方式我们以document. ...

  8. js下 Day15、正则表达式

    一.正则表达式简介 什么是正则表达式 正则表达式,也叫规则表达式, 是对字符串操作的一种逻辑公式. 为什么要使用正则? 1.使用极简单的方式,去匹配字符串 2.速度快,代码少 3.在复杂的字符串中快速 ...

  9. redis源码学习之lua执行原理

    聊聊redis执行lua原理 从一次面试场景说起   "看你简历上写的精通redis" "额,还可以啦" "那你说说redis执行lua脚本的原理&q ...

  10. python SQLAlchemy反射生成models

    1.安装SQLAcodegen pip install sqlacodegen 2.使用sqlacodegen生成案列 sqlacodegen mysql://root:123456@127.0.0. ...