用
Java编程
语言构建Web应用程序的发展历史,以及从出现Servlet规范到今天的使用示例。

本文并不声称其整体性和准确性是学术性的。 对所有陈述的事实的解释和给出的示例仅反映了文章作者的知识,观点和错误。 编写本文的目的是试图全面了解
Java Web应用程序的当前状况。 此外,读者可以将呈现的信息用作进一步独立研究的起点。
示例代码位于
GitHub上的存储库中:
本文最后部分的 每个库和框架以及
应用程序的
演示 。 在撰写本文时,
第一个存储库中有37个示例,随着时间的流逝,它们的列表将被更新。
技术,库,框架及其受欢迎程度出现的时间表
为了更容易理解,将数据制成表格并通过图表进一步说明。 如果可能,表元素将有条件地分组。 库和框架按流行程度降序排列。
有关受欢迎程度的信息来自两个来源。 第一个来源是
ZeroTurnaround RebelLabs Web框架 受欢迎程度指数 。 它的最新更新是在2017年底,并且之前有两个博客文章:
第一和
第二 。 第二篇博文的作者
Simon Maple加入了
Snyk ,继续收集和分析这些有用的统计数据。 第二个来源是他的
研究 ,该
研究发表于
2018年11月/ 12月的Java Magazine (问题17)。
在表的顶部已添加了一组规范,在流行度索引中未包括但我仍要提及的框架已添加到表的末尾。
在第一个时间轴上,表中的数据以与表中相同的顺序显示。 现有组按受欢迎程度排名。 在组中(规范,
Spring ,
JSF ,
JAX-RS ,
MicroProfile )元素按其出现的时间顺序排列。 您可以单击任何图片将其放大。

在第二个时间轴上,按照所有元素的第一个版本出现的日期对相同信息进行排序。 不难看出,例如在2001年,用于编写Web应用程序,您只能从两个现有的主要框架
Tapestry和
Struts中进行选择 。 在2014年初,不可能使用
Spring Boot (它的第一个正式版本随后发布),并且使用
Seam (它已经不存在)毫无意义。

饼图显示了
根据RebelLabs在2017年底的框架受欢迎程度指数。 索引中的每个框架都参与一次,即兴趣总数为100。第二张图显示了
Java Magazine,2018的一项研究结果 。 这项研究询问使用了什么Web框架,答案中可以选择多个。 因此,每个百分比都彼此独立,因此无法汇总。

