Эволюция создания веб-приложений на Java
- вторник, 24 сентября 2019 г. в 00:26:47

| № | Технология, библиотека, фреймворк | Дата первой версии | Дата последней стабильной версии | Популярность, % | ||
|---|---|---|---|---|---|---|
| Тип | Подтип | RebelLabs, 2017 | Java Magazine, 2018 | |||
| 1 | Спецификация | Servlet | 12.1996 | 10.09.2019 | ||
| JSP | 27.09.1999 | 10.09.2019 | ||||
| J2EE, Java EE, Jakarta EE |
12.12.1999 | 10.09.2019 | ||||
| JAX-WS | 28.10.2003 | 10.09.2019 | ||||
| JSF | 11.03.2004 | 10.09.2019 | ||||
| JAX-RS | 08.09.2008 | 10.09.2019 | ||||
| 2 | Spring | Spring MVC | 12.2005 | 02.08.2019 | 28,82 | 36 |
| 3 | Spring Boot | 04.2014 | 02.08.2019 | 13,35 | 40 | |
| 4 | Spring WebFlux | 09.2017 | 02.08.2019 | |||
| 5 | JavaServer Faces | Eclipse Mojarra | 03.03.2004 | 30.11.2018 | 15,2 | 19 |
| 6 | Apache MyFaces | 11.2005 | 23.05.2019 | |||
| 7 | Google Web Toolkit | 16.05.2006 | 19.10.2017 | 7,74 | 6 | |
| 8 | Grails | 10.2005 | 11.07.2019 | 6,35 | 3 | |
| 9 | Struts | 05.2000 | 09.01.2019 | 5,4 | 9 | |
| 10 | Dropwizard | 21.12.2011 | 07.08.2019 | 4,9 | 3 | |
| 11 | Play | 05.2008 | 19.06.2019 | 3,26 | 3 | |
| 12 | JHipster | 21.10.2013 | 20.09.2019 | 2,49 | 3 | |
| 13 | JAX-RS | Apache CXF | 04.2008 | 13.08.2019 | 2,44 | |
| 14 | RESTEasy | 09.2008 | 30.08.2019 | |||
| 15 | Jersey | 05.2010 | 10.09.2019 | |||
| 16 | Restlet | 01.2013 | 01.2018 | |||
| 17 | Vaadin | 2006 | 16.09.2019 | 2,15 | 5 | |
| 18 | Seam | 2007 | 25.07.2013 | 1,94 | ||
| 19 | Wicket | 06.2005 | 09.09.2019 | 1,91 | 2 | |
| 20 | Tapestry | 2000 | 06.09.2019 | 1,9 | ||
| 21 | Spark Java | 2011 | 22.05.2019 | 0,77 | ||
| 22 | Vert.x | 2011 | 22.08.2019 | 0,76 | ||
| 23 | Rapidoid | 08.2014 | 27.05.2018 | 0,25 | ||
| 24 | Lagom | 03.2016 | 04.09.2019 | 0,24 | ||
| 25 | Ratpack | 2013 | 18.08.2019 | 0,13 | ||
| 27 | Javalin | 24.05.2017 | 11.08.2019 | |||
| 26 | Micronaut | 23.10.2018 | 13.09.2019 | |||
| 28 | MicroProfile | TomEE | 27.04.2012 | 21.06.2019 | ||
| 29 | Hammock | 27.02.2014 | 05.03.2018 | |||
| 30 | Thorntail | 01.2016 | 17.07.2019 | |||
| 31 | KumuluzEE | 04.04.2016 | 29.06.2019 | |||
| 32 | Payara Micro | 07.2017 | 28.08.2019 | |||
| 33 | Open Liberty | 19.09.2017 | 06.09.2019 | |||
| 34 | Helidon | 19.09.2018 | 13.09.2019 | |||



