前言
1.Web技术发展历史
早期的Web应用主要用于浏览新闻等静态页面,HTTP服务器(比如Apache、Nginx)向浏览器返回静态HTML,浏览器负责解析HTML,将结果呈现给用户
随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让HTTP服务器调用服务端程序
于是Sun公司推出了Servlet 技术。你可以把Servlet简单理解为运行在服务端的Java小程序,但是Servlet没有main方法,不能独立运行,因此必须把它部署到Servlet容器中,由容器来实例化并调用Servlet
2.重量级Web容器与轻量级Web容器
Tomcat和Jetty就是一个Servlet容器。为了方便使用,它们也具有HTTP服务器的功能,因此Tomcat或者Jetty就是一个“HTTP服务器 + Servlet容器”,我们也叫它们Web容器
其他应用服务器比如JBoss和WebLogic,它们不仅仅有Servlet容器的功能,也包含EJB容器,是完整的Java EE应用服务器。从这个角度看,Tomcat和Jetty算是一个轻量级的应用服务器
3.为什么选择轻量级Web容器
在微服务架构日渐流行的今天,开发人员更喜欢稳定的、轻量级的应用服务器,并且应用程序用内嵌的方式来运行Servlet容器也逐渐流行起来。之所以选择轻量级,是因为在微服务架构下,我们把一个大而全的单体应用,拆分成 一个个功能单一的微服务,在这个过程中,服务的数量必然要增加,但为了减少资源的消耗,并且降低部署的成 本,我们希望运行服务的Web容器也是轻量级的,Web容器本身应该消耗较少的内存和CPU资源,并且由应用本 身来启动一个嵌入式的Web容器,而不是通过Web容器来部署和启动应用,这样可以降低应用部署的复杂度
因此轻量级的Tomcat和Jetty就是一个很好的选择,并且Tomcat它本身也是Spring Boot默认的嵌入式Servlet容器。 最新版本Tomcat和Jetty都支持Servlet4.0规范
4.Web容器对比
| 名称 | 出品 | 出价 | Servlet 容器 | JSP 容器 | EJB 容器 | JMS 容器 | 定位 |
|---|---|---|---|---|---|---|---|
| Tomcat | Apache | 开源免费 | √ | √ | × | × | 普通用在中小型系统和并发访问用户不是很多的业务场景下 |
| Jetty | Eclipse | 开源免费 | √ | √ | × | × | 与 Tomcat 定位一样,不过比 Tomcat 更加轻量级,体积小,扩展灵活,适用于云原生生态下数以千或万计的 Micro 服务单元的部署 |
| JBoss | RedHat | 开源免费 | √ | √ | √ | × | 主要应用于 EJB 服务的中小型公司 |
| WebLogic | Oracle | 不开源收费 | √ | √ | √ | √ | 用于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的java应用服务器。比 JBOSS 更加强大和稳定。(银行、金融、电信等领域) |
| WebShpere | IBM | 不开源收费 | √ | √ | √ | √ | IBM 集成软件平台。其提供了可靠、灵活和健壮的集成软件。功能齐全强大,主要应用于大型企业的大型项目 |
5.Jakarta规范
JDBC规范
全称“Java Connectivity Database”,JDBC规范定义了Java应用程序可以对数据库进行的操作包括:连接数据库、执行SOL语句、执行存储过程等。通过这些操作我们可以向各种关系数据发送SOL语句会更容易,只需要按照JDBC API来编写一个程序即可,这样JDBC对于程序员而言是API,而对于实现与数据库连接的服务提供商而言是接口规范
JNDI规范
全称“Java naming and director interface,Java命名及目录接口”,JNDI规范提供了查找和访问各种命名和目录服务的功能,使用者可以在支持JNDI的服务器中统一管理资源,如数据库资源。JNDI避免了程序与资源之间的紧耦合,使应用更加易于配置,便于部署。例如,如果将JNDI用于数据源,那么就不用关心具体的数据库后台是什么,JDBC驱动程序是什么,JDBC URL格式是什么,访问数据库的用户名和密码是什么等一系列问题。只需要在实现这个规范的J2EE容器 中定义一个数据源,然后通过这个数据源就可以访问后台数据库
EJB规范
全称“enterprise Java beans,企业级 Java Beans”,EJB提供了一个框架来开发和实施分布式商务逻辑,由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发,它定义一个标准自动处理,如数据持久化、事务集成、安全对策等问题,为后台业务提供了一个标准方式。EJB规范讨论了4种对象类型:无状态会话Bean、有状态会话Bean、实体Bean、消息驱动Bean。Stateless Session Bean是一类不包含状态信息的分布式对象,允许来自多个客户端的并发访问。无状态会话Bean没有资源集约性,访问的实例变量内容页不会被保存
RMI规范
全称“remote method invocation,远程方法调用”,RMI是一种远程过程调用机制,能够让某个Java虚拟机上的对象调用另一个 Java虚拟机中的对象的方法,它使得客户机上运行的程序可以调用远程服务器上的对象。我们可以面向该接口编程,而不需要了解底层如何实现调用通信的原理,例如不用关心对象如何序列化,调用协议等
XML规范
全称“extensible markup language,可扩展标注语言”,XML定义了一种与平台无关的通用数据交换格式。通过XML能实现跨平台的通信,XML是平台无关的数据表示(现在都用JSON来代替)
Java Mail规范
Java Mail提供了电子邮件的开发接口,可以方便地执行一些常用的邮件传输。Java Mail包中用于处理电子邮件的核心类包括Session、Message、Address、Authenticator、Transport、Store、 Folder等。例如,Session定义了一个基本的邮件会话,它需要从Properties中读取邮件服务器、用户名和密码等信息
Java Servlet规范
Servlet是服务端的Java应用程序,可以生成动态的页面,在客户端Session中保存客户的数据。它定义了动态生成HTML、XML或其他格式文档的Web网页的技术标准
Java ILD/CORBA规范
全称“Java Interface definition language/common object request broker architecture,Java接口定义语言/公共对象请求代理体系结构”,CORBA是一个分布式的面向对象应用架构规范,定义了分布式对象如何实现互操作。CORBA对象的接口使用IDL定义,在IDL中定义了对象的类型,对象的方法和引用参数以及对象方法可能返回的异常结果,这样,在Java IDL的支持下,开发人员可以将Java和CORBA集成在一起
JAF规范
全称“JavaBeans activation framework,JavaBeans 激活框架”,JAF是一个专用的数据处理框架,用于封装数据,并作为应用程序访问和操作数据的接口。JAF主要作用在于让Java应用程序知道如何对一个数据源进行查看、编辑和打印等操作。应用程序通过JAF提供的接口可以完成:访问数据源中的数据、获取数据源的数据类型、获知可对数据进行的操作。用户执行操作时,自动创建该操作的软件部件的实例对象。Java Mail利用JAF处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象,或者从Java对象转换为MIME字节流。不过,大多数应用都不需要直接使用JAF
JMS规范
全称“Java message service,Java 消息服务”,JMS是Java平台上有关面向消息中间件的技术规范。JMS对象模型包含6个要素:连接工厂,JMS连接、JMS会话、JMS目的、JMS生产者和消费者、JMS消息类型(点对点、发布/订阅)。ActiveMQ用于实现该规范
JSP规范
全称“Java Server pages,Java服务器页面”,JSP页面由HTML代码和嵌入其中的Java代码组成。它将网页逻辑与网页设计显示分离,支持可重用的基于组件的设计,使Java开发变得快速、容易。JSP是一种动态页面技术,主要目的是将表示逻辑从Servlet中分离出来
JTA规范
全称“Java transaction API,Java 事务处理接口”,在Java EE应用中,事务是一个不可或缺的组件模型,它保证了用户操作的ACID(即原子性、一致性、隔离性、持久性)属性。对于那些跨数据源(例如多个数据库,或者数据库与JMS)的大型应用,则必须使用全局事务JTA。应用系统可以由JTA定义的标准API访问各种事务监控,JTA为Java EE平台提供了分布式事务服务,它隔离了事务与底层的资源,实现了透明的事务管理方式
JTS规范
全称“Java transaction service,Java 事务服务”,JTS是一个组件事务监视器。JTS是CORBA OTS事务监控的基本实现。JTS规定了事务管理器的实现方式。JTS事务管理为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务
总结
以上13项便是J2EE(也称为Jakarta EE)的13项规范标准,它们都是接口定义,Java程序员只需要面向这些接口编程就可以,将对应厂商实现的类库加载即可,不需要单独学习不同厂商的类库使用,这便给Java程序员提供了面向接口编程的好处:高度解和定制化,就如同我们直接使用JDBC的接口编程,不需要在自己的代码中体现对MySOL、Oracle等数据库的连接、查询、关闭等细节性的代码,出现的都是JDBC的规范,只需要在代码中创建不同的厂商的数据源即可
6.Servlet规范详解
省略
7.使用idea新建一个Servlet项目
版本
- idea:2021
- jdk:8
- Tomcat:9
- Servlet:4.0
新建流程