技术指标
所有库的存在的基础是它们所基于的标准和规范。 规范以
Java规范请求 (
JSR )的形式存在,该
规范是通过称为
Java社区过程 (
JCP )的正式过程开发的。
与
Java Enterprise Edition相关的
JSR列表在
此处 。 下表仅显示了从中选择的两个最重要的规范
-Servlet和
Java EE (后者是一组其他规范)。 规范的第一个版本未被接受为
JCP的一部分,因此它们没有
JSR编号。
自2017年9月12日以来,
Java EE已转移到
Eclipse Foundation的管理部门,现在称为
Jakarta EE 。
JCP已被 Jakarta EE规范流程取代,作为制定和采用规范的流程。
使用HTTP Servlet
以下是一些在没有任何库或框架的情况下创建Web应用程序的示例。 带有简短注释的代码位置链接将按顺序给出。 还有更多类似的方法,其中最明显的方法已得到证明。
部署描述符 web.xml
的第一个示例(
helloworld-web-servlet-xml模块)指定了从抽象类
HttpServlet继承的类以及其自己的
doGet()方法的实现。
Servlet 2.2规范(1999)首次提到了部署描述符
web.xml
文件。
在第二个示例(
helloworld-web-servlet-annotation模块)中,缺少
web.xml
部署描述符
web.xml
。 从抽象类
HttpServlet继承的同一类之上
,有一个
WebServlet批注出现在
Servlet 3.0 (2011)中。
第三个示例(
helloworld-web-servlet-interface-jar和
helloworld-web-servlet-interface-war模块)要复杂一些。 它显示了如何使用
ServletContainerInitializer接口的实现,该接口也出现在
Servlet 3.0中 。 在第一个模块
helloworld-web-servlet-interface-jar中 ,仍然没有
web.xml
部署描述符
web.xml
,有一个从抽象类
HttpServlet派生的类。
Servlet 3.0允许
ServletContainerInitializer接口的实现以编程方式添加Servlet组件,包括 执行servlet注册。 通过在
META-INF/services/javax.servlet.ServletContainerInitializer
文件中指定其名称,可以配置使用
服务提供者接口 (
SPI )概念的
ServletContainerInitializer接口的实现类。 第一个模块创建一个JAR文件。 WAR文件创建第二个模块
helloworld-web-servlet-interface-war ,第一个模块在依赖项列表中指定。
JSF和
Spring框架分别在其
FacesInitializer和
SpringServletContainerInitializer类中使用类似的方法来实现
ServletContainerInitializer接口。
Servlet 3.0 (
Servlet 3.1 (2013)-非阻塞I / O,
Servlet 4.0 (2017)
-HTTP / 2支持也引入了异步Servlet。
春天之前的时代
Apache Tapestry是真正的长期Web应用程序框架。 它的第一个版本于2000年发布;现在继续发布新版本。 在设计
Tapestry时 ,借鉴了几年前出现的
WebObjects WebObjects的想法。 使用
Tapestry的应用程序(例如
helloworld-web-tapestry模块)使用模块化体系结构,并将网页用户界面的组件与相应的
Java类绑定在一起。
Apache Struts在2000年5月与以前的框架几乎同时出现,并且一直持续到今天。 在基于它的示例(
helloworld-web-struts模块 )中,您可以在部署描述符文件
web.xml
看到
StrutsPrepareAndExecuteFilter
类作为过滤器的指示。 此类用作请求管理器,选择与请求相对应的操作。 与
Tapestry一样,
Apache Struts也基于
MVC设计
模式 。

2004年3月,发布了
JavaServer Faces规范及其两个连续的实现:现在称为
Eclipse Mojarra (以前称为
Sun JSF参考实现 ,
JSF RI ,
Mojarra ,
Oracle Mojarra )和
Apache MyFaces 。 规范支持的主要方法是组件的使用。 这两个示例(
helloworld-web-jsf-mojarra和
helloworld-web-jsf-myfaces模块 )都完全相同,但依赖库除外。 应用程序定义并在Web页面上显示
JSF规范的实现版本,实现的名称(
Mojarra或
MyFaces )以及实现的版本。

2005年6月发布了
Wicket框架的第一个版本,该版本在思想上类似于
Tapestry和
JavaServer Faces 。 面向组件的方法,并使用
Java类链接Web页面的
HTML模板。 自2007年6月以来,该框架属于
Apache Software Foundation ,并将其名称更改为
Apache Wicket 。 该框架的受欢迎程度大约在2008-2009年达到顶峰,随后人们对该框架的兴趣逐渐下降。 新版本将继续发布;可以在
helloworld-web-wicket模块中看到一个示例应用程序。

2005年10月,发布了第一个版本的
Grails ,这是一个用于构建用
Groovy JVM 语言编写的Web应用程序的框架。 顾名思义,用
Ruby编写的框架
Ruby on Rails对它的创建产生了很大的影响。 还基于
MVC模式 。 一个独特的功能是使用
GSP (
Groovy服务器页面 )视图文件作为模板。 一个示例(
helloworld-web-grails模块)已创建,构建并可以使用
Grails Maven插件 (用于
Maven的插件)运行。
Spring MVC,Spring Boot和Spring WebFlux
Spring框架的第一个版本(包括
Spring MVC )于2005年12月发布。
HTTP Servlet中的类是
DispatcherServlet 。 以下是按时间顺序排列的一些功能出现的示例(新版本的
Servlet规范,于2014年4月首次发布
Spring Boot ,然后于2017年9月发布
Spring WebFlux ),这些
示例已在其中使用。
在第一个示例(
helloworld-web-spring-mvc-xml模块)中,将
web.xml
部署描述符
web.xml
指定为
DispatcherServlet servlet。 在具有处理GET请求的唯一方法的控制器中,有相应的注释(
Controller和
RequestMapping )。 该
视图是一个
JSP文件。
在第二个示例(
helloworld-web-spring-mvc-java模块)中,缺少
web.xml
部署描述符
web.xml
并且
Servlet 3.0中引入的功能用于执行软件配置。 该类继承自
AbstractAnnotationConfigDispatcherServletInitializer (最终使用
SPI实现
ServletContainerInitializer接口的实现)和
JavaConfig (使用带有
配置注释的程序代码进行
配置 )。
第三个示例(
helloworld-web-spring-boot-mvc模块)展示了该项目的显着简化,同时由于
Spring Boot的出现,在保持相同功能的情况下。 除了控制器类,还只有一个类继承自
SpringBootServletInitializer ,并由
SpringBootApplication注释。
第四个示例(
helloworld-web-spring-boot-webflux模块 )显示了与
Spring Boot一起使用
Spring WebFlux的情况 ,
Spring WebFlux是最近才添加到
Spring框架中的 。
Spring WebFlux使用反应原理和
Project Reactor 。 在两种主要方法(
基于 功能样式和
基于注释的方法 )中,第一种涉及示例。
春天来临之后,2000年代
Vaadin的开发始于2002年,是对另一个框架
Millstone 3的补充。 在2006年,创作的作品被定为最终的商业产品。 直到2009年5月,它的名称才
改为 IT Mill Toolkit ,此后才成为
Vaadin 。 在2007年底,其先前独立实现的客户端部分被
Google Web Toolkit (
GWT )取代。 该示例(
helloworld-web-vaadin模块)显示,只有一个
Java类文件可通过编程方式在其中创建所有用户界面组件,同时隐藏了低级技术细节。

2006年5月出现了一个非常有趣的产品
Google Web Toolkit (
GWT ),最新版本发布于两年前。 要编写服务器和客户端部分,您将有机会使用相同的
Java语言 。 特殊的编译器将
Java中的客户端代码转换为
JavaScript 。 该示例包含三个模块
-helloworld-web-gwt-client (客户端部分),
helloworld-web-gwt-server (服务器部分)和
helloworld-web-gwt-shared (客户端和服务器部分的通用代码)。 在开发过程中,您可以使用
便捷的Maven插件以
Super Dev Mode启动客户端部分,在该
模式下 ,所谓的
代码服务器使重新编译更改后的
Java代码变得容易。
Seam于2007年5月开始其生命,到2012年不再存在。 它基于
Enterprise JavaBeans (
EJB3 )和
JavaServer Faces (
JSF )。 由
JBoss开发,然后是
Red Hat的一部分。 他提出了各种有趣的概念(例如
bijection ,对此有
相应的注释 )。 框架的站点仍然存在,但是在其某些部分中,某些链接不再相关。
helloworld-web-seam模块中有一个示例应用程序。
RESTful Web服务的
Java API规范(
JAX-RS )的第一版于2008年发布(
JSR 311 ),后来更新了该规范(
JSR 339和
JSR 370 )。 最受欢迎的
JAX-RS实现是
Apache CXF框架(第一个版本是2008年4月),
RESTEasy (2008年9月),
Jersey (2010年5月)和
Restlet (2013年1月)。 在模块
helloworld-web-jaxrs-apache-cxf ,
helloworld-web-jaxrs-resteasy ,
helloworld-web-jaxrs-jersey和
helloworld-web-jaxrs-restlet模块中分别找到了它们的使用示例。
Play Framework于2008年5月问世。 用
Scala JVM编程
语言编写。 允许您在
Scala和
Java中基于它创建Web应用程序。
Play开发人员的一个独特功能是他们对
sbt构建
工具的承诺。 出于这个原因,为了编写示例(
helloworld-web-play模块),我不得不付出一些努力来使用
合适的插件在
Maven下进行构建。
2010年代,最新时间

2011年,发布了用
Ruby编写的在
Sinatra的影响下发行的精美
Spark微型框架的第一个版本。 简洁主义,语法的轻巧和简约是其固有的特征。 一个示例(
helloworld-web-sparkjava模块 )演示了如何仅用几行就可以编写完整的应用程序。 如果您的应用程序不需要太复杂的内容,那么框架的功能可能就足够了。

2011年,出现了
Vert.x ,这是一个在
JVM上运行的面向事件的框架。 在
Node.js的重大影响下
编写的 ,最初称为
Node.x。 它具有多语言性质,允许您在使用框架时使用
Java ,
JavaScript ,
Groovy ,
Ruby ,
Ceylon ,
Scala或
Kotlin 。 基于
Netty库,它具有许多独特的功能和优势。
helloworld-web-vertx模块中有一个示例。

2011年12月是
Dropwizard诞生的最初时间,
Dropwizard的作者将其产品定位在库和框架之间。 它由三个主要部分组成:
Jetty (
HTTP ),
Jersey (
JAX-RS )和
Jackson (
JSON )库。 目前它仍在继续发展,甚至具有一定的知名度。 该示例(
helloworld-web-dropwizard模块 )显示了基于
Dropwizard的Web应用程序的典型结构。
Ratpack是另一个框架(
Spark除外),其灵感来自
Sinatra库,并且主要使用
Groovy JVM 语言编写。 弗兰克·辛纳屈(Frank Sinatra)与所谓的
鼠包 (“鼠包”)。 该框架的第一个版本于2013年发布,新版本继续发布。 基于
Netty库,快速,简约,易于使用,高度可扩展。 在
helloworld-web-ratpack模块中可以看到一个示例。

2013年10月,好奇的
JHipster项目(一个Web应用程序框架生成器)的问世。 要构建客户端部分,需要支持
JavaScript框架
Angular ,
React和
Vue (在
实验模式下仍支持后者)。 后端基于
Spring Boot 。 要构建项目,可以选择
Maven或
Gradle 。
JHipster生成的应用程序的示例在
helloworld-web-jhipster模块中 。

2014年8月,
Rapidoid框架的第一个版本
发布 ,简单,快速且模块化。 建议开始使用该框架的推荐模块包括通过
HTTP进行交互,
Hibernate ,
Hibernate Validator ,
MySQL Connector和
Logback库 。 随着需求的增加,可以扩展使用的模块集。 一个示例(
helloworld-web-rapidoid模块 )使您可以评估获得简单Web应用程序所需代码的简约性。

2016年3月,发布了
Lagom框架。 该软件产品的作者将其应用程序定位为将旧的单片应用程序分解为可在其运行期间很好扩展的反应性微服务。 该框架基于
Akka和
Play框架 。
Java或
Scala编程语言可用于开发其应用程序。 在
helloworld-web-lagom-api和
helloworld-web-lagom-impl模块中找到了一个基于
Lagom的示例。

最近,在2017年5月,发布了轻量级且简单的
Javalin库。 它的创建者自己通过已经提到的
Sinatra和
Spark框架的作者表示感谢。 该库专注于
Java和
Kotlin语言。 它保证没有注释,并且需要继承任何库类,尽可能简洁的代码,支持
WebSocket ,
HTTP / 2和异步请求。 在
helloworld-web-javalin模块中可以看到基于它的示例。

Web框架中的后起之秀是
Micronaut ,它的第一版仅在一年前(2018年10月)出现。 支持
Java ,
Groovy和
Kotlin JVM编程
语言 。 它的显着优势是基于它的应用程序快速启动和低内存消耗。 这是通过在编译阶段而不是在运行时实施依赖项来确保的。 另一个功能是对反应式编程的出色支持,可以使用
RxJava ,
Reactor和
Akka库。 一个示例(
helloworld-web-micronaut模块 )演示了如何构建一个基于
Micronaut的简单
应用程序 。
微轮廓

由于
Java EE当前的繁重,许多公司都需要微服务来开发一套轻量级的规范,这项工作已经完成了-2016年9月,
MicroProfile 1.0发布了。 最初,该集合仅包含三个规范(
CDI ,
JAX-RS和
JSON-P )。 要求逐渐增加;到3.0版,规范列表已大大增加。
当前,有些Web框架在不同程度上满足
MicroProfile的要求。 选择了其中七个进行演示,以下是框架版本与
MicroProfile版本的对应关系。 有关实现
MicroProfile的所有现有框架的完整信息,请
参见 此处 。

第一组框架包括在
MicroProfile 1.0发行时已经存在的框架:
TomEE (第一个版本于2012年4月发布),
Hammock (2014年2月),
Thorntail (先前称为
WildFly Swarm ,2016年1月)和
KumuluzEE (2016年4月)。 大多数情况下,通过从现有产品中删除所有多余的信息,使他们符合新的一组规范。 使用示例在模块
helloworld-web-microprofile-tomee ,
helloworld-web-microprofile-hammock ,
helloworld-web-microprofile-thorntail和
helloworld-web-microprofile-kumuluzee中 。

第二组框架包括出现在
MicroProfile 第一版之后的框架:
Payara Micro (2017年7月),
Open Liberty (2017年9月)和
Helidon (2018年9月)。 对于这些框架,相反的情况成为可能-从实施之初,例如,
Helidon专为符合
MicroProfile 而开发,因此它的组成没有多余。 在模块
helloworld-web-microprofile-payara ,
helloworld-web-microprofile-openliberty和
helloworld-web-microprofile-helidon模块中可以看到构建应用程序
的示例 。
Servlet容器和应用服务器
Web应用程序在实现相关规范的专用软件(例如
Servlet API )中执行。 以下是目前最受欢迎的servlet容器和应用服务器。 受欢迎程度的百分比也来自
研究结果(问题20)。
时间轴在表中显示每个软件产品的寿命。 您可以看到它们的出现顺序以及最新版本的发布时间。

现在,在部署和发布应用程序时使用越来越多的容器化,因此应用程序服务器的使用变得越来越不相关。
在应用程序中使用Java以外的语言
近来,存在创建混合应用程序的趋势,作为其中包含
Java代码的组件之一。 根据以
Java编程
语言为主要主题的
Java杂志的趋势,在
2017年
1月/ 2月发行的主编栏中,宣布了“ The Polyglot Future”,并将其包含在
JavaScript语言关注的区域中。
在上面已经提到的问题16中的
研究中,他们对
JVM应用程序中使用了哪些非
JVM语言感兴趣。 领导者(57%)是前端使用的
JavaScript 。 鉴于某些Web应用程序根本没有
GUI (服务,微服务,服务)的事实,我们可以放心地说
Java应用程序中的图形界面使用
JavaScript框架已很普遍。

今天的典型Java应用程序示例

为了演示带有图形界面的典型
Java Web应用
程序 ,编写
了一个
程序 ,
其中模拟了Twitter的基本功能 :身份验证,帐户管理(创建,编辑,删除,按子字符串搜索),主页(帐户属性,消息提要),创建推文,订阅/取消订阅。
后端使用
Spring Boot编写,前端使用流行的
Angular JavaScript框架
编写 。 在应用程序的
Java部分中,最大程度地表示了
Spring系列的组件:
Spring MVC ,
Spring Boot ,
Spring Security ,
Spring Test ,
Spring Boot Admin 。 后端
REST API使用
Swagger呈现。
JUnit ,
Spring Test ,
Mockito ,
TestContainers (unit-
Java -)
Jasmine Protractor (unit- end-to-end-
JavaScript Angular ).
(
Spring Boot Angular )
,
TechTrain 2019 .
结论
Java , -, . , , , , .
, ,
GitHub :
,
.
JUG Ru Group春季:- 叶夫根尼·鲍里索夫(Evgeny Borisov)的“开膛手的春天”(JPoint 2014:视频,演示)
- «Spring Data? , !», ( Joker 2014 : , )
- «Spring Puzzlers: Spring», ( Joker 2014 : )
- «Spring Puzzlers — », ( JPoint 2015 : , )
- «The Bootiful Application», Josh Long ( Joker 2015 : , )
- « Spring Boot Starter», ( JPoint 2016 : , )
- «Spring – », ( JPoint 2017 : , )
- « Spring Test», ( JPoint 2017 : , )
- «Boot yourself, Spring is coming», ( Joker 2017 : )
- « Spring 5/Reactor», ( Joker 2017 : )
- «Spring Framework 5.0 on JDK 8 & 9», Juergen Hoeller ( JPoint 2018 : , )
- «Spring Framework 5: feature highlights and hidden gems», Juergen Hoeller ( JPoint 2018 : , )
- «Camel microservices with Spring Boot and Kubernetes», Claus Ibsen ( JPoint 2018 : , )
- «Spring Boot Xtend: c », ( JPoint 2018 : , )
- «Boot yourself, Spring is coming», ( JPoint 2018 : 1 2 , )
- «Spring Boot 2: release notes», ( Joker 2018 : , )
- «The Proxy fairy and the magic of Spring», Victor Rentea ( JPoint 2019 : , )
- « Spring Boot, : AOT- Spring-», ( JPoint 2019 : , )
- «Reactive reactive, », ( JPoint 2019 : , )
- « Spring Boot- Java 8 11: ?», ( JPoint 2019 : , )
Play :
- «50 Play!», ( Joker 2015 : )
Vaadin :
- « — web UI Java desktop-», ( JPoint 2018 : , )
- « Vaadin Flow», ( JPoint 2019 : , )
Vert.x :
- «Vert.x: », ( Joker 2015 : )
- «Vert.x: », ( Joker 2016 : , )
- « Vert.x », ( JPoint 2018 : , )
Micronaut :
- «Micronaut vs Spring Boot, ?», ( Joker 2018 : , )
MicroProfile :
- «Microprofile.io: », ( Joker 2018 : , )
Java JavaScript :
- «JavaScript in the nterprise», Markus Eisele ( Joker 2014 : , )
- «Java(Script) on JVM», ( Joker 2015 : )
UPD :
Quarkus (
helloworld-web-quarkus )
ActFramework (
helloworld-web-actframework ), .. 39.
25-26 2019 - Java- Joker 2019 , 1 .
8-9 2019 JavaScript- HolyJS 2019 Moscow , 1 .