java web приложение примеры

Создаём веб-приложение с Java Servlets

Авторизуйтесь

Создаём веб-приложение с Java Servlets

Одной из самых приятных особенностей Java является её многогранная природа. Конечно, создание традиционных десктопных и даже мобильных приложений — это здорово. Но что, если вы хотите уйти с проторенных дорожек и зайти на территорию разработки web приложений на Java? Для вас есть хорошая новость: в комплекте с языком идёт полноценный Servlet API, который позволяет вам создавать надёжные веб-приложения без особых хлопот.

Это статья для продолжающих. Если вы только начинаете знакомство с Java, советуем пройти быстрый старт, посмотреть видеокурс и выбрать одну из книг для новичков.

Создание приложений на Java с помощью Servlets

Встречайте сервлеты, особый тип Java-программ, выполняемый в пределах веб-контейнера (также называемый контейнером сервлетов, как, например, Tomcat и Jelly), которые позволяют обрабатывать запросы клиентов и ответы сервера просто и эффективно. Сейчас не время и не место дотошно объяснять вам, что из себя представляет сервлет. Достаточно сказать, что сервлеты создаются и уничтожаются их контейнерами, а не разработчиком, и действуют как промежуточный уровень между клиентами (как правило, веб-браузерами) и другими приложениями, запущенными на сервере (например, базами данных).

Сервлет — классная штука, которая помимо всего прочего может принимать данные от клиента, как правило через GET и POST-запросы, работать с cookie и параметрами сеанса. А ещё она обрабатывает данные через дополнительные уровни приложений и отправляет выходные данные клиенту как в текстовом, так и в бинарном форматах (HTML, XML, PDF, JPG, GIF и т.д.), во многих случаях используя Java Server Pages (JSP) файлы.

Лучше всего начинать работу с сервлетами через конкретный пример. Мы создадим простое веб-приложение, которое позволит клиентам регистрироваться с помощью простой HTML-формы. Данные, предоставленные клиентами, будут собираться сервлетом и проверяться валидаторами.

Разбираемся с конфигурационными файлами

Чтобы вы понимали структуру нашего будущего приложения, вот как она будет выглядеть:

java1

Первым шагом к созданию приложения является определение так называемого дескриптора развёртывания. Он указывает, как приложение должно быть развёрнуто в определенной среде. Когда дело касается веб-приложений, дескриптор развёртывания представляет собой простой XML-файл, называемый web.xml и является частью стандартной спецификации Java EE. В нашем случае он будет выглядеть так:

Так как наше приложение будет использовать Servlet API и Java Servlet Pages (JSP) для отображения данных клиента, нам нужно загрузить все необходимые JAR. Maven сделает за нас трудную работу, вот как будет выглядеть файл POM:

Если говорить просто, pom.xml определяет все зависимости, необходимые для работы с сервлетами: JSP, Java Standard Tag Library (JSTL) и Java Expression Language (JEL).

Итак, мы уже создали конфигурационные файлы приложения. Однако в текущем состоянии оно буквально ничего не делает. Мы хотим, чтобы клиенты могли регистрироваться с помощью HTML-формы, поэтому следующее, что нам нужно сделать, — это создать JSP-файлы, которые будут отображать вышеупомянутую форму и данные клиента после успешного завершения регистрации. Этим мы сейчас и займёмся.

Работаем над внешним видом

Внешний вид приложения будет определяться двумя JSP-файлами — в контексте MVC они называются представлениями. Первый будет отвечать за отображение формы регистрации и возможных ошибок, вызванных после проверки введённых данных. Второй будет обычной страницей приветствия, в которой будут показаны данные, введённые клиентом, после успешного завершения процесса регистрации.

Вот первый JSP-файл:

Скоро мы увидим, как сервлет связывается с URL processcustomer и как он взаимодействует с введёнными данными. А пока давайте посмотрим на JSP-файл, который отвечает за страницу приветствия:

