早期Web应用主要用于浏览新闻等静态页面,HTTP服务器(比如Apache、Nginx)向浏览器返回静态HTML,浏览器负责解析HTML,将结果呈现给用户。
随着互联网的发展,已不满足于仅浏览静态页面,还希望通过一些交互获取动态的结果,因此也就需要机制能让HTTP服务器调用服务端程序。
于是Sun公司发布Servlet,相当于运行在服务端的Java小程序,但Servlet无main方法,无法独立运行,因此必须把它部署到Servlet容器,由容器来实例化并调用Servlet。
而Tomcat和Jetty就是一个Servlet容器。为了方便使用,它们也具有HTTP服务器的功能,因此Tomcat或Jetty就是一个“HTTP服务器 + Servlet容器”,也叫Web容器。
其他应用服务器比如JBoss和WebLogic,它们不仅仅有Servlet容器的功能,也包含EJB容器,是完整的Java EE应用服务器。从这个角度看,Tomcat和Jetty算是一个轻量级应用服务器。
微服务时代的我们更喜欢稳定、轻量级的应用服务器,最流行的就是SpringBoot应用程序用内嵌方式运行Servlet容器。
因此轻量级的Tomcat和Jetty就是一个很好的选择,并且Tomcat它本身也是Spring Boot默认的嵌入式Servlet容器。最新版本Tomcat和Jetty都支持Servlet 4.0规范。
像Java这种高级语言,其实都是对操作系统API的封装,上层应用包括Web容器都是通过操作系统来工作的,因此掌握相关的操作系统原理是我们深刻理解Web容器的基础。
对于Web容器来说,操作系统方面你应该掌握它的工作原理,比如
推荐阅读名著
《UNIX环境高级编程》。
推荐的经典书籍有《Java核心技术》、《Java编程思想》、《Java并发编程实战》和《深入理解Java虚拟机:JVM高级特性与最佳实践》等。
学习一些通用的设计原则和设计模式。了解Web的工作原理,同时提高你的设计能力,注重代码的质量。我的建议是可以从学习Servlet和Servlet容器开始。
Web框架的本质是,开发者在使用某种语言编写Web应用时,总结出的一些经验和设计思路。很多Web框架都是从实际的Web项目抽取出来的,其目的是用于简化Web应用程序开发。
我以Spring框架为例,给你讲讲Web框架是怎么产生的。Web应用程序的开发主要是完成两方面的工作。
就好比制造一辆汽车,汽车是由零件组装而成的。第一步是画出各种零件的图纸,以及定义零件之间的接口。第二步把把图纸交给工厂去生产零件并组装在一起。因此对于Web应用开发来说,第一步工作是具体业务逻辑的实现,每个应用都不一样。而第二步工作,相对来说比较通用和标准化,工厂拿到零件的图纸,就知道怎么生产零件并按照零件之间的接口把它们组装起来,因此这个工作就被抽取出来交给Spring框架来做。
Spring又是用容器来完成这个工作的的,容器负责创建、组装和销毁这些类的实例,而应用只需要通过配置文件或者注解来告诉Spring类与类之间的关系。但是容器的概念不是Spring发明的,最开始来源于Servlet容器,并且Servlet容器也是通过配置文件来加载Servlet的。你会发现它们的“元神”是相似的,在Web应用的开发中,有一些本质的东西是不变的,而很多“元神”就藏在“老祖宗”那里,藏在Servlet容器的设计里。
Spring框架就是对Servlet的封装,Spring应用本身就是一个Servlet,而Servlet容器是管理和运行Servlet的,因此我们需要先理解Servlet和Servlet容器是怎样工作的。
当你在看一个框架的技术细节时,会突然恍然大悟:对啊,就是应该这么设计!如果你有这种感觉,说明你的知识储备起到了作用,你对框架的运用也会更加自如。