有关Servlet的面试题
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的面试题的更多相关文章
- jsp、Servlet的面试题
3. 谈谈Servlet的生命周期 当接收到请求的时候,容器察看对应的Servlet对象是否存在,如果不存在,需要加载Servetl,实例化Servlet,调用init方法进行初始化.如果已经存在,根 ...
- Servlet 的面试题
Servlet运行在Servlet容器中,其生命周期由容器来管理.Servlet的生命周期通过javax.servlet.Servlet接口中的init().service()和destroy()方法 ...
- Servlet request 面试题
使用request获得请求行:String getmethod():获得请求的资源:String getcontextpath():----web应用名称request是一个域对象request完成请 ...
- java面试宝典2019(好东西先留着)
java面试宝典2019 1.meta标签的作用是什么 2.ReenTrantLock可重入锁(和synchronized的区别)总结 3.Spring中的自动装配有哪些限制? 4.什么是可变参数? ...
- Tomcat+Servlet面试题都在这里
下面是我整理下来的Servlet知识点:  图上的知识点都可以在我其他的文章内找到相应内容. Tomcat常见面试题 Tomcat的缺省端口是多少,怎么修改 Tomcat的缺省端口是多少,怎么修改 ...
- Java面试题总结系列 Servlet
Servlet技术主要是为了使用Web上的HTTP协议而设计的.servlet是在WEB服务器上运行的程序.Java Servlet可以用于处理客户请求或生成动态Web网页.先一个实例.然后解释. 先 ...
- Java面试题精选(三) JSP/Servlet Java面试逻辑题
-- JSP/Servlet Java面试逻辑题 -- 很显然,Servlet/JSP的WEB前端动态制作的重要性比HTML/CSS/JS的价值高很多,但我们都知道他们都是建立在HT ...
- Java面试题:Servlet是线程安全的吗?
Servlet不是线程安全的. 要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的. 当Tomcat接收到Client的HTTP请求时 ...
- Servlet面试题归纳
尊重原创:http://blog.csdn.net/caohaicheng/article/details/38116481 1.说一说Servlet生命周期 Servlet生命周期包括三部分: 初始 ...
随机推荐
- AcWing 334. K匿名序列
大型补档计划 题目链接 就是把序列分成无数段,每段长度 $ >= K$,然后 \([l, r]\) 这段的花费是 \(S[r] - S[l - 1] - (r - l + 1) * a[l]\) ...
- webstorm实现手机预览页面
效果:在webstorm中开发页面,复制该页面在电脑中的浏览网址,发给手机,在手机上点击链接,可以直接访问本地开发的页面.并且,电脑上修改后保存,手机上刷新即可看到效果. 步骤: 1.webstorm ...
- 查找列表中的元素,移动空格 并查找以a或A 为开头 并以c 结尾的元素
li = ['alec',' aric','Alex','Tony','rain']tu = ('alec',' aric','Alex','Tony','rain')dic = { 'k1':'al ...
- PluginOK中间件高级版-支持在Chrome、Edge、Firefox等浏览器网页中真正内嵌ActiveX等控件运行的版本已获多家上市公司采购
PluginOK(牛插)中间件(原名:本网通WebRunLocal)是一个实现WEB浏览器(Web Browser)与本地程序(Local Application)之间进行双向调用的低成本.强兼容.安 ...
- vue 按键修饰符 keyup
按键修饰符 keyup 通过官方文档可查询到特殊的按键修饰符 .enter .tab .delete (捕获"删除"和"退格"键) .esc .space .u ...
- mysql位函数的使用
查询每个月的访问天数 mysql> create table t1 (year YEAR(4),month int(2) unsigned zerofill,day int(2) u nsign ...
- Raft算法系列教程1:Leader选举
1.服务器的三种角色 Raft算法中服务器主要分为三种角色:Leader.Follower.Candidate,并且三种角色相互独立,也就是服务器在同一时间内只可能扮演其中一种角色. Leader:用 ...
- Zookeeper什么,它可以做什么?看了这篇就懂了
前言 什么是ZooKeeper,你真的了解它吗.我们一起来看看吧~ 什么是 ZooKeeper ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供 ...
- [LeetCode]80. Remove Duplicates from Sorted Array II删除数组中的重复值
和第一题不同的地方是,容忍两次重复 虽然题目上说只需要长度,但是否检测的时候如果数组不跟着改变也是不行的 没说清楚题意 自己是用双指针做的,看了大神的答案更简单 public int removeDu ...
- 【探索之路】机器人篇(5)-Gazebo物理仿真环境搭建_让机器人运动起来
如果完成了前两步,那么其实我们已经可以去连接我们的现实中的机器人了. 但是,做机器人所需要的材料还没有到,所以我们这里先在电脑平台上仿真一下.这里我们用到的就算gazebo物理仿真环境,他能很好的和R ...