Теперь, когда мы разобрались с отображением страниц, следующим шагом будет создание сервлета, ответственного за сбор данных клиента из POST-запросов и подтверждение данных простым способом.

Пишем контроллер

Написать сервлет, способный получить данные из формы регистрации, проще простого. Всё, что нам нужно сделать, — это написать подкласс для класса HttpServlet и реализовать его методы doGet() или doPost() (или оба, если надо). В данном случае сервлет будет взаимодействовать с данными, поступающими из POST-запросов.

Вот как он выглядит:

Валидаторы — это простые классы, которые проверяют определённые свойства, например, является ли строка пустой и выглядит ли email как email. На GitLab автора можно посмотреть на их реализацию.

Результат валидации влияет на дальнейший ход событий: если данные не валидны, клиент перенаправляется через объект RequestDispatcher на страницу регистрации, где отображаются соответствующие ошибки. Если всё в порядке, то отображается страница приветствия.

Итак, мы создали целое веб-приложение на Java, которое позволяет зарегистрировать клиентов с помощью HTML-формы, базового сервлета и нескольких JSP-файлов. Пора его запустить.

Запускаем приложение

Для запуска приложения нужно проделать следующие шаги:

Заключение

Итак, вы приобрели все навыки, необходимые для создания собственного веб-приложения на Java без необходимости прибегать к сложным фреймворкам. Всё, что вам нужно, — Servlet API, технология вроде JSP для отображения и встроенные средства Java. Здорово, правда?

Стоит отметить, что реализация класса CustomerController подчеркивает достоинства и недостатки сервлетов: с одной стороны, он вкратце показывает, насколько легко обрабатывать параметры запроса и отправлять ответы клиенту в разных форматах. Но эта функциональность имеет свою цену: обе реализации интерфейсов HttpServletResponse и HttpServletResponse являются обычными локаторами служб. Нельзя сказать, что это плохо, поскольку локаторы просто содержат данные. Однако нужно помнить, что эти реализации будут всегда привязаны к сервлету.

Источник

Веб-платформа на Java за 30 минут

Опытные разработчики могут не читать дальше, так-как эта статья рассчитана скорее на новичков, но всё-же я был бы очень рад, если бы кто-нибудь оставил конструктивную критику в мой адрес или указал на ошибки.

В этой статье я бы хотел рассказать начинающим разработчикам, как можно с минимальными усилиями создать свою веб-платформу начального уровня.

В статье я расскажу, как практически с нуля можно, даже не владея огромным стеком технологий, развернуть на удаленном облаке свой собственный уютненький ресурс. Это может быть ваш личный блог, какой-то интересный сервис или просто ресурс о котором вы давно мечтаете. Что может быть приятнее, чем отправить другу ссылку на свой собственный ресурс и вместе обсудить какие-то интересные моменты или просто посмеяться.

Для предпринимателей или начинающих бизнесменов, или владельцев каких-либо площадок будет интересно узнать, что им в начале их бизнеса совсем не обязательно вкладывать большие деньги на «крутой» сайт, а достаточно воспользоваться открытыми библиотеками и единственное за что заплатить — это за то, чтобы взять в аренду виртуальный сервер.

В статье я покажу, как сделать простейший сайт, имеющий простую функциональность. Это скорее статья, посвященная именно тому, чтобы показать общую концепцию и помочь начинающим разработчикам сформировать понимание того, как именно создаются такие известные ресурсы, как Google, Facebook, Вконтакте.

Вы должны понимать, что все интернет-сервисы создаются по одному принципу, отличаются только детали и реализация каких-то уникальных и конкретных вещей, но суть остаётся единой.

Для тех, кто заинтересовался:

Подготовка

Установка того, что нам понадобиться:

Писать наш сервис мы будем на Java, как самом распространённом языке для веб-сервисов.

Проверьте, что на вашем компьютере установлена последняя версия Java, сейчас это 8 версия. Проверить это можно здесь проверить Java. В 97% случаях так оно и есть, но если это не так, то следуя инструкциями на этом сайте вы без труда исправите это, установив и настроив окружение.

