Servlet已经被很多框架深深地隐藏了起来
## Servlet + JSP
当时的Web 服务器只能处理静态的HTML页面,图片,JavaScript这样的东西,比如Apache的这个著名的Web服务器。
人类想要看一点动态的内容,比如什么留言板,购物网站等,还得靠极为难用的 CGI。
后来的Servlet一出现,CGI就被抛弃了。
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180820091429.png?picgo)
著名的开源论坛软件 Jive 就是Jsp+ Servlet的巅峰之作
其他JSP也可以当Controller,但是代码太过冗长。JSP本质上也是Servlet,只是穿上了一层外衣,可以让程序员们轻松写动态页面,实际运行的时候还是会编译成Servlet类。
所以Servlet和JSP都生活在Servlet Container当中,所谓Container就是可以执行Servlet和JSP的一个东西,比如说Tomcat或者说Jetty
但是不论是JSP还是Servlet,能处理的只有HTTPQ请求,必须有人把HTTP请求发给他们。
一般这种事情可以让Tomcat,Jetty来做,他们自己可以接收HTTP请求,然后转发给JSP或者Servlet
当然Tomcat也可以从Apache那里接收HTTP请求,然后发给Servlet处理,处理完了以后再转发给Apache,最后给到人类的浏览器。
这种方法虽然麻烦,但是好处在于非常灵活,扩展性好,比如一个Apache可以把请求分发给后台多个Tomcat之一
Apache,Nginx 他们专心致志地去处理静态内容 (HTML, JS, 图片),Tomcat等执行业务逻辑,访问数据库,生成页面返回
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180820092036.png?picgo)
## 应用服务器
当应用程序开发越来越多的时候,出现了一些通用的需求,比如安全、事务、分布式等。
这些需求应用程序不愿意处理,操作系统也不愿意处理,那么的可以把这些大家都不愿意做的事给中间件来做。
所以Java搞出了一大堆规范,比如EJB,JMS,JTA等,也把Servlet和JSP合并到其中,形成了J2EE
其中EJB生活在EJBContainer中,号称可以支持真正的分布式计算:一个EJB可以有多个实例,分布到多个服务器中,应对用户的请求。
人们把 Servlet Container 称为 Web Container , 和 EJB Container 一起,还有其他的一些东西,被合并到一个叫做 Application Server 当中去了。 最知名的几个 Application Server 就是 Weblogic , WebSphere , JBoss。
国内的金蝶也实现过一个,叫做 Apusic
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180820092424.png?picgo)
## 退居幕后
EJB却是一个扶不起的阿斗,它笨重、性能低下、难于测试,昂贵。
大家纷纷开始使用框架,比如Structs,SpringMVC
在这些框架里面Servelt虽然处于一个非常重要的角色,但是通常情况下只需要配置Web.xml就可以了。
Container把HTTP请求传递给Servelt,但是它却不能禽兽处理,需要传递给框架,框架再分派给Controller
而程序员所需要做的事情就是写Controller,Service,DAO等
框架极大的减少了人们的工作量:
之前对于每个 HTTP 请求,程序员得手工地去解析 URL, 调用相关的 Java Bean。
现在只需要用个配置文件或者注解就可以把 URL 给映射到一个 Java 类。
之前对于 HTTP 请求中的参数, 程序员也得手工解析和验证。
现在也可以直接映射到 Java 对象或者变量
![](http://p8a6vmhkm.bkt.clouddn.com/picgo20180820092854.png?picgo)
后来出现了一个Spring Boot的东西,Servlet彻底给隐藏了。
像Tomcat和Jetty这样的Servlet Container也被内嵌到了Spring Boot中,程序员开发的Web应用,竟然可以像一个普通的Java程序一样从main开始运行。
## 威胁来临
虽然Servet退居幕后,但是核心地位依然稳固,专门处理HTTP请求。
直到Netty出现,它完全不用Servlet Container,也就是说人家本来就是一个Container
Servlet只能处理HTTP,而Netty可以支持各种各样的协议:HTTP,FTP,UDP等。
甚至还支持自定义协议。程序员完全可以自定义一套应用的RPC协议,放到Netty上运行。
Netty的底层是Java NIO,又封装了Java NIO复杂的技术细节,可以轻松实现高性能、高可靠的网络服务器。
所以有可能以后就是用Netty开发的服务器端,运行着众多的Web 服务器,他们之间使用私有的协议互相调用,效率极高,性能极高。
不过目前直接使用Netty的程序员不多,虽然有不少人在使用基于Netty的Dubbo,但是Netty也被封装隐藏起来了。