Интернет программы для java
Работу с потоками ввода-вывода мы уже изучили, работу с файлами изучили, что же изучить дальше? А как насчет работы с сетью и интернетом? Звучит многообещающе, не так ли?
В Java работать с интернетом не сложнее, чем работать с файлами. Ну разве что совсем чуть-чуть.
Для работы с ресурсами в интернете в Java есть специальный класс — URL . Он простой, как табуретка, в чем вы сейчас и убедитесь.
Получение странички из интернета
Как вы думаете, сколько строк кода нужно написать, чтобы скачать какой-нибудь текстовый файл из интернета и отобразить его содержимое на экране? 10? 100? 1000? А может быть, 5?
Код | Примечание |
---|---|
Создает объект URL с путем к странице Получает InputStream у интернет-объекта Читает все байты и возвращает массив байт Преобразуем массив в строку Выводим строку на экран |
На экране отобразится содержимое HTML-файла:
Вывод на экран |
---|
Напиши код, который будет считывать с клавиатуры ссылку на файл в интернете, скачивать его и сохранять во временный файл. Используй методы createTempFile(null, null) и write(Path, byte[]) класса Files, а также метод openStream() класса URL.
2. Класс URLConnection
Кроме простого чтения данных из интернета, мы еще можем и загружать туда данные. Загрузка данных — это куда более сложный процесс, чем считывание. Вам понадобится на несколько методов больше. Пример:
Получаем поток вывода
Выводим в него данные
Обратите внимание, что тут мы больше не вызываем метод url.openStream() . Вместо этого мы идем по более длинному пути:
- Сначала мы устанавливаем стабильное двустороннее соединение с помощью метода URLConnection openConnection()
- Затем получаем поток для отправки данных с помощью метода connection.getOutputStream() и отправляем данные серверу
- Затем получаем поток для чтения данных с помощью метода connection.getInputStream() и начинаем читать из него данные.
Контроль ресурсов
Строго говоря, мы должны все потоки обернуть в try -with-resources для безопасной работы. А еще не помешало бы обернуть голые InputStream и OutputStream во что-нибудь более удобное. Например, в PrintStream и BufferedReader .
Если мы все это сделаем, наш код будет выглядеть как-то так:
3. Примеры работы с сетью
А давай-ка мы что-нибудь загрузим из интернета. И не просто загрузим, а сохраним на диск.
Например, давайте напишем программу, которая сохраняет на диск картинку с главной страницы Google.
В принципе ничего сложного. В самой простой интерпретации этот код будет выглядеть так:
Сохранение файла на диск |
---|
С помощью трех первых строк мы получаем поток данных от интернет-ресурса — от картинки.
В четвертой строке мы создаем имя файла, в который будем сохранять картинку. Имя может быть любым, однако расширение файла должно совпадать с расширением картинки в интернете. Так локальные программы просмотра картинок будут правильно ее открывать.
Ну и наконец, последняя строка — это один из методов copy класса Files . У класса Files их несколько. Этот метод, который мы использовали, принимает в качестве первого параметра источник данных — байтовый поток ( InputStream ), а в качестве второго параметра — имя файла, куда нужно записывать данные.
Теоретически, если бы URL картинки был коротким, этот код вообще можно было бы записать в одну строку:
Копирование данных из потока в файл |
---|
Писать так, конечно же, не нужно , однако этот пример демонстрирует, насколько удобные и мощные в Java потоки ввода-вывода.
Одной из самых приятных особенностей Java является её многогранная природа. Конечно, создание традиционных десктопных и даже мобильных приложений — это здорово. Но что, если вы хотите уйти с проторенных дорожек и зайти на территорию разработки web приложений на Java? Для вас есть хорошая новость: в комплекте с языком идёт полноценный Servlet API, который позволяет вам создавать надёжные веб-приложения без особых хлопот.
Это статья для продолжающих. Если вы только начинаете знакомство с Java, советуем пройти быстрый старт, посмотреть видеокурс и выбрать одну из книг для новичков.
Создание приложений на Java с помощью Servlets
Встречайте сервлеты, особый тип Java-программ, выполняемый в пределах веб-контейнера (также называемый контейнером сервлетов, как, например, Tomcat и Jelly), которые позволяют обрабатывать запросы клиентов и ответы сервера просто и эффективно. Сейчас не время и не место дотошно объяснять вам, что из себя представляет сервлет. Достаточно сказать, что сервлеты создаются и уничтожаются их контейнерами, а не разработчиком, и действуют как промежуточный уровень между клиентами (как правило, веб-браузерами) и другими приложениями, запущенными на сервере (например, базами данных).
Сервлет — классная штука, которая помимо всего прочего может принимать данные от клиента, как правило через GET и POST-запросы, работать с cookie и параметрами сеанса. А ещё она обрабатывает данные через дополнительные уровни приложений и отправляет выходные данные клиенту как в текстовом, так и в бинарном форматах (HTML, XML, PDF, JPG, GIF и т.д.), во многих случаях используя Java Server Pages (JSP) файлы.
Лучше всего начинать работу с сервлетами через конкретный пример. Мы создадим простое веб-приложение, которое позволит клиентам регистрироваться с помощью простой HTML-формы. Данные, предоставленные клиентами, будут собираться сервлетом и проверяться валидаторами.
Разбираемся с конфигурационными файлами
Чтобы вы понимали структуру нашего будущего приложения, вот как она будет выглядеть:
Первым шагом к созданию приложения является определение так называемого дескриптора развёртывания. Он указывает, как приложение должно быть развёрнуто в определенной среде. Когда дело касается веб-приложений, дескриптор развёртывания представляет собой простой XML-файл, называемый web.xml и является частью стандартной спецификации Java EE. В нашем случае он будет выглядеть так:
Как вы видите, web . xml только определяет версию Java Servlet Specification (3.1), которую мы будем использовать в приложении. Разумеется, в нём может быть гораздо больше содержимого, включая директивы сопоставления сервлетов, параметры инициализации, список приветственных файлов и несколько дополнительных настроек. Но чтобы не усложнять процесс разработки, давайте оставим его таким как есть.
Так как наше приложение будет использовать 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-файл:
Файл содержит простой HTML с парочкой дополнений. Вот она, прелесть JSP в сочетании с JSTL и JEL. Обратите внимание на то, как легко проверить наличие ошибок валидации, используя такие стандартные теги, как и .
Атрибут формы регистрации action указывает на следующий URL: $/processcustomer . Это значит, что каждый раз, когда клиент пытается зарегистрироваться, данные будут отправляться в processcustomer независимо от URL, по которому доступна форма. Это достигается за счёт функциональности объектов, доступных из JSP-файла, таких как request .
Скоро мы увидим, как сервлет связывается с URL processcustomer и как он взаимодействует с введёнными данными. А пока давайте посмотрим на JSP-файл, который отвечает за страницу приветствия:
Теперь, когда мы разобрались с отображением страниц, следующим шагом будет создание сервлета, ответственного за сбор данных клиента из POST-запросов и подтверждение данных простым способом.
Пишем контроллер
Вот как он выглядит:
Здесь мы назвали сервлет CustomerController , так как считается хорошей практикой использовать имя класса сервлета в качестве значения атрибута name аннотации @WebServlet . В противном случае некоторые контейнеры не смогут выполнить сопоставление, что приведёт к ошибке 404.
Валидаторы — это простые классы, которые проверяют определённые свойства, например, является ли строка пустой и выглядит ли email как email. На GitLab автора можно посмотреть на их реализацию.
Результат валидации влияет на дальнейший ход событий: если данные не валидны, клиент перенаправляется через объект RequestDispatcher на страницу регистрации, где отображаются соответствующие ошибки. Если всё в порядке, то отображается страница приветствия.
Итак, мы создали целое веб-приложение на Java, которое позволяет зарегистрировать клиентов с помощью HTML-формы, базового сервлета и нескольких JSP-файлов. Пора его запустить.
Запускаем приложение
Для запуска приложения нужно проделать следующие шаги:
- Для начала нам понадобится Git (убедитесь, что скачиваете подходящую версию), Maven и контейнер сервлета (например, Apache Tomcat, Jetty, или JBoss Wildfly). Если что-то из этого уже включено в вашу IDE, то вы можете использовать встроенный вариант.
- Используйте Git, чтобы клонировать репозиторий приложения, и импортируйте его в вашу IDE, желательно как проект Maven.
- Разверните проект в контейнере сервлета и запустите его. Развёртывание подразумевает создание WAR-файла или exploded WAR и его помещение в папку развёртывания контейнера по умолчанию. Зачастую IDE способна сделать развёртывание за вас, поэтому не перегружайте себя лишней работой и посмотрите документацию вашей IDE (документация для IntelliJ IDEA). Когда вы развернёте проект и запустите его, должен запуститься бразуер по умолчанию с окном регистрации.
- Попробуйте заполнить не все поля в форме или вовсе не заполнить их и вы увидите, как поверх соответствующих полей отобразятся ошибки. Введите всё как положено, и вас перенаправит на страницу приветствия.
Заключение
Итак, вы приобрели все навыки, необходимые для создания собственного веб-приложения на Java без необходимости прибегать к сложным фреймворкам. Всё, что вам нужно, — Servlet API, технология вроде JSP для отображения и встроенные средства Java. Здорово, правда?
Начиная новый проект, я задумался о том, что, вероятнее всего, я могу упустить важные фреймворки и библиотеки Java из-за того, что я просто никогда с ними не сталкивался. Возможно, мои знакомые или знакомые знакомых используют что-то, что сможет спасти меня от написания своих велосипедов и костылей.
Ниже представлен мой джентельменский набор Java-библиотек/фреймворков (иногда используются куски переводов базовых технических объяснений).
Чем отличается фреймворк от библиотеки
Фреймворки Java — по сути, блоки предварительно написанного кода, в которые программист может добавлять свой код для решения конкретных проблем. Это каркас программной системы (или подсистемы). Он может включать:
- вспомогательные программы;
- библиотеки кода;
- язык сценариев;
- другое ПО, облегчающее разработку и объединение разных компонентов большого программного проекта.
Обычно объединение происходит за счёт использования единого API. Фреймворки Java сокращают объём написания кода с нуля, который программистам приходится делать, чтобы найти решение.
Библиотеки — это код, предназначенный для решения конкретной проблемы.
Библиотека может быть использована в программном продукте просто как набор подпрограмм близкой функциональности, не влияя на архитектуру программного продукта и не накладывая на неё никаких ограничений. Фреймворк же диктует правила построения архитектуры приложения, задавая на начальном этапе разработки поведение по умолчанию — каркас, который нужно будет расширять и изменять согласно указанным требованиям.
Все эти определения нужны, чтобы дать базовое представление о том, о чём мы будем говорить дальше.
Большинство сред Java, особенно те, которые используются большим количеством программистов, имеют так называемые группы поддержки. Эти группы представляют собой кластеры программистов, использующих одну и ту же платформу, которые помогают друг другу в решении проблем, возникающих при использовании платформы. Эти группы поддержки действуют как сообщество, которое помогает решать проблемы гораздо быстрее. Обычно они принимают форму онлайн-форумов, а структура может иметь несколько групп на разных порталах.
Также у фреймворков очень низкие затраты на обслуживание. В частности, по сравнению с денежной экономией, которую эти фреймворки обеспечивают за счёт сокращения времени, расходы, связанные с фреймворками Java, могут быть незначительными.
Мой топ-10 фреймворков и библиотек Java
1. Spring Framework
Spring Framework — одна из самых мощных и широко используемых платформ Java. Благодаря своей концепции внедрения зависимостей и особенностям аспектно-ориентированного программирования Spring покорила мир разработки.
Это платформа с открытым исходным кодом, используемая для корпоративных приложений. Фреймворк обычно используется для Enterprise Java. Среда чрезвычайно универсальна и может использоваться для создания большинства типов приложений Java. С помощью Spring разработчики могут создавать слабосвязанные модули, в которых зависимости обрабатываются фреймворком, а не зависят от библиотек в коде.
Spring чаще всего используют в разработке веб-приложений. Его применяет ряд технологических гигантов, включая Netflix и Amazon. Главное преимущество фреймворка заключается в том, что он чрезвычайно лёгкий и не требует вызова веб-сервера. С точки зрения эффективности это одна из самых популярных платформ Java. Spring чрезвычайно прост и, как правило, может использоваться даже новичками. Он также обеспечивает обратную совместимость и возможность тестирования.
Фреймворк Spring является исчерпывающим и охватывает множество функций, включая безопасность и настройку подключения к БД, которые легко изучить. Кроме того, поскольку это самый популярный веб-фреймворк, вы можете найти множество документации и активное сообщество.
Основные концепции
Внедрение зависимостей (DI) (инверсия управления) — в этом принципе вместо того чтобы последовательно брать управление потоком приложение передаёт управление внешнему контроллеру, который управляет потоком. Внешний контроллер — это события. Когда происходит какое-то событие, поток приложения продолжается. Это придаёт гибкость приложению. В Spring IoC выполняется с помощью DI, которые бывают трёх типов — внедрение установщика, внедрение метода и внедрение конструктора.
В Spring объекты называются bean-компонентами. Существует BeanFactory, которая управляет и настраивает эти bean-компоненты. Вы можете думать о BeanFactory как о контейнере, который создаёт экземпляры.
Большинство приложений используют XML (beans.xml) для конфигурации. ApplicationContext, который является надмножеством BeanFactory, используется для более сложных приложений, которым требуется распространение событий, декларативные механизмы и интеграция с аспектно-ориентированными функциями Spring.
2. Hibernate
Hibernate — это структура объектно-реляционного сопоставления. Основным преимуществом фреймворка Hibernate является то, что он очень эффективен, когда дело доходит до решения часто встречающейся проблемы при работе с базами данных на Java — несоответствия между обработкой данных объектно-ориентированными языками программирования и системами управления реляционными базами данных. Это достигается путём разработки постоянных классов и предоставления программисту возможности эффективно взаимодействовать с базой данных с минимальными изменениями кода.
Возможность выполнять операции с базой данных объектов в Java является проблемой, когда дело доходит до большинства других фреймворков. Но Hibernate очень эффективно решает эту проблему. Он используется рядом крупных компаний, включая IBM, Oracle и Accenture из-за его преимуществ в переносимости. Его можно использовать бесплатно, исходный код полностью открыт.
Хотя Hibernate не является фреймворком полного стека, он полностью изменил наш взгляд на базу данных. Как и SQL, запросы в Hibernate называются HQL (Hibernate Query Language).
Hibernate напрямую сопоставляет классы Java с соответствующими таблицами базы данных и наоборот. Основным файлом в спящем режиме является файл hibernate.cfg.xml, который содержит информацию о сопоставлении классов Java с конфигурацией базы данных.
Hibernate решает две основные проблемы с JDBC — JDBC не поддерживает отношения на уровне объектов, и если вы когда-нибудь решите перейти на другую базу данных, старые запросы могут не работать, что означает много изменений, то есть время и деньги.
Hibernate предоставляет уровень абстракции, так что код слабо связан с базой данных. Такие вещи, как установление соединения с базой данных, выполнение операций CRUD берёт на себя Hibernate. Поэтому разработчикам не нужно это реализовывать, что делает код независимым от используемой базы данных.
- полностью открыт;
- уменьшает избыточность через JDBC API;
- повышает производительность и удобство обслуживания;
- поддерживает API-интерфейсы Persistence;
- обеспечивает связь между приложением и любой базой данных.
3. Vaadin
Фреймворк Vaadin специально ориентирован на доступность UX. Он позволяет программисту создавать настраиваемые веб-приложения, предоставляя ему оптимизированную и простую в использовании платформу для разработки. Vaadin также предоставляет доступ к DOM непосредственно с виртуальной машины Java. Важной особенностью фреймворка является тот факт, что взаимодействие, которое происходит между сервером и браузером, полностью автоматизировано.
Данные могут быть связаны с использованием как MVC, так и MVP через платформу Vaadin. Он поставляется со встроенной поддержкой инфраструктуры Spring, а также поддерживает языки JVM, такие как Scala и Kotlin. Он также имеет поддержку WebSocket, которая обеспечивает автоматическую связь между сервером и клиентом. Как Java, так и HTML можно использовать для построения представлений во фреймворке Vaadin. Он имеет интуитивно понятный пользовательский интерфейс с поддержкой взаимодействий перетаскивания, что значительно упрощает весь процесс веб-разработки для программистов любого уровня подготовки.
Vaadin — это флагманский продукт, а также платформа, на которой разработчики могут выполнять реализацию веб-интерфейса HTML5 с использованием Java. Это платформа с открытым исходным кодом, которая включает в себя веб-фреймворк Java и набор веб-компонентов, а также средства запуска приложений и инструменты. Эти веб-компоненты составляют ядро Vaadin и могут быть настроены для получения высокопроизводительного и универсального кода для настольных и мобильных приложений.
Vaadin Flow — это фактическая часть инфраструктуры Java-платформы Vaadin, которая заботится о взаимодействии клиент-сервер, а также о маршрутизации. С помощью Vaadin Flow вы можете полностью написать веб-приложение на Java без суеты JS или CSS. Компоненты пользовательского интерфейса заботятся о действиях пользователя в браузере, используя автоматическую связь с браузером и сервером. Вы можете легко интегрировать компоненты Vaadin в любую IDE, которую используете, плюс это кроссплатформенный фреймворк, поэтому не нужно беспокоиться о переносе кода на другую платформу.
4. gRPC
gRPC — это абстрактная спецификация. Она описывает абстрактную RPC (remote procedure call), то есть удалённый вызов процедуры, которая обладает определёнными свойствами.
Первое свойство — поддержка как одиночных вызовов, так и стриминга. То есть все сервисы, которые реализовывают эту спеку, поддерживают оба варианта. Следующий пункт — наличие метаданных, то есть чтобы вместе с полезной нагрузкой вы могли бы передать какие-то метаданные — условно, заголовки. И ещё поддерживается отмена запроса и таймаутов из коробки.
5. Play
Play — это среда Java, предназначенная для веба и мобильных приложений. Основное применение — в приложениях, требующих большого масштабирования. Платформа также совместима с рядом языков помимо Java, такими как Python и Ruby. Play не основан на корпоративных стандартах Java. Обычно он используется для веб-приложений на основе создания контента, а также для приложений Scala.
Play — это нетрадиционный и уникальный тип фреймворка, который следует подходу соглашения, а не конфигурации. Он основан на шаблоне MVC и представляет собой платформу веб-приложений с открытым исходным кодом.
- высокая производительность за счёт асинхронной обработки;
- без контейнера, без состояний и построенный на реактивных принципах;
- использует статически типизированный язык, поэтому большинство ошибок обнаруживается во время компиляции, что позволяет избежать множества ошибок на ранних этапах жизненного цикла разработки;
- Scala исследует истинное ООП вместе с некоторыми концепциями функционального программирования. Его совместимость с Java делает систему отличной и мощной;
- вместе с Play2 была выпущена новая мощная система сборки sbt, которая упрощает интеграцию с проектами Maven, а также создание простых файлов JAR;
- встроены обширные библиотеки доступа к реляционным базам данных для общих функций.
Play написан с использованием языка программирования Scala. Предлагает разработку веб-приложений и мобильных приложений. Он следует архитектуре MVC. Play скомпилирован в Java bytecode, и это делает его одним из самых мощных фреймворков.
Некоторые преимущества использования Play Framework:
6. MapStruct
Совсем недавно в поле моего зрения попала библиотека MapStruct, которая изменила мой мир. Я всегда не очень любил писать builder или свой метод для перекладывания значений из entity в ДТО. Для тех, кто так же, как и я, не любит писать этот шаблонный код, приходит на помощь MapStruct. Эта библиотека генерирует код, который будет автоматически мапить один класс в другой. Это невероятно ускоряет разработку и тестирование кода.
7. Lombok
Эта библиотека предназначена для генерации кода. Она способна генерировать код для достаточно популярных use-cases. Стоит лишь поставить необходимые аннотации.
Достаточно спорная библиотека. Кто-то её любит, кто-то ненавидит, но никого она не оставляет равнодушным.
8. Apache POI
На основе этой библиотеки можно создать внутренний фреймворк для удобной и гибкой генерации отчётов. Библиотека поддерживает различные форматы документов, например Word и Excel.
9. Liquibase/ FlyWay
Средства для миграции баз данных. Я слабо представляю современный проект, который не будет использовать автоматическое исполнение скриптов для баз данных. Каждая из этих библиотек обладает достоинствами и недостатками. Прежде чем остановить свой выбор на одной из них, я крайне рекомендую ознакомиться с документацией на официальном сайте и принять взвешенное решение. Но даже если спустя время вы поймёте, что решение было ошибочным, эти библиотеки предоставляют достаточно безболезненную миграцию друг на друга.
10. Testcontainers
Просто невероятная по своей мощности библиотека, которая позволяет запускать контейнеры в Docker для тестирования. У меня она нашла применение в интеграционных тестах. Есть возможность поднять настоящую базу данных с использованием миграций FlyWay/Liquibase и проверить полный флоу работы системы. Тест-контейнеры можно кастомизировать, а также писать свои.
Подведение итогов
Java-фреймворки и библиотеки значительно сокращают время программирования и предоставляют разработчикам такие важные функции, как безопасность, эффективность и производительность. Хотя у всех инструментов есть свои плюсы и минусы, простое использование самого фреймворка или библиотеки может значительно улучшить ваш опыт программирования.
Есть много других Java-фреймворков, которые не являются фреймворками полного стека или веб-разработки, но полезны в каждом приложении — например, log4j для ведения журнала, Junit и Selenium для тестирования и т.д. Об этом важно знать, хотя вы можете просто изучить их на ходу вместе с другими фреймворками, которые вы видели в приведенном выше списке.
Лучшая структура для вашего приложения должна соответствовать вашим бизнес-требованиям, обеспечивать определённый уровень гибкости и оптимальную производительность, а также быть простой в обслуживании и поглощении изменений.
Например, для полнофункциональной среды веб-разработки, если что-то нужно изменить, это должно меньше всего повлиять на приложение, т.е. вам не придётся заново создавать и разворачивать приложение для небольших изменений. Простое изменение конфигурации должно творить чудеса. Такие приложения сокращают время простоя и обеспечивают гибкость.
Выбирайте свой фреймворк с умом, чтобы пользоваться функциями, предоставляемыми Java.
Когда-то Java укрепил свои позиции благодаря тому, что выбрал приоритетным направлением веб-приложения. С первых дней Java пытался найти свой путь. Сначала — предложил апплеты. Это предоставило много возможностей разработчикам по созданию динамического контента (содержимого) на статических HTML страницах. Однако апплеты не оправдали ожиданий по многим причинам: безопасность, накладные расходы и другие. Тогда разработчики языка Java предложили альтернативу — Servlet API. И это оказалось правильным решением. Servlet API — это спецификация, на которой построено любое веб-приложение на Java, будь то приложение с веб-интерфейсом или веб-сервис, который возвращает информацию согласно запросу. Поэтому путь к пониманию работы веб-приложений на Java начинается с понимания Servlet API.
Servlet API
Web-server
Connectors
— На входе у нас есть Connectors (т.е. коннекторы), которые принимают входящие запросы от клиентов. HTTP коннектор в Tomcat реализован при помощи компонента "Coyote". Коннекторы принимают данные от клиента и передают их дальше в Tomcat Engine. Servlet Container — Tomcat Engine в свою очередь обрабатывает полученный от клиента request при помощи компонента "Catalina", который является сервлет контейнером. Подробнее см. документацию Tomcat : "Architecture Overview". Сущестуют и другие веб-серверы, поддерживающие спецификацию Servlet API. Например, "Jetty" или "Undertow". Их архитектура похожа, поэтому понимая принцип работы с одним сервлет контейнером, можно перестроиться на работу с другим.
Веб-приложение (Web Application)
Итак, чтобы мы смогли запустить веб-приложение, нам нужен веб-сервер, который поддерживает Servlet API (т.е. в котором есть компонент-расширение, реализующее для веб-сервера поддержку Servlet API). Хорошо. А что же такое вообще веб-приложение? Согласно главе "10 Web Applications" спецификации Servlet API, Web application — это набор сервлетов, HTML страниц, классов и других ресурсов, которые составляют законечнное приложение на веб-сервере. Согласно главе "10.6 Web Application Archive File", веб-приложение может быть запаковано в Web ARchive (в архив с расширением WAR). Как сказано на странице "Glossary-219":
То есть WAR сделано вместо JAR, чтобы показать, что это веб-приложение. Следующий важный факт: у нас должна быть определённая структура каталогов в нашем WAR архиве. В спецификации Servlet API в главе "10.5 Directory Structure". В этой главе сказано, что есть особый каталог, который называется "WEB-INF". Данный каталог особен тем, что он не виден клиенту и напрямую ему не показывается, но он доступен для кода сервлетов. Также сказано, что может содержать каталог WEB-INF:
Для чего используется схема для XML файлов? В схемах указано, как правильно заполнять XML документ: какие элементы можно использовать, какого типа данные в элементах могут быть указаны, в каком порядке элементы должны идти, какие элементы обязательны и т.д. Можно сравнить схему XML документа с интерфейсом в Java, ведь схема в Java тоже указывает, каким образом должны быть написаны классы, которые удовлятворяют данному интерфейсу (т.е. которые реализуют данный интерфейс). Итак, мы вооружены тайными знаниями и готовы создавать своё первое веб-приложение!
Создание веб-приложения
Работы с современным Java-приложением уже трудно представить без использования систем автоматической сборки проектов. Одними из самых популярных систем являются Maven и Gradle. Воспользуемся для данного обзора Gradle. Установка Gradle описана на официальном сайте. Для создания нового приложения нам понадобится встроенный в Gradle плагин: "Build Init Plugin". Для создания Java-приложения необходимо выполнить следующую команду: gradle init --type java-application
После создания проекта нам понадобится отредактировать файл build.gradle. Это так называемый Build Script (подробнее см. документацию Gradle: "Writing Build Scripts"). В данном файле описывается то, каким образом необходимо собирать проект и другие аспекты работы с Java проектом. В блоке plugins описывается, какие "Gradle плагины" необходимо использовать для текущего Gradle проекта. Плагины расширяют возможности нашего проекта. Например, по умолчанию исопльзуется плагин "java". Данный плагин всегда используется, если нам нужна поддержка Java. Но вот плагин "application" нам не нужен, т.к. в его описании указано, что он служит для создания "executable JVM application", т.е. выполняемых JVM приложений. Нам же нужно создание Web приложения в виде WAR архива. И если мы в документации Gradle поищем слово WAR, найдём и "War Plugin". Следовательно, укажем следующие плагины: Так же в "War Plugin Default Settings" сказано, что каталог со всем содержимым веб-приложения должен быть "src/main/webapp", там должен лежать тот самый каталог WEB-INF, в котором должен лежать web.xml. Создадим такой файл. Заполнять же его будем несколько позднее, т.к. мы ещё не имеем достаточно информации для этого. В блоке "dependencies" указываем зависимости нашего проекта, то есть те библиотеки/фрэймворки, без которых не может работать наше приложение. В данном случае, мы пишем веб-приложение, а значит мы не можем работать без Servlet API: providedCompile говорит о том, что зависимость не нужно включать в наш WAR архив веб-приложения: она нужна только для компиляции. А при выполнении данная зависимость будет предоставлена кем-то другим (то есть веб-сервером). Ну и оставляем в build script информацию о том, какой репозиторий зависимостей мы хотим использовать — из него будут скачаны все указанные dependencies: Всё остальное из файла build script'а убираем. Теперь отредактируем класс src\main\java\App.java. Сделаем из него сервлет. В спецификации Servlet API в главе "CHAPTER 2. The Servlet Interface" сказано, что Servlet Interface имеет базовую реализацию HttpServlet, которой должно быть достаточно в большинстве случаев и разработчикам достаточно унаследоваться от неё. А в главе "2.1.1 HTTP Specific Request Handling Methods" указаны основные методы, которые обрабатывают входящие запросы. Таким образом, перепишем класс App.java: Итак, у нас вроде всё готово. Осталось правильно написать дескриптор развёртывания. Из схемы скопируем в web.xml следующий текст: А также путь к схеме, который указан в ней: http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd Теперь посмотрим пример того, как должен выглядеть web.xml в спецификации Servlet API. Данный пример указан в главе "14.5.1 A Basic Example". Совместим то, что указано в схеме с примером, который указан в спецификации. Получим следующее: Как видно, мы использовали схему и schemaLocation, которые были указаны ранее. А описание самих элементов взяли из примера из главы 14.5.1. Если мы сделали всё правильно, выполним gradle задачу gradle war без ошибок:
Запуск веб-приложения
Выполнив http://localhost:8080/javaweb/app , мы обратимся к нашему сервлету, т.к. обращение /app ранее мы "замапили" (то есть сопоставили) на сервлет App. Существует более быстрый способ проверить, как работает приложение. И в этом нам снова помогает система сборки. В build script нашего Gradle проекта мы можем добавить в секцию plugins новый плагин "Gretty": id "org.gretty" version "2.3.1" И теперь мы можем выполнять gradle task для запуска нашего приложения: gradle appRun
Spring и Servlet API
Аннотации
Как мы видели, аннотации — это удобно. И не мы одни так подумали. Поэтому в спецификации Servlet API начиная с версии 3.0 появилась глава "CHAPTER 8 Annotations and pluggability", которая указывает, что сервлет контейнеры должны поддерживать возможность указывать то, что раньше указывалось в Deployment Descriptor'е через аннотации. Таким образом, web.xml можно совсем удалить из проекта, а над классом сервлета указывать аннотацию @WebServlet и указывать, на какой путь "мапить" сервлет. Тут вроде всё понятно. Но что делать, если мы к проекту подключили Spring, который требует более сложных настроек? Тут всё чуть-чуть сложнее. Во-первых, в документации Spring сказано, что для настройки Spring без web.xml нужно использовать свой класс, который будет реализовывать WebApplicationInitializer. Подробнее см. главу "1.1. DispatcherServlet". Получается, что это класс Spring'а. Как же тогда используется Servlet API тут? На самом деле, в Servlet API 3.0 был добавлен ServletContainerInitializer. Используя особый механизм в Java (называется SPI), Spring указывает свой инициализатор сервлет контейнера, который называется SpringServletContainerInitializer . В свою очередь, он уже ищет реализации WebApplicationInitializer и вызывает нужные методы и выполняет нужные настройки. Подробнее см. "How servlet container finds WebApplicationInitializer implementations". Вышеуказанные настройки можно выполнить так: Теперь при помощи "Java-based configuration" укажем, какой пакет сканировать + включим аннотации: А сам SpringController был перенесён в ru.javarush.javaweb.controllers , чтобы при сканировании конфигурация не находила сама себя, а искала только контроллеры.
Данный небольшой обзор не претендует на полноту, но надеюсь он сможет заинтересовать вас и показать, какие инструменты есть.
В современном мире многие сервисы живут в "вебе" и даже приложения "старички" потихоньку туда переезжают. И это не удивительно, ведь у этого есть неоспоримое преимущество — доступность из любой точки мира (где есть интернет), с любого компьютера или даже портативного компьютера. Процесс разработки тоже не обошло это стороной и про это хочется написать пару слов. Возможно, кому-то это будет интересно, а кому-то и полезно. Считаю, что данные инструменты могут помочь при обучении. Они позволяют быстро проверить что-нибудь не запуская IDE локально, что порой полезно.
Онлайн компиляторы
Самым распространённым и лёгким в обзоре является категория "онлайн компиляторов". В них можно опробовать какое-нибудь простое решение на Java. Одним из самых приятных решений является tutorialspoint java compiler. Вот пример того, как это выглядит:
Достоинствами является возможность запускать код быстро и просто. Так же имеет приятный вид. Из недостатков - только базовый набор классов, которые есть в JDK и ничего кроме. В этой же категории хотелось бы отметить другой онлайн компилятор: jdoodle. Выглядит он куда хуже, но в нём есть возможность подключать сторонние библиотеки. Какой-нибудь веб-сервер Undertow, увы, работать не будет. Но вот Apache Commons опробовать можно:
Онлайн база данных
Следующая категория, которая тоже может быть полезна - онлайн базы данных. Иногда может потребоваться база данных с доступом по веб, без разворачивания сервера локально и без какой-нибудь сложной навороченной системы. Опять же, это может быть полезно для обучения. Для этих целей здорово подходит "PostgreSQL as a Service":
Позволяет выполнять запросы, создавать таблицы. Кроме того, она доступна и извне. Тоесть её можно использовать и в тестовых проектах в своей IDE локально.
Онлайн IDE
Онлайн компиляторы, про которые мы прочитали выше, это хорошо. Но что если хочется большего? Например, хочется Maven проект на Java, чтобы он поднимал Spring приложение. На самом деле и такое можно. Для этого идеальным вариантом является codenvy.io. Codenvy позволяет создавать workspace:
Интересно, что в этом списке есть категория "Samples", в которой есть примеры приложений. Например, web-java-spring:
Важно!! Чтобы заставить работать, необходимо выбрать "Blank" стэк на Ubuntu. Дальше следует через контекстное меню открыть терминал и выполнить команды: Как видно на скриншоте, открыв терминал мы можем при помощи gradlew установить gradle и запускать проект через gradle tasks. Однако, умного автодополнения как у codenvy.io. Поэтому мучитьс с импортом вы будете сами ) Но для запуска проектов с гита вполне подойдёт.
Заключение
Читайте также: