servlet难以理解?军哥带你10分钟拿下它

大家好,这里是五彩石编程,我是军哥。做网络相关的开发,经常会听到一个词叫做servlet,和它一起出现的,往往还有jettytomcatjbossspringboot等,概念很多,也很抽象,经常搞得人一头雾水,今天军哥就用10分钟的时间,带你拿下它。


回归最初

首先,回到互联网还是静态页面的时期,那个时候,网页内容都是提前写好的,每次访问,出现的内容都是相同的,现在的人们肯定想象不到,那时候上互联网是怎样的一种体验。

当然有人忍受不了这样的互联网体验,于是后来出现了一种返回动态内容的技术,叫做CGI,common gateway interface,这种技术在每次用户请求时,会启动一个进程,来处理用户的请求,将处理后的结果返回给用户,这样用户就可以看到不同的内容了,页面总算动起来了。

但每次都启动进程的这种方式,太消耗服务器资源了,响应速度也会受到影响,加上那时候的cpu和内存资源还很宝贵,所以又出来了一种叫做fast CGI的技术,先启动一堆的进程,等用户请求来了,哪个进程闲着就让它处理,这样服务器的硬件资源消耗就可控了,响应速度也上来了,比较出名的lamp及lnmp架构就随之出现了。

与此同时,java也在发展一种能让网页能动起来的技术,取名为servlet,但早期的servlet比较难用,于是后面又持续更新了几次,随着更新而出现的就是后来的jsp技术、jsp+javaBean技术、使用mvc分层思路的jsp+servlet+model技术等,一直到了现在。

servlet是什么

servletcgi的思路不同,它走的是在内存中管理用户请求的思路,使用多线程来实现,所以根本不存在多进程管理相关的事情。

那么servlet究竟是什么呢?其实就是一套规范,相当于有几个人在聊天,聊到了动态网页技术,想到了用多线程来实现,于是就深入聊了一下相关技术的细节,聊完后,把聊天的详细内容纪录了下来,取了个名字叫做servlet。光有聊天的内容还很空,无法落地,于是基于聊天的内容,细化整理出来了一套非常详细的规范,在这套规范里,它定义了什么叫做请求,它应该有哪些属性参数,格式是什么,安全问题怎么处理,IO问题怎么处理,cookie怎么处理,编码格式等等。还有其它的比如响应相关的内容、过滤、session、上下文、生命周期等各种细节方面的东西,这些东西整理完了之后,给这份文档打了个编号叫JavaEE7 Servlet 3.1(JSR340)

有了规范还是无法使用,要想使用它让网页动起来,需要这个规范的一个实现才可以,于是java先定义了一个servlet的接口,就是常见的javax.servlet.Servlet接口,有了接口就好办了,所有实现这个接口的类就都是servlet了,这个接口中只有5个方法,那么我们如果简单实现一下这5个方法,我们的类是不是就是servlet了?如果我们写的类严格按照servlet的规范来写,那么它肯定是了,但规范那么复杂,简单写一个怎么可能实现呢?只是从语法上可以说是servlet的实现,但却不合乎servlet的规范。

所以现在你已经明白了,servlet在我们应用中的本质就是一个具体的servlet接口的实现类,查一下jdk源码就可以发现官方已经有servlet的几个实现了。

tomcat和servlet是什么关系

上面我们已经讲清楚了什么是servlet,那jbosstomcatspringbootservlet又有什么关系呢?

现在来思考2个问题:

  1. 如果我们有多个程序,每个程序中都有servlet,那么这些程序该怎么管理呢?
  2. 我们写程序的核心是处理业务上的逻辑,用户的请求怎么解析、安全问题怎么处理、怎么进行响应等等各种问题,如果在每个程序中都需要我们处理,那是不是太麻烦了?

当然还有很多其它原因,各种原因综合到一起,最终有了一个思路,那就是拆分,servlet的管理功能拆分出来,拆出来后的技术实现方案就是tomcatjboss等,还有内置了tomcatspringboot

提到了tomcat,自然会有人想到nginx,两者不都是web服务器吗?区别是什么呢?其实很简单,nginx支持的是cgi技术,是进程间的通信,所以在配置文件中经常可以看到fastcgi_开头的各种配置,而tomcat支持的是servlet技术,是同一个进程内线程间的通信,所以tomcat又常被叫做servlet容器,因为它能够包含很多servlet服务。

springboot和tomcat又是什么关系

那springboot为什么要内嵌tomcat呢?其实原因不难猜测,如果使用单独的tomcat来进行开发与部署,那么就需要手动的配置tomcat,更新代码时,需要打成war包,复制到tomcat指定的目录下,对开发来说不够友好,影响开发效率,在部署时,除了程序的包,还需要额外安装配置一个tomcat,也太麻烦,所以最好的方案就是把tomcat嵌入springboot中。

它又是怎么内嵌进去的呢?其实也不难,tomcat本质上是一个servlet容器,它负责接收用户的请求,再找个空闲的线程,让线程去执行servlet中我们写的业务逻辑即可。那么把tomcat的代码拿过来,因为tomcat本身就是java开发的,所以修改起来也相对简单一点,再与springboot的处理流程整合一下,就成内嵌的tomcat了。


相信现在,你已经对servlet有了比较清晰的了解了吧!但是一个servlet怎么能够处理那么多不同的请求呢?想了解更多的相关技术,请微信搜索并关注 “五彩石编程”公众号,军哥的文章将会持续同步更新。


下课

  • 20
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值