web.xml указан класс, унаследованный от абстрактного класса HttpServlet со своей реализацией метода doGet(). Впервые файл web.xml дескриптора развёртывания был упомянут в спецификации Servlet 2.2 (1999 год).web.xml отсутствует. Над тем же классом-наследником от абстрактного класса HttpServlet присутствует аннотация WebServlet, появившаяся в Servlet 3.0 (2011 год).web.xml, есть класс-наследник от абстрактного класса HttpServlet. Servlet 3.0 позволяет посредством реализации интерфейса ServletContainerInitializer добавлять компоненты сервлетов программно, в т.ч. выполняя регистрацию сервлетов. Класс-реализация интерфейса ServletContainerInitializer с помощью концепции Service Provider Interface (SPI) конфигурируется путём указания его имени в файле META-INF/services/javax.servlet.ServletContainerInitializer. Первый модуль создаёт файл JAR. Файл WAR создаёт второй модуль helloworld-web-servlet-interface-war, в списке зависимостей у него указан первый модуль. Подобный подход реализации интерфейса ServletContainerInitializer используют фреймворки JSF и Spring в своих классах FacesInitializer и SpringServletContainerInitializer, соответственно.
Apache Tapestry — настоящий долгожитель среди фреймворков для построения веб-приложений. Его первая версия была выпущена в 2000 году, новые версии продолжают выходить и сейчас. При проектировании Tapestry были позаимствованы идеи из WebObjects, веб-фреймворка, появившегося несколькими годами до этого. В приложениях с применением Tapestry (пример — в модуле helloworld-web-tapestry) используется модульная архитектура и связывание (binding) компонентов пользовательского интерфейса веб-страниц с соответствующими им Java-классами.
Apache Struts появился практически одновременно с предыдущим фреймворком, в мае 2000 года, и тоже продолжает развиваться до сих пор. В примере на его основе (модуль helloworld-web-struts) можно видеть в файле дескриптора развёртывания web.xml указание в качестве фильтра класса StrutsPrepareAndExecuteFilter. Данный класс служит диспетчером запросов, выбирающим соответствующее запросу действие (action). Apache Struts также, как и Tapestry, основан на шаблоне проектирования MVC.
В марте 2004 года вышла спецификация JavaServer Faces и последовательно две её реализации: сейчас называющаяся Eclipse Mojarra (предыдущие названия — Sun JSF Reference Implementation, JSF RI, Mojarra, Oracle Mojarra) и Apache MyFaces. Основным подходом, подкреплённым спецификацией, является использование компонентов. Оба примера (модули helloworld-web-jsf-mojarra и helloworld-web-jsf-myfaces) абсолютно идентичны друг другу, за исключением библиотек-зависимостей. Приложения определяют и отображают на веб-страницах версию реализации спецификации JSF, наименование реализации (Mojarra или MyFaces) и версию реализации.
Июнь 2005 и выход первой версии фреймворка Wicket, идеологически похожего на Tapestry и JavaServer Faces. Компоненто-ориентированный подход и связывание HTML-шаблонов веб-страниц с Java-классами. С июня 2007 года фреймворк относится к Apache Software Foundation, сменив название на Apache Wicket. Пик популярности фреймворка пришёлся примерно на 2008-2009 годы, затем последовал постепенный спад интереса к нему. Новые версии продолжают выходить, пример приложения можно увидеть в модуле helloworld-web-wicket.
В октябре 2005 года вышла первая версия Grails, фреймворка для построения веб-приложений, написанного на JVM-языке Groovy. Как следует и из названия продукта, на его создание оказал сильное влияние Ruby on Rails — фреймворк, написанный на языке Ruby. Также основан на шаблоне MVC. Отличительной особенностью является использование в качестве шаблонов файлов представления GSP (Groovy Server Pages). Пример (модуль helloworld-web-grails) создан, собирается и может быть запущен с помощью Grails Maven Plugin, плагина для Maven.
Первая версия Spring Framework, включающая Spring MVC, появилась в декабре 2005 года. Классом HTTP-сервлета в нём служит DispatcherServlet. Далее приводятся несколько примеров в хронологическом порядке появления возможностей (новых версий спецификации Servlet, выпуска сначала Spring Boot в апреле 2014 года, потом — Spring WebFlux в сентябре 2017 года), которые в них использованы.web.xml указан в качестве сервлета DispatcherServlet. В контроллере с единственным методом, обрабатывающим GET-запрос, присутствуют соответствующие аннотации (Controller и RequestMapping). Представлением (view) служит JSP-файл.web.xml отсутствует и используется возможность, появившаяся в Servlet 3.0, выполнять конфигурирование программно. Совместно применяется класс, унаследованный от AbstractAnnotationConfigDispatcherServletInitializer (в конечном итоге задействуется реализация интерфейса ServletContainerInitializer с SPI), и JavaConfig (конфигурация с помощью программного кода с аннотацией Configuration).
Разработка Vaadin началась в 2002 году в виде дополнения к другому фреймворку, Millstone 3. В течение 2006 года созданное было оформлено в виде законченного коммерческого продукта. До мая 2009 года имел наименование IT Mill Toolkit, только после этого момента став Vaadin. В конце 2007 года его ранее самостоятельно реализованная клиентская часть была заменена на Google Web Toolkit (GWT). В примере (модуль helloworld-web-vaadin) видно, что имеется лишь один файл Java-класса, в котором программно создаются все компоненты пользовательского интерфейса, скрывая при этом низкоуровневые технические подробности.
Весьма интересный продукт, Google Web Toolkit (GWT), появился в мае 2006 года, последняя версия вышла два года назад. Для написания серверной и клиентской части предоставляется возможность использовать один и тот же язык Java. Специальный компилятор преобразует клиентский код на Java в JavaScript. Пример состоит из трёх модулей — helloworld-web-gwt-client (клиентская часть), helloworld-web-gwt-server (серверная часть) и helloworld-web-gwt-shared (код, общий для клиентской и серверной частей). При разработке можно с помощью удобного плагина для Maven запускать клиентскую часть в режиме Super Dev Mode, в котором так называемый Code Server позволяет легко перекомпилировать изменившийся Java-код.
Seam начал свою жизнь в мае 2007 года и прекратил существование в 2012 году. Был основан на Enterprise JavaBeans (EJB3) и JavaServer Faces (JSF). Разрабатывался компанией JBoss, бывшей тогда уже частью Red Hat. Предлагал различные любопытные концепции (например, bijection, для которой существовали соответствующие аннотации). Сайт фреймворка всё ещё существует, но в некоторых его разделах какие-то ссылки уже не являются актуальными. Пример приложения находится в модуле helloworld-web-seam.
Первый вариант спецификации Java API for RESTful Web Services (JAX-RS) вышел в 2008 году (JSR 311), позднее спецификация обновлялась (JSR 339, JSR 370). Наиболее популярные реализации JAX-RS — фреймворки Apache CXF (первая версия — апрель 2008 года), RESTEasy (сентябрь 2008 года), Jersey (май 2010 года) и Restlet (январь 2013 года). Примеры их использования находятся, соответственно, в модулях helloworld-web-jaxrs-apache-cxf, helloworld-web-jaxrs-resteasy, helloworld-web-jaxrs-jersey и helloworld-web-jaxrs-restlet.
Play Framework появился в мае 2008 года. Написан на JVM-языке программирования Scala. Позволяет создавать веб-приложения на его основе как на Scala, так и на Java. Своеобразной особенностью разработчиков Play является приверженность инструменту сборки sbt. По этой причине для написания примера (модуль helloworld-web-play) пришлось приложить некоторые усилия для сборки под Maven, применив для этого соответствующий плагин.
В 2011 году была выпущена первая версия чудесного микрофреймворка Spark, появившегося под влиянием Sinatra, написанного на Ruby. Ему присущи лаконичность, легковесность и минимализм синтаксиса. Пример (модуль helloworld-web-sparkjava) демонстрирует, как буквально в пару строчек можно написать полноценное приложение. Возможностей фреймворка вполне может хватить, если не требуется чего-то слишком сложного в своём приложении.
В 2011 году появился Vert.x, событийно-ориентированный фреймворк, работающий на JVM. Написан под значительным влиянием Node.js, первоначально назывался Node.x. Имеет многоязычную природу, позволяя при применении фреймворка использовать Java, JavaScript, Groovy, Ruby, Ceylon, Scala или Kotlin. Основан на библиотеке Netty, обладает множеством отличительных особенностей и достоинств. Пример находится в модуле helloworld-web-vertx.
Декабрь 2011 года стал начальным временем для существования Dropwizard, авторы которого позиционируют свой продукт как нечто промежуточное между библиотекой и фреймворком. Три основные части, из которых он состоит — это библиотеки Jetty (HTTP), Jersey (JAX-RS) и Jackson (JSON). Продолжает развиваться и в настоящее время, имея даже некоторую популярность. Пример (модуль helloworld-web-dropwizard) показывает типичную структуру веб-приложения на основе Dropwizard.
Ratpack — ещё один фреймворк (кроме Spark), вдохновлённый библиотекой Sinatra и написанный, в значительной степени, на JVM-языке Groovy. В названии обыграна связь Фрэнка Синатры с т.н. крысиной стаей («rat pack»). Первая версия фреймворка была выпущена в 2013 году, новые версии продолжают выходить. Основан на библиотеке Netty, быстрый, минималистичный, простой в использовании, хорошо масштабируемый. Пример можно увидеть в модуле helloworld-web-ratpack.
Октябрь 2013, появление любопытного проекта JHipster, генератора каркаса веб-приложений. Для построения клиентской части поддерживается JavaScript-фреймворки Angular, React и Vue (последний поддерживается пока в экспериментальном режиме). Основой серверной части служит Spring Boot. Для сборки проекта может быть выбран Maven или Gradle. Пример сгенерированного с помощью JHipster приложения находится в модуле helloworld-web-jhipster.
В августе 2014 года вышла первая версия фреймворка Rapidoid, простого, быстрого и модульного. Рекомендуемый модуль, с которого использование фреймворка рекомендуется начать, включает взаимодействие по HTTP, библиотеки Hibernate, Hibernate Validator, MySQL Connector и Logback. При возрастании потребностей используемый набор модулей может быть расширен. Пример (модуль helloworld-web-rapidoid) позволяет оценить минимализм кода, требуемый для получения простого веб-приложения.
Март 2016, выход фреймворка Lagom. Авторы данного программного продукта позиционируют его применение для разбиения старых монолитных приложений на реактивные микросервисы, хорошо масштабирующиеся при их эксплуатации. Фреймворк основан на Akka и Play Framework. Для разработки своих приложений могут быть использованы языки программирования Java или Scala. Пример на основе Lagom находится в модулях helloworld-web-lagom-api и helloworld-web-lagom-impl.
Уже совсем недавнее время, в мае 2017 года выходит легковесная и простая библиотека Javalin. Её создатели сами указывают в благодарностях авторов уже упоминавшихся фреймворков Sinatra и Spark. Библиотека ориентирована на языки Java и Kotlin. Гарантирует отсутствие аннотаций и необходимости наследования каких-либо классов библиотеки, как можно более лаконичный код, поддержку WebSocket, HTTP/2 и асинхронных запросов. Пример на её основе можно увидеть в модуле helloworld-web-javalin.
Восходящая звезда среди веб-фреймворков, первая версия для которой появилась всего год назад, в октябре 2018 года, — Micronaut. Поддерживает JVM-языки программирования Java, Groovy и Kotlin. Существенное его преимущество — быстрый старт приложений на его основе и малое потребление памяти. Это обеспечивается внедрением зависимостей на этапе компиляции, а не во время исполнения. Ещё одна из особенностей — отличная поддержка реактивного программирования, возможно использование библиотек RxJava, Reactor и Akka. Пример (модуль helloworld-web-micronaut) демонстрирует построение простого приложения на основе Micronaut.
Из-за существующей тяжеловесности Java EE у ряда компаний появилась потребность для реализации микросервисов разработать легковесный набор спецификаций, что и было сделано — в сентябре 2016 года увидел свет MicroProfile 1.0. Первоначально набор включал лишь три спецификации (CDI, JAX-RS и JSON-P). Постепенно потребности возрастали, к версии 3.0 список спецификаций значительно вырос.| № | Спецификация | Версия MicroProfile | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 2.0 | 2.1 | 2.2 | 3.0 | ||
| 1 | CDI | 1.2 | 1.2 | 1.2 | 1.2 | 1.2 | 2.0 | 2.0 | 2.0 | 2.0 |
| 2 | Config | 1.0 | 1.1 | 1.2 | 1.3 | 1.3 | 1.3 | 1.3 | 1.3 | |
| 3 | Fault Tolerance | 1.0 | 1.0 | 1.1 | 1.1 | 1.1 | 2.0 | 2.0 | ||
| 4 | Health | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 2.0 | ||
| 5 | JAX-RS | 2.0 | 2.0 | 2.0 | 2.0 | 2.0 | 2.1 | 2.1 | 2.1 | 2.1 |
| 6 | JSON-B | 1.0 | 1.0 | 1.0 | 1.0 | |||||
| 7 | JSON-P | 1.0 | 1.0 | 1.0 | 1.0 | 1.0 | 1.1 | 1.1 | 1.1 | 1.1 |
| 8 | JWT Auth | 1.0 | 1.0 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | ||
| 9 | Metrics | 1.0 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 2.0 | ||
| 10 | Open API | 1.0 | 1.0 | 1.0 | 1.0 | 1.1 | 1.1 | |||
| 11 | Open Tracing | 1.0 | 1.1 | 1.1 | 1.2 | 1.3 | 1.3 | |||
| 12 | Type Safe Rest Client | 1.0 | 1.1 | 1.1 | 1.1 | 1.2 | 1.3 | |||
| № | Фреймворк | Версия MicroProfile | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 1.0 | 1.1 | 1.2 | 1.3 | 1.4 | 2.0 | 2.1 | 2.2 | 3.0 | ||
| 1 | TomEE | 7.1.0 | 8.0.0-M1 | 8.0.0-M2 | 8.0.0-M3 | |||||
| 2 | Hammock | 2.0 | ||||||||
| 3 | Thorntail | 2.1.0. Final |
2.3.0. Final |
2.4.0. Final |
2.5.0. Final |
|||||
| 4 | KumuluzEE | 2.1.0 | 2.5.2 | 3.0.0 | 3.2.0 | 3.2.0 | 3.2.0 | 3.2.0 | 3.5.0 | |
| 5 | Payara Micro | 174 | 181 | 182 | 183 | 183 | 191 | 192 | ||
| 6 | Open Liberty | 17.0. 0.3 |
18.0. 0.1 |
18.0. 0.3 |
18.0. 0.3 |
18.0. 0.4 |
19.0. 0.3 |
19.0. 0.7 |
||
| 7 | Helidon | 0.9.4 | 1.0 | 1.2.0 | 1.2.0 | 1.2.0 | 1.2.0 | 1.2.0 | ||
К первой группе фреймворков относятся те, которые уже существовали на момент выхода MicroProfile 1.0: TomEE (время выпуска первой версии — апрель 2012), Hammock (февраль 2014), Thorntail (ранее называвшийся WildFly Swarm, январь 2016) и KumuluzEE (апрель 2016). Наиболее часто соответствие новому набору спецификаций достигалось для них исключением из существующего продукта всего лишнего. Примеры использования находятся в модулях helloworld-web-microprofile-tomee, helloworld-web-microprofile-hammock, helloworld-web-microprofile-thorntail и helloworld-web-microprofile-kumuluzee.
Во вторую группу фреймворков входят появившиеся позднее выхода первой версии MicroProfile: Payara Micro (июль 2017), Open Liberty (сентябрь 2017) и Helidon (сентябрь 2018). Для данных фреймворков становилось возможным обратное — с самого начала реализации, например, Helidon разрабатывался специально для соответствия MicroProfile, поэтому не имеет в своём составе ничего лишнего. Примеры построения приложений можно видеть в модулях helloworld-web-microprofile-payara, helloworld-web-microprofile-openliberty и helloworld-web-microprofile-helidon.| № | Сервлет-контейнер, серверы приложений | Дата первой версии | Дата последней стабильной версии | Популярность, % | |
|---|---|---|---|---|---|
| Семейство | Наименование | ||||
| 1 | Tomcat | Tomcat | 11.1998 | 17.08.2019 | 41 |
| 2 | TomEE | 04.2012 | 21.06.2019 | ||
| 3 | JBoss | JBoss EAP | 1999 | 22.01.2019 | 15 |
| 4 | WildFly | 1999 | 03.07.2019 | ||
| 5 | Jetty | 2000 | 14.08.2019 | 9 | |
| 6 | WebLogic Server | 11.1997 | 30.08.2017 | 6 | |
| 7 | WebSphere | WebSphere Application Server | 1998 | 02.04.2019 | 5 |
| 8 | Open Liberty | 09.2017 | 14.08.2019 | ||
| 9 | GlassFish | GlassFish Server | 06.06.2005 | 28.01.2019 | 5 |
| 10 | Payara Server | 31.10.2014 | 29.08.2019 | ||


Для демонстрации типичного веб-приложения на Java с графическим интерфейсом была написана программа с эмуляцией базовых функциональных возможностей Twitter: аутентификация, управление учётными записями (создание, редактирование, удаление, поиск по подстроке), главная страница (свойства учётной записи, лента сообщений), создание твитов, подписаться/отписаться.25-26 октября 2019 года в Санкт-Петербурге состоится конференция для Java-разработчиков Joker 2019, на которую до 1 октября можно дешевле купить билеты.
8-9 ноября 2019 года в Москве пройдёт конференция для JavaScript-разработчиков HolyJS 2019 Moscow, на которую до 1 октября тоже действуют скидки на покупку билетов.