Если же всё-таки это не удалось, сразу договоримся с вами так, первым делом вы пытаетесь решить проблему на этих сайтах:

Вообще, открою вам секрет, в программировании, когда у вас всё заработало с 1 раза — это означает только одно, что что-то не работает. Это неоспоримый факт. Куча ошибок, несовместимость версий, отсутствие в библиотеке классов и прочее — это нормальное явление.

Ваш покорный слуга сам просидел 3 недели с ошибкой, облазив такие закоулки интернета, что на какое-то время потерял связь с реальностью и пролежал несколько месяцев в психиатрической больнице, но не будем об этом… Это история для отдельной статьи.

Итак, Java стоит — всё хорошо.

Теперь нам нужен инструмент. Да, нам нужна идея. Качаем и ставим отсюда JetBrains.

Только учтите, что вам нужна именно Ultimate — версия. Простая версия не позволяет разрабатывать веб-приложения. Там есть бесплатный пробный период на 30 дней, думаю с этим не будет проблем.

Итак, среда разработки есть, Java есть.

Начнём

В своё время я перечитал кучу статей и прочего, и решил, что в этой статье я исключу по максимуму картинки и визуальную составляющую, обычно она только отвлекает, у меня может быть другая версия, другой порядок модулей и прочее.

Часто вижу вопросы от новичков про такие интересные вещи, как Spring и Hibernate (https://spring.io/, hibernate.org). В 96% случаях вам это пока что не надо, и без хорошей подготовки и хорошего скилла «solve problem» вы увязните там очень надолго и выбраться обратно будет очень тяжело.

Ваша альма-матер на первых порах — это 2 технологии:

«Application server». Что это такое? А вот, что Application server.

Концепция веб-ресурсов

Суть такая, сервер. Что такое сервер? Это программный код, который «зацикленно» крутиться в системе и слушает порты. Это тема отдельного разговора. Но в общем, рассмотрим 2 варианта того, что вообще сервер умеет делать, он умеет отдать данные (GET) — просто вернуть число, страницу, или ещё бог знает что. Но, есть ещё и POST — он тоже возвращает данные, но и принимает от клиента их перед этим.

Если ничего не понятно, читаем тут ru.wikipedia.org/wiki/REST.

Статья начинает слишком сильно расти. Теперь буду стараться писать более кратко.

Идём в мой репозиторий. Предполагаем, что человек совершенно не понимает, что такое система контроля версий, поэтому идём путём дилетанта, там есть кнопка («Download ZIP» — качаем и разархивируем).

В окне приветствия идеи есть кнопка «import project» — жмём. Выбираем скачанный и разархивированный проект.

Жмём далее, далее и далее, пока не откроется проект.

Первые сложности

Проект открыт, но вы не запустите сервер и не сможете открыть сайт. Почему? Потому что, идея не знает, что ей делать, она умна, но не настолько.

Объяснение того, как это сделать, заняло бы пару страниц и оказало бы вам «медвежью» услугу. Первые сложности — первые трудности. Это будет вашим «боевым крещением». Программировать — не пирожки печь. Ссылки сверху вам помогут. Потратить 1-2 часа на это — это нормально. Я знаю хороших и опытных программистов, которые сидели несколько дней, но так и не сумели правильно запустить сервер. Это не делает им чести — но факт — есть факт. Вперед. Запустите — возвращайтесь к чтению.

Не забудьте сообщить идее, что используем tomcat (как? ссылки вверху, по ним есть ответ).

Локальное тестирование сервиса

Получиться у вас должно примерно вот это:

image loader

Но есть проблема — не работает! Ну что же, этого следовало ожидать. У нас не создана таблица в базе данных. В проекте мы используем базу данных SQLite

Объяснить, что это такое будет с 0 не просто. Попробуйте почитать об этом на специализированных ресурсах.

Могу посоветовать хороший сервис: www.codecademy.com (там есть Java, SQL, Git, JavaScript и другие супер полезные вещи), поэтому милости прошу.

В итоге, нам нужно создать нашу таблицу, делаем это так:

Таблица создана. Можно проверить как работает наша система. Добавьте пару имён и посмотрите, как они будут вам возвращены уже из самой базы.

Разбор кода

Начнём смотреть, что же у нас в коде:

Так уж повелось, что в Java все конфигурации пишутся в xml-файлах, тут не исключение — файл web.xml контролирует, то, какой сервлет за что отвечает. Внимательно посмотрите на код и попробуйте поменять ссылку или имя сервлета.

Приложение у нас простое, поэтому у всего 2 класса (SQLiteClass и MainServlet).

Очевидно, думаю, что первый отвечает за работу с базой данных, а второй и есть наш пресловутый сервлет.

А вот и наши, упомянутые выше POST и GET запросы, эти функции являются обработчиками и задают поведение сервлета в ответ на запросы от клиента. Суть одна — данные пришли, данные ушли. Ничего сложного. Попробуйте поиграться с методами.

Переходим к классу, реализующему JDBC:

Здесь тоже всё просто, те же SQL запросы, только завёрнутые в Java-код. Небольшой совет — остерегайтесь всяких надстроек и фреймворков. Они хороши только в больших проектах, когда у вас миллионы записей, и сложные транзакционные операции. Но, настоящий контроль вы получите только, когда пишете именно вручную запрос, без таких вещей как сериализация жить намного проще (особенно поначалу).

Всё, с серверной частью закончим. Тут вам придётся посидеть, почитать специальные статьи и руководства. Без реальной практики тут никак.

Клиентская часть

Вот и пришло время взглянуть на то, что твориться у клиента в браузере. А ничего сверхъестественного. Но, скажу вам прямо, конечно всё зависит от проекта, но, клиентская часть обычно намного сложнее в реализации, чем серверная. И всё в основном из-за JavaScript-а. Очень быстро клиентский код превращается в набор «простыней», заплат, хардкода и прочих веселостей. JavaScript суров и беспощаден. На чистом нём писать очень тяжело. Поэтому мы используем JQuery. Есть куча других фреймворков и другого творения, но их касаться здесь не будем. Есть такая поговорка, что назови любое слово и это будет названием JS-фреймворка. Известен в узких кругах фреймфорк Mocha, я не представляю какие мысли посещали человека, когда он придумывал ему название, ну ладно, это было его право, конечно же.

Итак, что у нас там с клиентом?

Опять дам ссылку на отличнейший ресурс www.codecademy.com. Фронтенд там разобран очень хорошо и даёт необходимую базу для начинающих.

Тут рассмотрим только функцию

Что она делает? Правильно, шлёт тот самый POST — запрос и разбирает ответ. Всё просто, отдал данные и получил с сервера. По русски он говорит серверу «Дай мне имена всех, кто у тебя в базе» или «Занеси в базу это имя» и даёт ему имя.

Вот и вся клиентская часть.

Отправляем ресурс в настоящий мир

Как можно было заметить, наш сервис крутиться на локальном хосте. Другими словами на нашем же компьютере. Пришло время это исправить.

Тут я опишу лишь общий принцип сего действия. Это так или иначе потребует от вас денег на сервер, поэтому маловероятно, что кто-то действительно этим будет заниматься, особенно в самом начале своего программистского пути. Но понимать общую концепцию вы должны уже сейчас. Если кто решиться — знайте вы молодцы, вполне вероятно из вас может выйти толк.

И по традиции сразу несколько ссылок:

Читаем, что там написано, формируем в голове общую концепцию, того, как происходит взаимодействие программиста и удаленного сервера.

Сами сервера можно приобрести на amazone. Ссылку не даю, ибо реклама, можете сами поискать, это не сложно. Есть бесплатный тестовый период. НО! Будьте предельно осторожны, ваш покорный слуга сам слышал истории, как со счетов списывались тысячи долларов без ведома хозяина, ибо система сама умеет докупать себе мощности. Не попадитесь, я сам уже платил несколько раз за непонятные услуги, там всё на английском. Если не уверены, что делаете — лучше вообще не делайте.

Порядок действий таков:

На всякий случай я оставлю тут эти ссылки, вдруг, кто-то застопорился на каком-то моменте и решил спуститься в самый низ статьи, может помогут:

Заключение

Вот мы и добрались до кульминации нашего здесь обсуждения Джавы и веб-разработки на ней. Сложно? Да. Интересно? Да. Все, абсолютно все сервисы, будь то, поисковая система с миллиардами индексов, будь то видео-сервис с миллионами стрим-каналов — всё строиться по одному принципу. Отдать — забрать данные. Понимая эту концепцию вы сможете написать любую систему, сервис или платформу.

Я не стану лукавить и обманывать вас уважаемые читатели. Вряд ли вы за 2 или 3 недели станете супер профессионалами и будете свободно писать код. Этому можно научиться только потом и долгими ночами. Чем дальше вы будете залазить в дебри, тем больше вы будете понимать, что вы так мало знаете. Дорогу осилит идущий, вперед, дерзайте.

Вперед. Пришло время действовать. Стареющим Дурову и Брину пора уйти на покой, время их славы уже прошло, пришло время обновить учебники истории и списки Forbs. И кто знает, может эту статью читает тот, кто в своё время напишет отличнейшую платформу, которая затмит собой таких гигантов как Google, Facebook и других. Удачи, спасибо, что дочитали до конца.

Источник

Эволюция создания веб-приложений на Java

История развития построения веб-приложений на языке программирования Java с примерами их использования на временном промежутке от появления спецификации сервлетов до сегодняшнего дня.

qjg9bajfjgd1ivwunvi fiw49sa

Статья не претендует на академическую полноту и точность. Интерпретация всех изложенных фактов и приведённые примеры отражают исключительно знания, точку зрения и заблуждения автора статьи. Целью написания является попытка получения целостной картины имеющегося текущего положения для веб-приложений на Java. Кроме того, изложенная информация может быть использована читателем в качестве отправной точки для дальнейших самостоятельных исследований.

Код примеров находится в репозиториях на GitHub: демонстрация каждой библиотеки и фреймворка и приложение из завершающей части статьи. На момент написания статьи в первом репозитории 37 примеров, со временем их список будет пополняться.

Хронология появления технологий, библиотек, фреймворков и их популярность

Для более лёгкого восприятия данные сведены в таблицу и дополнительно далее проиллюстрированы диаграммами. Элементы таблицы условно объединены в группы, если это возможно. Библиотеки и фреймворки упорядочены по популярности в порядке убывания.

Информация о популярности взята из двух источников. Первым источником является индекс популярности веб-фреймворков RebelLabs компании ZeroTurnaround. Последнее его обновление было в конце 2017 года и сопровождалось двумя блогпостами до этого: первый и второй. Автор второго блогпоста, Simon Maple, перешёл в компанию Snyk, продолжив заниматься сбором и анализом подобной полезной статистики. Вторым источником является его исследование, опубликованное в журнале Java Magazine, November/December 2018 (вопрос 17).

В начало таблицы добавлен набор спецификаций, в конец таблицы — невошедшие в индекс популярности фреймворки, но которые всё же хотелось упомянуть.

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

На первой временной шкале данные из таблицы приведены в том же порядке, что и в таблице. Имеющиеся группы расположены по степени популярности. В группах (спецификация, Spring, JSF, JAX-RS, MicroProfile) элементы упорядочены в хронологическом порядке их появления. На любую из картинок можно щёлкнуть для её увеличения.

На второй временной шкале та же самая информация упорядочена по дате появления первой версии всех элементов. Легко увидеть, что в 2001 году, например, для написании веб-приложения можно было выбрать только из двух существующих основных фреймворков — Tapestry и Struts. В начале 2014 года никак невозможно было использовать Spring Boot (его первая официальная версия вышла позже) и уже не имело смысла использовать Seam (он прекратил существование).

Круговая диаграмма показывает индекс популярности фреймворка по данным RebelLabs на конец 2017 года. Каждый из фреймворков в индексе участвует один раз, то есть общая сумма процентов составляет 100. На второй диаграмме демонстрируется результат исследования из Java Magazine, 2018. В исследовании задавался вопрос, какие веб-фреймворки используются, разрешалось выбрать более одного в ответе. По этой причине каждый процентный показатель независим от другого и их нельзя суммировать.

Спецификации

Краеугольный камень существования всех библиотек — стандарты и спецификации, на которых они базируются. Спецификации существуют в виде Java Specification Requests (JSR), разрабатываемых в ходе формальной процедуры, называемой Java Community Process (JCP).

Список JSR, относящихся к Java Enterprise Edition, находится здесь. Ниже в таблице представлены выбранные из них только две наиболее значимые спецификации — Servlet и Java EE (последняя является набором из других спецификаций). Первые версии спецификаций принимались не в рамках JCP, поэтому они не имеют номеров JSR.

С 12 сентября 2017 года Java EE передана под управление Eclipse Foundation и в настоящее время именуется Jakarta EE. На смену JCP в качестве процесса разработки и принятия спецификаций пришёл Jakarta EE Specification Process.

Номер JSR Наименование Кратко Дата выпуска
Servlet 1.0 12.1996
Servlet 2.0 12.1997
Java Servlet API Specification 2.1a Servlet 2.1 11.1998
Java Servlet API Specification 2.2 Servlet 2.2 12.1999
J2EE 1.2 Documentation J2EE 1.2 12.1999
902 Java Servlet API Specification, Version 2.2, Errata Sheet, 4/1/2000 Servlet 2.2 05.2000
903 Java Servlet API Specification, Version 2.2, Errata Sheet, 4/27/2000 Servlet 2.2 06.2000
53 Java Servlet 2.3 and JavaServer Pages 1.2 Specifications Servlet 2.3, JSP 1.2 06.2002
58 Java 2 Platform, Enterprise Edition 1.3 Specification J2EE 1.3 09.2001
151 Java 2 Platform, Enterprise Edition 1.4 (J2EE 1.4) Specification J2EE 1.4 04.2004
154 Java Servlet 2.4 Specification Servlet 2.4, 2.5 09.2007
244 Java Platform, Enterprise Edition 5 (Java EE 5) Specification Java EE 5 05.2006
315 Java Servlet 3.0 Specification Servlet 3.0 03.2011
316 Java Platform, Enterprise Edition 6 (Java EE 6) Specification Java EE 6 12.2009
340 Java Servlet 3.1 Specification Servlet 3.1 05.2013
342 Java Platform, Enterprise Edition 7 (Java EE 7) Specification Java EE 7 07.2015
366 Java Platform, Enterprise Edition 8 (Java EE 8) Specification Java EE 8 09.2017
369 Java Servlet 4.0 Specification Servlet 4.0 09.2017
Jakarta EE Platform 8 Specification Jakarta EE 8 09.2019
Jakarta Servlet 4.0 Specification Servlet 4.0 09.2019

Использование HTTP-сервлетов

Далее несколько примеров создания веб-приложения без каких-либо библиотек или фреймворков. Будут последовательно даваться ссылки на расположение кода с кратким комментарием. Подобных способов больше, продемонстрированы наиболее очевидные из них.

В первом примере (модуль helloworld-web-servlet-xml) в дескрипторе развёртывания (deployment descriptor) web.xml указан класс, унаследованный от абстрактного класса HttpServlet со своей реализацией метода doGet(). Впервые файл web.xml дескриптора развёртывания был упомянут в спецификации Servlet 2.2 (1999 год).

Во втором примере (модуль helloworld-web-servlet-annotation) файл дескриптора развёртывания web.xml отсутствует. Над тем же классом-наследником от абстрактного класса HttpServlet присутствует аннотация WebServlet, появившаяся в Servlet 3.0 (2011 год).

В Servlet 3.0 также появились асинхронные сервлеты, в Servlet 3.1 (2013 год) — неблокирующий ввод-вывод, в Servlet 4.0 (2017 год) — поддержка HTTP/2.

Эпоха до появления Spring

Apache Tapestry — настоящий долгожитель среди фреймворков для построения веб-приложений. Его первая версия была выпущена в 2000 году, новые версии продолжают выходить и сейчас. При проектировании Tapestry были позаимствованы идеи из WebObjects, веб-фреймворка, появившегося несколькими годами до этого. В приложениях с применением Tapestry (пример — в модуле helloworld-web-tapestry) используется модульная архитектура и связывание (binding) компонентов пользовательского интерфейса веб-страниц с соответствующими им Java-классами.

h0zqnqgvxksqch d3ypcpmuw kВ марте 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 MVC, Spring Boot и Spring WebFlux

Первая версия Spring Framework, включающая Spring MVC, появилась в декабре 2005 года. Классом HTTP-сервлета в нём служит DispatcherServlet. Далее приводятся несколько примеров в хронологическом порядке появления возможностей (новых версий спецификации Servlet, выпуска сначала Spring Boot в апреле 2014 года, потом — Spring WebFlux в сентябре 2017 года), которые в них использованы.

В первом примере (модуль helloworld-web-spring-mvc-xml) в файле дескриптора развёртывания web.xml указан в качестве сервлета DispatcherServlet. В контроллере с единственным методом, обрабатывающим GET-запрос, присутствуют соответствующие аннотации (Controller и RequestMapping). Представлением (view) служит JSP-файл.

Во втором примере (модуль helloworld-web-spring-mvc-java) файл дескриптора развёртывания web.xml отсутствует и используется возможность, появившаяся в Servlet 3.0, выполнять конфигурирование программно. Совместно применяется класс, унаследованный от AbstractAnnotationConfigDispatcherServletInitializer (в конечном итоге задействуется реализация интерфейса ServletContainerInitializer с SPI), и JavaConfig (конфигурация с помощью программного кода с аннотацией Configuration).

В третьем примере (модуль helloworld-web-spring-boot-mvc) демонстрируется значительное упрощение проекта при сохранении той же функциональности благодаря появлению Spring Boot. Кроме класса контроллера дополнительно существует лишь один класс, унаследованный от SpringBootServletInitializer и аннотированный SpringBootApplication.

Четвёртый пример (модуль helloworld-web-spring-boot-webflux) показывает вместе со Spring Boot применение Spring WebFlux, добавленного в Spring Framework относительно недавно. Spring WebFlux использует реактивные принципы и Project Reactor. Из двух основных подходов (функциональный стиль и основанный на аннотациях) в примере участвует первый.

После появления Spring, 2000-е годы

po7 38mj ithzp2ujkrjjztbsleРазработка Vaadin началась в 2002 году в виде дополнения к другому фреймворку, Millstone 3. В течение 2006 года созданное было оформлено в виде законченного коммерческого продукта. До мая 2009 года имел наименование IT Mill Toolkit, только после этого момента став Vaadin. В конце 2007 года его ранее самостоятельно реализованная клиентская часть была заменена на Google Web Toolkit (GWT). В примере (модуль helloworld-web-vaadin) видно, что имеется лишь один файл Java-класса, в котором программно создаются все компоненты пользовательского интерфейса, скрывая при этом низкоуровневые технические подробности.

pqol48dwuvhfod2eydrhzblc8zkВесьма интересный продукт, 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-код.

i5ki6rbpw9 vspenfdkmrhvrglgSeam начал свою жизнь в мае 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.

ol v2kbtfe7zbj5tluyymeyqdn0Play Framework появился в мае 2008 года. Написан на JVM-языке программирования Scala. Позволяет создавать веб-приложения на его основе как на Scala, так и на Java. Своеобразной особенностью разработчиков Play является приверженность инструменту сборки sbt. По этой причине для написания примера (модуль helloworld-web-play) пришлось приложить некоторые усилия для сборки под Maven, применив для этого соответствующий плагин.

2010-е годы, новейшее время

abfqnra85rfiulmqfj6kyvlcljyВ 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.

yspklczjystrz929vci0muatolsДекабрь 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.

cg5cvd5hpo3ocvlammhf0scjoaaВ августе 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.

kfa2d9tqjdoquuhjyohaf3otkhcВосходящая звезда среди веб-фреймворков, первая версия для которой появилась всего год назад, в октябре 2018 года, — Micronaut. Поддерживает JVM-языки программирования Java, Groovy и Kotlin. Существенное его преимущество — быстрый старт приложений на его основе и малое потребление памяти. Это обеспечивается внедрением зависимостей на этапе компиляции, а не во время исполнения. Ещё одна из особенностей — отличная поддержка реактивного программирования, возможно использование библиотек RxJava, Reactor и Akka. Пример (модуль helloworld-web-micronaut) демонстрирует построение простого приложения на основе Micronaut.

MicroProfile

q y 2agegsezg3 l ryra mfqq4Из-за существующей тяжеловесности 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

gb1benzkpddbjom3alclfkf jj8К первой группе фреймворков относятся те, которые уже существовали на момент выхода 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.

yl8ow evupku k49dnyowrg1g6aВо вторую группу фреймворков входят появившиеся позднее выхода первой версии 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

Временная шкала показывает время жизни каждого из программных продуктов таблицы. Можно видеть последовательность их появления и время выпуска последних версий.

pcfzc 8wh hulxx

Всё чаще сейчас используется контейнеризация при развёртывании и публикации приложений, поэтому применение серверов приложений становится всё менее актуальным.

Использование в приложениях языков, отличных от Java

В последнее время наметилась тенденция создания гибридных приложений, в качестве одной из составных частей которых присутствует код на Java. В соответствии с тенденцией в журнале Java Magazine, основной темой которого был язык программирования Java, в колонке главного редактора в номере January/February 2017 было провозглашено «The Polyglot Future» и включение в зону интересов языка JavaScript.

В уже упомянутом выше исследовании в вопросе номер 16 интересовались, какие не JVM-языки используются в JVM-приложениях. Лидером (57%) стал JavaScript, применяемый во фронтенде. Учитывая тот факт, что часть веб-приложений не имеют GUI вовсе (сервисы, микросервисы, службы), можно с уверенностью сказать, что использование JavaScript-фреймворков для графического интерфейса в Java-приложениях носит массовый характер.

Пример типичного сегодняшнего Java-приложения

na qp53uw1h5f4uuzlz0vddyzkiДля демонстрации типичного веб-приложения на Java с графическим интерфейсом была написана программа с эмуляцией базовых функциональных возможностей Twitter: аутентификация, управление учётными записями (создание, редактирование, удаление, поиск по подстроке), главная страница (свойства учётной записи, лента сообщений), создание твитов, подписаться/отписаться.

Бекенд написан с использованием Spring Boot, фронтенд — с помощью популярного JavaScript-фреймворка Angular. В 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: первый, второй и третий репозитории.

25-26 октября 2019 года в Санкт-Петербурге состоится конференция для Java-разработчиков Joker 2019, на которую до 1 октября можно дешевле купить билеты.

8-9 ноября 2019 года в Москве пройдёт конференция для JavaScript-разработчиков HolyJS 2019 Moscow, на которую до 1 октября тоже действуют скидки на покупку билетов.

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • java swing конструктор форм
  • java spring crud приложение