Система для обмена файлами через веб на java: Веб-платформа на Java за 30 минут / Хабр

Содержание

Простой сайт на Java | Java master

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

Для того, чтобы без проблем освоить материал Вам нужны знания Java core — это основы джава; базовые понятия фронтенда HTML, CSS, JS. Если есть проблемы с фронтендом — не волнуйтесь. Выучите постепенно с джавой)).

Для начала, нам нужно установить стандартный набор для Java. В Eclipse нужно выбрать перспективу с Java на Java EE в правом верхнем углу.

Теперь у Вас в приложении появилось больше выбора для создания файлов. Теперь нужно создать новый Maven проект. File -> new -> other… -> maven -> Maven Project

Нажимаем Next и далее нас перебрасывает в окно выбора так называемого архетипа (archetype). Для чего это нужно? Да просто для удобства. Мы используем Maven как инструмент сборки потому, что он очень удобен. Нам не нужно больше искать дополнительные jar библиотеки в Интернете, качать их и подключать. Maven позволяет нам подключать дополнительные библиотеки в специальном файле настроек, который называется pom.xml. Несмотря на его внешнюю запутанность, он очень прост и удобен.

При выборе архетипа нужно выбрать maven-archetype-webapp:

Можно было создать простое java приложение и потом добавить pom.xml, необходимые папки, web.xml; но зачем, если за нас это может сделать выбор архетипа)).

Далее появиться окно ввода Group id, Artifact id. В строку Group id введите com.javamaster, а в строку Artifact id можно ввести например simplewebapp.

Нажимаем Finish и видим, что в панели проектов нам создало новый проект с названием нашего Artifact id. Если Вы откроете проект, то увидите, что программа создала много непонятных папок и несколько непонятных файлов. Но, это все нам пригодиться.

Не успели мы создать приложение, как уже выдает ошибку. Это не серьезная ошибка и приложение все равно запуститься без нее. Но так как я не люблю красные крестики в проекте нужно добавить одну зависимость в наш проект, чтобы ошибка исчезла. Так мы и познакомимся с pom.xml.

Откройте файл pom.xml, перейдите на вкладку кода: (на картинку можно нажать)

Далее в раздел dependencies (зависимости) нужно добавить:

  1. <dependency>

  2.             <groupId>javax</groupId>

  3.             <artifactId>javaee-web-api</artifactId>

  4.             <version>6.0</version>

  5.             <scope>provided</scope>

  6.         </dependency>

Этим действием мы добавили новую библиотеку к нашему проекту. Ничего не нужно скачивать: добавление нескольких строчек в pom.xml укажет вашей программе автоматически загрузить данные библиотеки. Сохраните файл и проблема с ошибкой проекта должна исчезнуть.

Теперь необходимо рассмотреть как работает веб и в частности, веб приложения.

На рисунке выше представлена схема работы интернет приложений: клиент, то есть Ваш браузер, посылает запрос по определенному адресу и порту; через Интернет запрос доходит до Вашего сервера, на котором находится приложение; обработанный запрос возвращается клиенту в виде ответа; браузер интерпретирует ответ с сервера в понятный для человека вид картинок или текст. Если Вам интересно, что именно передается по сети, советую скачать приложение Fiddler, который поможет Вам увидеть запросы и ответы с Вашего компьютера.

Теперь нужно посмотреть, как обрабатываются запросы самим веб приложением. Мы будем рассматривать пример java приложения, но схема будет работать и для других языков программирования.

Как мы уже поняли, на сервер приходит запрос далее он должен как-то оповестить о запросе наше приложение и наше приложение должно распознать этот запрос, проделать действия и отослать ответ.

Не самая красивая, но достаточно точная схема работы веб программы. Для распознавания запросов в Java есть такой механизм как сервлет (Servlet) — он может определить строку запроса и перенаправить его на jsp — технология, которая позволяет динамически генерировать веб страницы. По сути jsp очень похож на HTML с тем отличием, что в нем можно запускать Java код. Мы этого делать не будем, так как эта технология считается не самой лучшей. Детальнее о jsp будет в следующих статьях.

Сервлет — это класс, который унаследован от HttpServlet. В классе HttpServlet есть несколько методов по обработке запросов. Нас пока будут интересовать doGet и doPost, который обрабатывают соответственно гет и пост запросы. Если не знаете, что это такое — советую загуглить.

В нашем проекте нужно найти папку src/main/java. Если таковой нет, нужно ее создать: правой кнопкой на src -> new -> source folder.

Далее нужно добавить в эту папку новый пакет (Вы же не хотите помещать все классы в одной папке). Я назвал у себя: com.javamaster.controller

Теперь есть две возможность создать сервлет: создать класс и унаследовать его от HttpServlet и потом переопределить нужные нам методы или создать сервлет (на картинке выше можно увидеть, что система сама нам предлагает создать servlet). Разницы нет никакой. Если Вы выберете автоматическое создание, то получите то же самое. Вот мой сервлет, который я назвал HomeServlet (можно выбирать любое название).

  1. ackage com.javamaster.controller;

  2.  

  3. import java.io.IOException;

  4.  

  5. import javax.servlet.ServletException;

  6. import javax.servlet.http.HttpServlet;

  7. import javax.servlet.http.HttpServletRequest;

  8. import javax.servlet.http.HttpServletResponse;

  9.  

  10. public class HomeServlet extends HttpServlet {

  11.  

  12.     @Override

  13.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14.    

  15.     }

  16. }

В нем только один метод: doGet на данном этапе этого достаточно.

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

Для этого у нас есть web.xml — файл настроек нашей программы. Его можно найти в папке WEB-INF.

В моем случае системой был сгенерирован немного не такой файл, как мне нужно. Я замели его следующим содержимым:

  1. <?xml version=»1.0″ encoding=»UTF-8″?>

  2. <web-app xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»

  3.     xmlns=»http://java.sun.com/xml/ns/javaee»

  4.     xsi:schemaLocation=»http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd»

  5.     version=»3.0″>

  6.   <display-name>Archetype Created Web Application</display-name>

  7.  

  8.   <servlet>

  9.         <description></description>

  10.         <display-name>HomeServlet</display-name>

  11.         <servlet-name>HomeServlet</servlet-name>

  12.         <servlet-class>com.javamaster.controller.HomeServlet</servlet-class>

  13.     </servlet>

  14.     <servlet-mapping>

  15.         <servlet-name>HomeServlet</servlet-name>

  16.         <url-pattern>/</url-pattern>

  17.     </servlet-mapping>

  18. </web-app>

Если присмотреться, то тут все достаточно просто: мы указали что передаем управление урл путями нашему классу HomeServlet.

Теперь осталось добавить файл, который будет отвечать за внешний вид. Система уже создала нам файл index.jsp и проделала всю работу за нас.

Добавьте новую папку view в папку WEB-INF. Когда в нас появиться много файлов, чтобы не запутаться мы поместим все файлы, который отвечают за внешний вид в папку view. Переместите файл index.jsp в только что созданную папку.

Теперь осталось отловить запрос и перенаправить его на нашу страницу index.jsp. Для этого в сервлете метод doGet нужно немного изменить.

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2.         String path = request.getServletPath();
  3.         if (path.equals(«/»)){

  4.             request.getRequestDispatcher(«/WEB-INF/view/index.jsp»).forward(request, response);

  5.         }

  6.         else if (path.equals(«/welcome»)){

  7.             request.getRequestDispatcher(«/WEB-INF/view/welcome.jsp»).forward(request, response);

  8.         }

  9.     }

Думаю, код интуитивно понятен: если запрос равен /, тогда указываем путь, куда перенаправить запрос: на страницу индекс, если же запрос равен /welcome тогда, перенаправить на страницу приветствия. О HttpServletRequest подробнее поговорим в следующей части.

Теперь осталось только запустить наше приложение. Потерпите осталось недолго.

Нам нужен контейнер сервлетов, который сможет управлять нашей программой и который реализует Java Servlets и Java Server Pages (jsp) спецификации. Для наших нужд отлично подойдет Apache Tomcat — он бесплатный и очень удобный в использовании.

Apache Tomcat нужно скачать с официального сайта, распаковать и указать в настройках Eclipse путь к распакованному архиву. Сделаем все по порядку.

Качаем архив с сайта:

Распаковываем его в желаемую папку на диске.

Переходим в Eclipse и во вкладке сервера нажимаем создать новый:

Если такой вкладки у Вас нет, ее нужно добавить: Window -> View -> Servers

Тепер

Эволюция создания веб-приложений на Java / Блог компании JUG Ru Group / Хабр

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



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

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

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


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

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

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


На первой временной шкале данные из таблицы приведены в том же порядке, что и в таблице. Имеющиеся группы расположены по степени популярности. В группах (спецификация, 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.


Использование 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 год).

Третий пример (модули helloworld-web-servlet-interface-jar и helloworld-web-servlet-interface-war) чуть более сложен. В нём показывается использование реализации интерфейса ServletContainerInitializer, также появившегося в Servlet 3.0. В первом модуле helloworld-web-servlet-interface-jar по-прежнему нет файла дескриптора развёртывания

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, соответственно.

В 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-классами.

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 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-е годы


Разработка 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, применив для этого соответствующий плагин.

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


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

MicroProfile


Из-за существующей тяжеловесности Java EE у ряда компаний появилась потребность для реализации микросервисов разработать легковесный набор спецификаций, что и было сделано — в сентябре 2016 года увидел свет MicroProfile 1.0. Первоначально набор включал лишь три спецификации (
CDI
, JAX-RS и JSON-P). Постепенно потребности возрастали, к версии 3.0 список спецификаций значительно вырос.
В настоящее время существуют веб-фреймворки, удовлетворяющие MicroProfile в разной степени. Для демонстрации было выбрано семь из них, ниже приведено соответствие версий фреймворков версиям MicroProfile. Полная информация обо всех существующих фреймворках, реализующих MicroProfile, находится здесь.

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

Сервлет-контейнеры и серверы приложений


Веб-приложения исполняются в специализированном программном обеспечении, реализующем соответствующие спецификации (например, Servlet API). Ниже приведены наиболее популярные на данный момент сервлет-контейнеры и серверы приложений. Процент популярности также взят из результатов исследования (вопрос 20).

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

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

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


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

В уже упомянутом выше исследовании в вопросе номер 16 интересовались, какие не

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

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


Для демонстрации типичного веб-приложения на 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: первый, второй и третий репозитории.

Доклады прошедших конференций JUG Ru Group по теме статьиSpring:
  • «Spring the Ripper», Евгений Борисов (JPoint 2014: видео, презентация)
  • «Spring Data? Да, та!», Евгений Борисов (Joker 2014: видео, презентация)
  • «Spring Puzzlers: тонкости и нюансы работы Spring», Евгений Борисов (Joker 2014: видео)
  • «Spring Puzzlers — Начало», Барух Садогурский и Евгений Борисов (JPoint 2015: видео, презентация)
  • «The Bootiful Application», Josh Long (Joker 2015: видео, презентация)
  • «Твой личный Spring Boot Starter», Кирилл Толкачёв и Александр Тарасов (JPoint 2016: видео, презентация)
  • «Spring – Глубоко и не очень», Евгений Борисов (JPoint 2017: видео, презентация)
  • «Проклятие Spring Test», Кирилл Толкачев и Евгений Борисов (JPoint 2017: видео, презентация)
  • «Boot yourself, Spring is coming», Кирилл Толкачев и Евгений Борисов (Joker 2017: видео)
  • «Дизайн реактивной системы на Spring 5/Reactor», Максим Гореликов (Joker 2017: видео)
  • «Spring Framework 5.0 on JDK 8 & 9», Juergen Hoeller (JPoint 2018: видео, презентация)
  • «Spring Framework 5: feature highlights and hidden gems», Juergen Hoeller (JPoint 2018: видео, презентация)
  • «Camel microservices with Spring Boot and Kubernetes», Claus Ibsen (JPoint 2018: видео, презентация)
  • «Spring Boot и Xtend: сеанс чёрной магии c разоблачением», Андрей Когунь (JPoint 2018: видео, презентация)
  • «Boot yourself, Spring is coming», Кирилл Толкачев и Евгений Борисов (JPoint 2018: видео часть 1 и часть 2, презентация)
  • «Spring Boot 2: чего не пишут в release notes», Владимир Плизга (Joker 2018: видео, презентация)
  • «The Proxy fairy and the magic of Spring», Victor Rentea (JPoint 2019: видео, презентация)
  • «Нас Spring Boot, а мы крепчаем: невыносимая легкость AOT-компиляции Spring-приложений», Никита Липский (JPoint 2019: видео, презентация)
  • «Reactive или не reactive, вот в чем вопрос», Кирилл Толкачёв и Евгений Борисов (JPoint 2019: видео, презентация)
  • «Перевод Spring Boot-микросервисов с Java 8 на 11: что может пойти не так?», Владимир Плизга (JPoint 2019: видео, презентация)

Play:
  • «50 оттенков Play!», Андрей Солнцев (Joker 2015: видео)

Vaadin:

Vert.x:
  • «Vert.x: руководство по эксплуатации», Владимир Красильщик (Joker 2015: видео)
  • «Vert.x: Красавица и Чудовище», Владимир Красильщик (Joker 2016: видео, презентация)
  • «Реактивное программирование на Vert.x », Антон Ленок (JPoint 2018: видео, презентация)

Micronaut:
  • «Micronaut vs Spring Boot, или Кто тут самый маленький?», Кирилл Толкачёв и Максим Гореликов (Joker 2018: видео, презентация)

MicroProfile:

Java и JavaScript:


UPD: В репозиторий добавлены примеры использования Quarkus (модуль helloworld-web-quarkus) и ActFramework (модуль helloworld-web-actframework), т.е. примеров стало 39.
25-26 октября 2019 года в Санкт-Петербурге состоится конференция для Java-разработчиков Joker 2019, на которую до 1 октября можно дешевле купить билеты.

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

Простая инсталляция Java веб-приложения (часть 1) / Хабр

Итак, вы написали свое супер веб-приложение на Java и теперь хотите что бы как можно больше людей его скачало, задеплоило и начало пользоваться? Все отлично, только для для некорых java-прораммистов, особенно для тех, кто последние цать лет прожил в мире J2EE может быть открытием, что для 99,9% людей в этом мире слова «Просто задеплойте этот WAR-ник на ваш любимый сервер» окажутся пустым звуком. Ну ок, может не 99,9% а 99,8% — ну или около того.

Ниже следует первая часть туториала о том, как из вашего варника сделать красивый Windows Installer (да-да, мало того что большинство людей не знают слова деплой, так они еще и Windows пользуются!) с использованием WiX

Постановка задачи

Итак, мы имеем:
  • Само веб приложение написанное на Java. В данном случае предполагается что сборка приложения ведется с помощью maven-а (если вы еще этого не делаете — очень рекомендую). В результате сборки вы получаете war-файл (ок — не полноценный EAR — но для EAR вам просто необходимо будет паковать другой сервер)
  • Предполагается что данное приложение работает под сервером Jetty 6.0.x (если нет — опять-таки — вам прсто надо будет паковать другой сервер)

Хотим создать установку нашего приложение через Windows Installer. В ходе установки необходимо:
  • Выполять стандартные действия (спросить куда ставить, показать лицензию, показать прогресс)
  • Установить само приложение в указанное место
  • Сконфигурировать его запуск в качестве сервиса
  • Добавить ссылку на главную страницу приложения на Десктоп (что бы пользователь мог лекго к нему обратиться)

Чем будем пользоваться:

  • maven для сборки
  • jetty в качестве сервера
  • WiX для создания инсталлера

Все продукты являются Open-Source

Некоторые моменты возможно будут раскрыты тут не полностью — любые вопросы и пожелания приветсвуются. Данное решение применено для создания инсталлера для проекта EmForge — данный проект является open-source, так что рабочий пример можно получить из его исходников (например через web-viewer: www.emforge.org/browser/EmForge/trunk или просто забрав исходники из svn-репозитория svn.emforge.org/svn/emforge/EmForge/trunk

В данной части мы рассмотрим процесс создания zip-архива с приложением, готовым к запуску

Итак, поехали…

Паковка приложения вместе с Jetty

В первую очередь, нам необходимо избавить пользователя от понимания слова Deploy. Есть несколько возможных решений, можно например упаковать простенький сервер прям в war-ник, как это делают в Hudson-е (интересное решение — но с ним я еще не разбирался). Мы же пойдем другим путем — и создадим Zip-архив в который положим Jetty, сконфигурированный для запуска нашего war-ника.

Идея была взята с этого блога: blog.devspan.com/2008/02/creating-distributable-war-project-with.html — тут я опишу только основную идею (если надо — скажите — распишу подробней):

  • У нас есть веб-проект собираемый мавеном (http://www.emforge.org/browser/EmForge/trunk/emforge-web в нашем случае)
  • Создаем новый проект launcher. Структу проекта и требуемые файлы можно просто скопировать с emforge-launcher допилив его напильником под ваш проект: www.emforge.org/browser/EmForge/trunk/emforge-launcher
  • Конфигурируем в данном проекте maven-assembla-plugin, что бы тот брал варник и требуемые jetty-библиотеки из maven-репозитория и клал их в «правильные» места
  • Сначала запускаем mvn clean install в нашем веб-проекте, что бы maven собрал и положил наш проект в локальный репозиторий
  • Затем запускаем mvn clean assembly:assembly в launcher-проекте — в результате чего мы получим требуемый zip

В результате мы получаем zip в котором будет лежать jetty и ваше приложение. Структура зипа будет примерно следующая:
- etc Каталог с настройками Jetty
- jetty.xml
- jetty-win32-service.xml
- webdefault.xml
- lib Каталог с с файлами, требуемыми для старта jetty
- wrapper.dll
- wrapper-3.2.0.jar
- jety-6.1.14.jar
- jetty-util-6.1.14.jar
- jetty-win32-service-java-6.1.14.jar
- servlet-api-2.5-6.1.14.jar
- start-6.1.14.jar
-logs Место куда должны ложиться логи
- webapps
- root А тут должно оказаться ваше приложение

Jetty-Service.exe Этот файл поможет запустить jetty как сервис
jetty-service.conf А это го настройка

Пожалуйста проверьте:

  • jetty-service.conf должен содержать имя вашего сервиса. По умолчанию это будет Jetty — но наверняка вы захотите что-нибудь другое
  • так же проверьте что jetty-service.conf содержит правильные пути на libs & logs
  • В jetty.xml проверьте порт, на котором будет запущен сервис — по умолчанию это 8080, но этот порт очень широко используется и потому лучше использовать какой-нибудь другой порт
  • каталог root должен содержать ваше веб-приложение, то есть каталог WEB-INF должен лежать прям под root

Ну вот и все на данный момент. В принципе, на этом можно и остановится — не ленивый пользователь уже может просто скачать зип, распаковать его и запустить сервер с вашим приложением при помощи run.bat или run.sh

О решении для «ленивых» пользователей мы поговорим в следующей серии

Дорожная карта web-разработчика Java в 2019 году

Java – это огромная экосистема, в которой легко потеряться. Это подробный гайд по фреймворкам с подборкой книг и лайфхаков.

Почему Java?

Java – технология с долгой историей. Вокруг нее постоянно растут стеки инструментов. Потом они становятся монструозными, и на смену им приходят новые. Против Java ведется политическая война со стороны других корпораций. Этот язык программирования никогда не будет модным. Он не выглядит сексуально с его бойлерплейт-кодом и слухами о плохой производительности.

При этом экосистема Java является стандартом де-факто для корпоративной разработки. Платформа уверенно занимает нишу в мобильных технологиях и Web. Реализованы шикарные инструменты для big data, такие как Hadoop и Spark. Все это взято у конкурентов без боя: бизнес требует от инструментов разработки прозрачности и надежности. Поэтому Java с её безопасностью кода, хорошим подходом к многопоточности и низкому порогу вхождения для свежих разработчиков, дает бизнесу то, что ему нужно.

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

Быстрый старт

Для начала нужно установить JDK и любую IDE. Из версий сейчас самая популярная 8-я. Из IDE можно начать с IntelliJ IDEA.

Есть две классических Java книги, которые рекомендуются сообществом к изучению. Это «Effective Java» Джошуа Блоха и «Философия Java» Брюса Эккеля. Но чтение толстых книг в начале обучения фундаментальным основам языка – не самый эффективный и быстрый путь влиться. Лучше взять за основу что-нибудь проще. Например, «Head First Java», её чтение не утомляет.

Так почему «Идея»?

Разработчик IntelliJ IDEA создал отличный плагин EduTools, который встраивается прямо в IDE. Он содержит в себе упражнения, позволяющие быстро изучить основы языка в интерактивном режиме. Этого инструмента, в сочетании с литературой, вполне достаточно для построения базы.

Если есть хороший технический бэкграунд в другом объектно-ориентированном языке программирования, то можно срезать углы. Потому что существует класс книг, написанных специально для таких «новичков». Например, «Java for C/C++ Developers» от Michael C. Daconta. В таких книгах обычно перечисляются ключевые отличия одной технологии от другой. Это экономит время на обучение, фокусируя только на нужных деталях.

Обучение через тестирование

Область, которую предстоит изучить, огромна. Нет границ, которые позволят уверенно сказать «всё, теперь я знаю Java». Ни прочитанные книги, ни написанные программы, ни пройденные курсы, ни освоенные технологии.

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

Заведите метрики для отслеживания прогресса. Для этого нужно проходить тесты достаточно часто, благо сейчас их много в Интернете. Мы проходим Java тест, смотрим на результат, ищем пробелы в знаниях, выписываем, гуглим, восполняем. Это хорошая стратегия, она эффективнее последовательного изучения книги за книгой. Хороший маркер – это когда вы написали какой-то код, а спустя время поняли, что он плох. Хорошим финалом при этом будет прохождение OSJP – самой авторитетной сертификации от Oracle.

Что еще?

Стек Java для web-приложений многогранен, и нужно на базовом уровне овладеть и смежными технологиями.

Для начала стоит представлять типовую архитектуру того, что делает web-разработчик. Всё, что видит перед собой пользователь в браузере – это клиент или frontend-часть приложения. Данные и команды, инициированные действиями пользователя, отправляются на сервер по протоколу HTTP в соответствии с определенными договоренностями об их формате и значении. Эти договоренности формируют web API приложения и реализуются надстройками над HTTP вроде RESTful или, реже, GraphQL. Данные обычно упаковываются в JSON или XML, хотя есть место и кастомным реализациям.

Серверная часть приложения, backend, принимает данные, десериализует их во внутреннее представление, осуществляет авторизацию и аутентификацию пользователя, валидацию пришедшей информации, реализует какую-то бизнес-логику, сохраняет часть информации в БД и формирует необходимый ответ для клиента. Само приложение для взаимодействия с клиентом может поднимать встроенный web-сервер или само встраиваться в сторонний web-сервер.

Это значит, что нам необходимо иметь ясное представление о:

  • СУБД и SQL, реляционном и нереляционном хранении данных. Для этого рекомендуется книга «Head First SQL» + ознакомление со статьями по NoSQL для общей эрудиции. Погонять запросики помогут удобные online-сервисы.
  • Протоколе HTTP и передаче данных. Фундаментальная вещь – это «Компьютерные сети» Эндрю Таненбаума и первые общие главы любой книги по PHP от Дмитрия Котерова. Несмотря на другой язык программирования, автор дает очень хорошее общее понимание взаимодействия клиента и сервера.
  • JSON и XML. Достаточно просто статей из Википедии для общего понимания этих форматов.
  • Javascript и HTML. Базовые знания нужны, потому что часто backend генерирует странички, выдаваемые в браузер, например, по технологии JSP. Достаточно посмотреть путь javascript-разработчика и выбрать то, что приглянулось. Хотя можно взять за основу что-то вроде Vaadin, который на выходе сгенерирует Javascript-код и подтянет нужные стили по Java-коду.

Pet project

При изучении Java очень важно соблюдать баланс между теорией и практикой, причем реализация учебных программ из упражнений относится к теории. Плохо сидеть в учебниках и смотреть лекции на Youtube без написания реального (условно) приложения. Также плохо бросаться в код и городить костыли; если будет сделано рабочее приложение, но не будут приобретены знания – это тоже впустую потраченное время.

Хороший подход – придумать идею web-сервиса и постепенно реализовывать его, шаг за шагом, по мере приобретения новых знаний. Это может быть ToDo List или каталог просмотренных фильмов, дневник или маленький движок форума, игрушечные CMS или CRM. Это нормально, если код придется часто переписывать, порой с нуля: это говорит о прогрессе.

Очень важно сделать все «велосипедом», с минимумом дополнительных библиотек и уж точно без фреймворков. Самописный web-сервер на основе сокетов, маршаллер XML/JSON, собственные контейнеры. Не обойдется без изучения рефлексии и базовых паттернов (лучшая книга по шаблонам разработки — GoF). Код на выходе получится ужасным, но основное тут – получить набор проблем, которые очень красиво решаются фреймворками.

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

Java EE и Spring

Java Enterprise Edition и фреймворк Spring постоянно идут рука об руку в обучении. Важно понимать их различия и сходства. Формально говоря, Java EE (Jakarta EE) – это спецификация, описывающая архитектуру серверной части приложения. Отчасти, Java стала столь популярной технологией благодаря смещению акцента разработки на бизнес-логику. Если вы приходите к заказчику, предприятию, то его не интересуют технические детали. Зато его интересует, каким образом новый продукт улучшит его жизнь и принесет финансовую прибыль.

Набор спецификаций согласует все части приложения и гарантирует их взаимную работу. Так вводится парадигма предметно-ориентированного проектирования. Все хорошо понятные бизнесу предметные области выделяются и перекладываются в чистый Java-код. Затем пишется интеграция между ними, декларируется сквозной путь данных в процессе обмена. В итоге получается пакет кода, описывающего бизнес-логику ПО. А реализация всех технических деталей ложится на сервер приложений. Этот класс ПО называется middleware, его примерами являются WebSphere, Weblogic, WildFly. Такой контейнер, по сути, одна большая зависимость, которая и «поставляет» функционал в соответствии с написанной логикой.

Spring же – просто фреймворк. Java EE – это не самая удачная попытка стандартизации, ставшая тяжеловесной, а Spring изначально появился как легкая и понятная альтернатива. Впрочем, и Spring разросся со временем и появился фреймворк над фреймворком – Spring Boot.

В процессе обучения лучшая стратегия – ознакомиться и с той, и с другой платформой. Для изучения Java EE отлично подходят книги «Head First Servlets and JSP» и «Программирование web-приложений на языке Java» Буди Курняван. Для Spring – «Spring в действии» Крейга Уоллса. Так как Spring включает в себя очень много всего, сфокусироваться для начала следует на модулях Core, MVC и Web-MVC и Security.

Какой стек выбрать?

Когда придет понимание, что Spring Beans похожи на EJB, Spring Service Locator – на JNDI, Spring Security – на JAAS, Spring Data – на JPA и т. д., это станет важнейшим майлстоуном в обучении. Вторым будет ознакомление с хорошими реализациями, постижение best practices. В случае Spring можно воспользоваться кодогенератором JHipster – сгенерированный этим инструментом код имеет хорошую структуру и задействует множество популярных технологий. Кстати, в дальнейшем этот сервис можно будет использовать для быстрого прототипирования.

В дальнейшем можно сфокусироваться на одной из платформ, а за развитием второй просто следить в фоновом режиме, углубляя эрудицию. Порой придется выбирать какую-то технологию, исходя из того, что более подходит к задаче. Например, на Java EE с её JSF и PrimeFaces легче сделать масштабируемое приложение с генерируемым сервером клиентом. А на Spring легко делаются модные микросервисы. Но это все условно – порой эффективнее разрабатывать на хорошо знакомом фреймворке, а не на том, который лучше приспособлен.

Что дальше?

Помимо основных фреймворков, в Java куча всего полезного. Например, Jasper для построения отчетов в реальном времени. Или JOOQ для создания запросов к базам данных. Нужно уметь тестировать свой код при помощи JUnit или Mockito. Полезно использовать Sonar для валидации стиля кода. Если предполагается большой объем данных, то почти наверняка придется столкнуться с Hadoop. А Gradle и Maven помогут систематизированно управлять жизненным циклом своего ПО.

В этом многообразии легко потеряться. Поэтому важнее не изучать эти инструменты, а изучать информацию о них. Где они применяются, в чем ключевые особенности. И использовать их только тогда, когда без них не обойтись. Потому что вряд ли придется писать сложный код на Gradle. А большую часть Maven-инструкций можно просто скопировать со StackOverflow. Нет нужды читать книги толщиной с руку по этим технологиям, тратя лишнее время.

Помимо Spring и Java EE, есть также Spark и Play, Struts и Grails. Их нужно обязательно попробовать. Хотя бы для того, чтобы понять, что есть жизнь и без Spring с его DI. Развитие эрудиции по всему многообразию инструментов и фокус на одном из инструментов – лучшая стратегия в обучении.

Как работают веб-приложения / Хабр

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

1. Чем веб-приложения отличаются от сайтов


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

Сайты содержат различную статику, которая как и HTML-файл не генерируется на лету. Чаще всего это картинки, CSS-файлы, JS-скрипты, но могут быть и любые другие файлы: mp3, mov, csv, pdf.

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

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

2. Какие бывают веб-приложения


Веб-приложения можно разделить на несколько типов, в зависимости от разных сочетаний его основных составляющих:
  1. Backend (бэкенд или серверная часть приложения) работает на удаленном компьютере, который может находиться где угодно. Она может быть написана на разных языках программирования: PHP, Python, Ruby, C# и других. Если создавать приложение используя только серверную часть, то в результате любых переходов между разделами, отправок форм, обновления данных, сервером будет генерироваться новый HTML-файл и страница в браузере будет перезагружаться.
  2. Frontend (фронтенд или клиентская часть приложения) выполняется в браузере пользователя. Эта часть написана на языке программирования Javascript. Приложение может состоять только из клиентской части, если не требуется хранить данные пользователя дольше одной сессии. Это могут быть, например, фоторедакторы или простые игрушки.
  3. Single page application (SPA или одностраничное приложение). Более интересный вариант, когда используются и бэкенд и фронтенд. С помощью их взаимодействия можно создать приложение, которое будет работать совсем без перезагрузок страницы в браузере. Или в упрощенном варианте, когда переходы между разделами вызывают перезагрузки, но любые действия в разделе обходятся без них.

3. Pyhon-фреймворк Django aka бэкенд


В разработке фреймворк — это набор готовых библиотек и инструментов, которые помогают создавать веб-приложения. Для примера опишу принцип работы фреймворка Django, написанного на языке программирования Python.

Первым этапом запрос от пользователя попадает в роутер (URL dispatcher), который решает какую функцию для обработки запроса надо вызвать. Решение принимается на основе списка правил, состоящих из регулярного выражения и названия функции: если такой-то урл, то вот такая функция.

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

Данные приложения хранятся в базе данных (БД). Чаще всего используются реляционные БД. Это когда есть таблицы с заранее заданными колонками и эти таблицы связаны между собой через одну из колонок.

Данные в БД можно создавать, читать, изменять и удалять. Иногда для обозначения этих действий можно встретить аббревиатуру CRUD (Create Read Update Delete). Для запроса к данным в БД используется специальный язык SQL (structured query language).

В Джанго для работы с БД используются модели (model). Они позволяют описывать таблицы и делать запросы на привычном разработчику питоне, что гораздо удобнее. За это удобство приходится платить: такие запросы медленнее и ограничены в возможностях по сравнению с использованием чистого SQL.

Полученные из БД данные подготавливаются во вью к отправке на фронт. Они могут быть подставлены в шаблон (template) и отправлены в виде HTML-файла. Но в случае одностраничного приложения это происходит всего один раз, когда генерируется HTML-страница, на который подключаются все JS-скрипты. В остальных случаях данные сериализуются и отправляются в JSON-формате.

4. Javascript-фреймворки aka фронтенд


Клиентская часть приложения — это скрипты, написанные на языке программирования Javascript (JS) и исполняемые в браузере пользователя. Раньше вся клиентская логика основывалась на использовании библиотеки JQuery, которая позволяет работать с DOM, анимацией на странице и делать AJAX запросы.

DOM (document object model) — это структура HTML-страницы. Работа с DOM — это поиск, добавление, изменение, перемещеие и удаление HTML-тегов.

AJAX (asynchronous javascript and XML) — это общее название для технологий, которые позволяют делать асинхронные (без перезагрузки страницы) запросы к серверу и обмениваться данными. Так как клиентская и серверная части веб-приложения написаны на разных языках программирования, то для обмена информацией необходимо преобразовывать структуры данных (например, списки и словари), в которых она хранится, в JSON-формат.

JSON (JavaScript Object Notation) — это универсальный формат для обмена данными между клиентом и сервером. Он представляет собой простую строку, которая может быть использована в любом языке программирования.

Сериализация — это преобразование списка или словаря в JSON-строку. Для примера:

Словарь:

    {
        'id': 1, 
        'email': '[email protected]'
    }

Сериализованная строка:
    '{"id": 1, "email": "[email protected]"}'

Десериализация — это обратное преобразование строки в список или словарь.

С помощью манипуляций с DOM можно полностью управлять содержимым страниц. С помощью AJAX можно обмениваться данными между клиентом и сервером. С этими технологиями уже можно создать SPA. Но при создании сложного приложения код фронтенда, основанного на JQuery, быстро становится запутанным и трудно поддерживаемым.

К счастью, на смену JQuery пришли Javascript-фреймворки: Backbone Marionette, Angular, React, Vue и другие. У них разная философия и синтаксис, но все они позволяют с гораздо большим удобством управлять данными на фронтенде, имеют шаблонизаторы и инструменты для создания навигации между страницами.

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

Полученная в результате рендеринга страница показывается пользователю. Переход в другой раздел в SPA это применение другого шаблона. Если необходимо использовать в шаблоне другие данные, то они запрашиваются у сервера. Все отправки форм с данными это AJAX запросы на сервер.

5. Как клиент и сервер общаются между собой


Общение клиента с сервером происходит по протоколу HTTP. Основа этого протокола — это запрос от клиента к серверу и ответ сервера клиенту.

Для запросов обычно используют методы GET, если мы хотим получить данные, и POST, если мы хотим изменить данные. Еще в запросе указывается Host (домен сайта), тело запроса (если это POST-запрос) и много дополнительной технической информации.

Современные веб-приложения используют протокол HTTPS, расширенную версию HTTP с поддержкой шифрования SSL/TLS. Использование шифрованного канала передачи данных, независимо от важности этих данных, стало хорошим тоном в интернете.

Есть еще один запрос, который делается перед HTTP. Это DNS (domain name system) запроc. Он нужен для получения ip-адреса, к которому привязан запрашиваемый домен. Эта информация сохраняется в браузере и мы больше не тратим на это время.

Когда запрос от браузера доходит до сервера, он не сразу попадает в Джанго. Сначала его обрабатывает веб-сервер Nginx. Если запрашивается статический файл (например, картинка), то сам Nginx его отправляет в ответ клиенту. Если запрос не к статике, то Nginx должен проксировать (передать) его в Джанго.

К сожалению, он этого не умеет. Поэтому используется еще одна программа-прослойка — сервер приложений. Например для приложений на питоне, это могут быть uWSGI или Gunicorn. И вот уже они передают запрос в Джанго.

После того как Джанго обработал запрос, он возвращает ответ c HTML-страницей или данными, и код ответа. Если все хорошо, то код ответа — 200; если страница не найдена, то — 404; если произошла ошибка и сервер не смог обработать запрос, то — 500. Это самые часто встречающиеся коды.

6. Кэширование в веб-приложениях


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

Cache — это концепция в разработке, когда часто используемые данные, вместо того чтобы их каждый раз доставать из БД, вычислять или подготавливать иным способом, сохраняются в быстро доступном месте. Несколько примеров использования кэша:

  • В Джанго пришел запрос на получение данных для графика в отчете. Мы достаем из БД данные, подготавливаем их и кладем в БД с быстрым доступом, например, memcached на 1 час. При следующем запросе мы сразу достанем их из memcached и отправим на фронтенд. Если мы узнаём, что данные перестали быть актуальными, мы их инвалидируем (удаляем из кэша).
  • Для кэширования статических файлов используются CDN (content delivery network) провайдеры. Это серверы, расположенные по всему миру и оптимизированные для раздачи статики. Иногда бывает эффективнее положить картинки, видео, JS-скрипты на CDN вместо своего сервера.
  • Во всех браузерах по умолчанию включено кэширование статических файлов. Благодаря этому, открывая сайт не в первый раз, все загружается заметно быстрее. Минус для разработчика в том, что со включенным кэшем не всегда сразу видны изменения сделанные в коде.

Как передавать файлы с одного компьютера на другой по сети с помощью Java?

Переполнение стека
  1. Около
  2. Продукты
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Обратитесь к разработчикам и технологам со всего мира
  6. О компании
.

Панель управления Java

В этом разделе описывается панель управления Java, которая используется для управления запуском приложений Java и JavaFX, встроенных в браузер или запускаемых из браузера на вашем компьютере. Настройки в панели управления Java не используются автономными и автономными приложениями.

20.1 Общие

На рисунке 20-1 показана вкладка Общие.

Вкладка «Общие» содержит следующие разделы: «О программе», «Параметры сети» и «Временные файлы Интернета».Эта вкладка также показывает, включена ли Java в браузере, что контролируется на вкладке «Безопасность».

20.1.1 Около

В разделе «О программе» представлена ​​информация о версии Java, которую вы используете. Щелкните О , чтобы просмотреть информацию о версии последней версии JRE, установленной на компьютере.

20.1.2 Сетевые настройки

Раздел «Параметры сети» позволяет настроить подключение к сети. Щелкните Параметры сети , чтобы открыть диалоговое окно Параметры сети, в котором предлагаются следующие варианты:

Использовать настройки браузера

Выберите этот параметр, чтобы использовать настройки прокси-сервера по умолчанию в браузере.Это значение по умолчанию.

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

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

Чтобы указать отдельные адреса для разных протоколов, щелкните Advanced . Вы также можете указать адрес для обхода прокси-сервера.

Использовать сценарий автоматической настройки прокси

Выберите этот параметр, чтобы указать URL-адрес файла JavaScript (.js или .pac), который содержит функцию FindProxyForURL . FindProxyForURL имеет логику для определения прокси-сервера, который будет использоваться для запроса на соединение.

Прямое соединение

Выберите этот вариант, если вы не хотите использовать прокси.

20.1.3 Временные файлы Интернета

Раздел «Временные файлы Интернета» позволяет управлять файлами, кэшируемыми для приложений, встроенных в веб-страницу или запускаемых с веб-страницы.

Щелкните Settings , чтобы открыть диалоговое окно Temporary Files Settings, из которого вы можете выполнить следующие действия:

  • Укажите, хотите ли вы хранить временные файлы на вашем компьютере.

  • Укажите место, где хранятся временные файлы.

  • Укажите уровень сжатия для файлов JAR.

  • Укажите объем дискового пространства для хранения временных файлов.

  • Удалите временные файлы, нажав кнопку Удалить файлы , которая открывает диалоговое окно «Удалить временные файлы». В этом диалоговом окне вы можете указать файлы, которые хотите удалить:

  • Восстановите настройки по умолчанию для диалогового окна «Настройки временных файлов», нажав кнопку « Восстановить настройки по умолчанию» .

Щелкните View , чтобы открыть диалоговое окно Java Cache Viewer.Это диалоговое окно позволяет вам перечислить приложения, ресурсы и удаленные приложения, хранящиеся в кэше Java. Кроме того, вы можете выполнять следующие действия:

20.2 Обновление

Вкладка «Обновление» доступна в Microsoft Windows и OS X как для 32-разрядной, так и для 64-разрядной версии JRE и только для пользователей с правами администратора. В Microsoft Windows, если JRE установлена ​​и эта панель недоступна, запустите панель управления Java непосредственно из командной строки ( <каталог установки JRE> \ bin \ javacpl.exe ). На рисунке 20-2 показана вкладка «Обновление».

Вкладка «Обновление» используется с планировщиком обновлений Java ( jusched.exe ) для предоставления конечным пользователям последних обновлений Java. Эта вкладка позволяет вам автоматически или вручную обновлять все JRE (включая 32-битные и 64-битные версии), установленные в вашей системе.

20.2.1 Параметры вкладки «Обновить»

На вкладке «Обновление» доступны следующие параметры:

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

Щелкните Advanced , чтобы настроить расписание обновлений. Чтобы установить, как часто система проверяет наличие обновлений, выберите Ежедневно , Еженедельно или Ежемесячно . По умолчанию — ежемесячно. Для ежедневных обновлений вы можете выбрать время дня для обновления. Для еженедельных обновлений вы можете выбрать день недели и время суток.Для ежемесячных обновлений вы можете выбрать день недели и время суток. Ежемесячные обновления проверяются еженедельно и уведомляют вас в течение 30 дней о доступности обновления, однако, если обновление считается критическим, вы получите уведомление в течение недели после его выпуска.

Чтобы немедленно обновить JRE в любое время, щелкните Обновить сейчас .

20.2.2 Планировщик обновлений Java

На платформах Microsoft Windows планировщик обновлений Java, jusched.exe , используется для запуска автоматических обновлений, когда на вкладке «Обновление» выбрана опция автоматического обновления. jusched.exe запускается как фоновый процесс, который запускает диспетчер обновлений с предварительно определенными интервалами, установленными пользователем с помощью кнопки Advanced на вкладке «Обновление». Менеджер обновлений координирует процесс обновления.

jusched.exe запускается, когда пользователь перезагружает компьютер после установки JDK или JRE. Обычно он прозрачен для пользователя, но его можно просмотреть на вкладке «Процессы» диспетчера задач Windows. Если вы не хотите, чтобы планировщик запускался, используйте кнопку Завершить процесс на вкладке «Процессы», чтобы завершить процесс.

20,3 Java

На рисунке 20-3 показана вкладка Java.

Щелкните View , чтобы отобразить диалоговое окно Параметры среды выполнения Java, в котором представлена ​​информация об установленных в вашей системе JRE и позволяет выбрать JRE, которые вы хотите использовать для запуска приложений, встроенных в веб-страницу или запускается из браузера.

20.3.1 Параметры среды выполнения Java

В диалоговом окне «Параметры среды выполнения Java» есть две вкладки: Пользователь и Система .Обе вкладки показывают таблицу, содержащую информацию об установленных в вашей системе JRE. На вкладке «Пользователь» отображаются все зарегистрированные JRE и JRE, добавленные пользователем. На вкладке «Система» отображается JRE, которая использовалась для запуска панели управления Java.

Каждая строка в таблице представляет среду выполнения Java (JRE), установленную на вашем компьютере. Для каждой JRE предоставляется следующая информация:

  • Платформа : Версия JRE

  • Продукт : полный номер версии JRE, включая номер обновления

  • Расположение : URL-адрес, который планировщик обновлений Java использует для запуска автоматических обновлений

  • Путь : Полный путь к JRE

  • Параметры времени выполнения : Дополнительные настраиваемые параметры, используемые для переопределения параметров запуска по умолчанию подключаемого модуля Java

  • Включено : Флаг, указывающий, какая из версий JRE учитывается при запуске приложения с использованием подключаемого модуля Java или Java Web Start.Настройки панели управления Java не применяются к автономным или автономным приложениям. Если флажок для JRE не установлен, то подключаемый модуль Java и Java Web Start не будут использовать JRE для запуска приложений Java. Однако текущая JRE может использоваться, даже если она не отмечена как включенная.


    Примечание:

    Если содержимое Java в браузере отключено на вкладке «Безопасность» панели управления Java, включение JRE в диалоговом окне «Параметры среды выполнения Java» не имеет никакого эффекта.См. Раздел 20.4, «Безопасность» для получения информации о Включить Java-контент в браузере .

Чтобы изменить информацию для JRE на вкладке «Пользователь», щелкните ячейку в таблице и измените значение. Информация на вкладке «Система» не редактируется.

Во вкладке Пользователь доступны следующие функции:

  • Щелкните Найти , чтобы запустить JRE Finder .Используйте эту утилиту для поиска JRE, установленных на вашем компьютере, и добавления их в таблицу.

  • Щелкните Добавить , чтобы вручную добавить JRE в таблицу. В таблицу добавляется новая строка. Введите значения для Platform , Product , Path , Runtime Parameters и Enabled .

  • Щелкните Удалить , чтобы удалить выбранную JRE из таблицы.

В таблице всегда есть хотя бы одна запись, которая является последней установленной JRE. Это JRE, связанная с панелью управления Java.

Microsoft Windows показывает все JRE, установленные на компьютере. Панель управления Java находит JRE, просматривая реестр. В Solaris, Linux и OS X JRE, которую Java Web Start или Java Plug-in использует для развертывания приложений, является JRE, которая считается зарегистрированной. Поэтому используйте кнопки Найти , Добавить и Удалить , чтобы изменить список JRE в таблице.В OS X отображается только текущая установленная JRE, JDK не включены.

Для Solaris, Linux или OS X должна быть добавлена ​​только версия 5.0 или выше. Для Microsoft Windows, где все JRE находятся в реестре, отображается версия 1.3.1 или выше.

20.3.2 Параметры среды выполнения Java

Вы можете переопределить параметры запуска подключаемого модуля Java по умолчанию, указав настраиваемые параметры в столбце Параметры времени выполнения для JRE. За исключением установки classpath и cp , синтаксис такой же, как и используемый с параметрами для вызова командной строки java .См. Полный список параметров командной строки в команде java:

java Команда: Windows, Solaris, Linux или OS X.

В следующих разделах приведены примеры параметров среды выполнения Java.

20.3.2.1 Настройка classpath и cp

Для установки classpath и cp в подключаемом модуле Java следует использовать следующий формат. Он немного отличается от формата командной строки java , в котором вместо знака равенства ( = ) используется пробел.

-classpath = <путь>
-cp = <путь>
 
20.3.2.2 Включение и отключение поддержки утверждений

Чтобы включить поддержку утверждений, используйте следующее системное свойство:

- [enableassertions | ea] [: <название пакета> "..." | : <название класса>]
 

Чтобы отключить утверждение в подключаемом модуле Java, используйте следующее свойство:

- [disableassertions | da] [: <имя пакета> "..." | : <название класса>]
 
Утверждение

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

Поскольку код Java в подключаемом модуле Java также имеет встроенное утверждение, можно включить утверждение в коде подключаемого модуля Java, используя следующий параметр:

- [enableassertions | ea]: sun.plugin
 
20.3.2.3 Поддержка отслеживания и регистрации

Tracing — это средство для перенаправления любого вывода в Java Console в файл трассировки (подключаемый модуль .трассировка или челюсти <случайный-номер>. трассировка ). Используйте следующие параметры, чтобы включить трассировку:

-Ddeployment.trace = true
-Ddeployment.trace.option = basic | net | security | ext | liveconnect
 

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

-Ddeployment.trace.filename = 
 

Подобно трассировке, ведение журнала — это средство перенаправления любого вывода консоли Java в файл журнала (плагин .log или javaws .log ) с помощью Java Logging API. Используйте следующий параметр, чтобы включить ведение журнала:

-Ddeployment.logging = true
 

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

-Ddeployment.log.filename = <имя файла журнала>
 

Кроме того, если вы не хотите перезаписывать файлы трассировки и журнала в каждом сеансе, вы можете использовать следующий параметр:

-D развертывание.outputfiles.overwrite = ложь
 

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

20.3.2.4 Отладка апплетов в подключаемом модуле Java

При отладке апплетов в подключаемом модуле Java используются следующие параметры:

-Djava.compiler = НЕТ
-Xnoagent
-Xdebug
-Xrunjdwp: transport = dt_shmem, address = , server = y, suspend = n
 

<адрес-подключения> может быть любой строкой, например 2502 , которая позже используется отладчиком Java ( jdb ) для подключения к JVM.

20.3.2.5 Тайм-аут соединения по умолчанию

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

-Dsun.net.client.defaultConnectTimeout = <значение в миллисекундах>
 

Еще одно сетевое свойство, которое вы можете установить, — это sun.net.client.defaultReadTimeout , как показано в следующем примере:

-Dsun.net.client.defaultReadTimeout = <значение в миллисекундах>
 

Примечание:

Плагин Java не устанавливает солнце .net.client.defaultReadTimeout по умолчанию. Если вы хотите установить его, сделайте это с помощью параметров времени выполнения Java, как показано выше.

Следующие сетевые параметры также могут использоваться для установки значений времени ожидания подключения и чтения для обработчиков протокола, используемых java.net.URLConnection . По умолчанию обработчики протокола устанавливают значение -1 , что означает, что тайм-аут не установлен.

  • sun.net.client.defaultConnectTimeout указывает время ожидания в миллисекундах для установления соединения с хостом. Например, для HTTP-соединений это тайм-аут при установке соединения с HTTP-сервером. Для FTP-соединений это тайм-аут при установлении соединения с FTP-серверами.

  • sun.net.client.defaultReadTimeout указывает тайм-аут в миллисекундах при чтении из входного потока при установлении соединения с ресурсом.

Официальное описание этих свойств см. В разделе «Сетевые свойства».

20.4 Безопасность

На рисунке 20-4 показана вкладка «Безопасность».

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

20.4.1 Уровень безопасности

Уровень безопасности определяет критерии, используемые для разрешения или блокировки запуска приложения Java в браузере или запуска из браузера.По мере повышения уровня безопасности накладываются дополнительные ограничения на запуск приложения и пользователю выдаются более строгие предупреждения.

Уровень безопасности по умолчанию — Высокий. Доступные настройки:

  • Очень высокий — приложения, подписанные действительным сертификатом, который находится в хранилище ключей ЦС подписывающей стороны, и включают атрибут Permissions в манифест для основного файла JAR, могут запускаться с запросами безопасности. Все остальные приложения заблокированы.

  • Высокий — Приложения, подписанные действующим сертификатом, который находится в хранилище ключей ЦС подписывающей стороны, и включают атрибут Permissions в манифест для основного файла JAR, могут запускаться с запросами безопасности. Приложениям также разрешено запускаться с запросами безопасности, когда невозможно проверить статус отзыва сертификата. Все остальные приложения заблокированы.

См. Главу 24, «Процесс развертывания полнофункционального Интернет-приложения», чтобы узнать, как принимается решение о запуске или блокировке приложения.

Параметр «Уровень безопасности» влияет на апплеты подключаемых модулей, приложения Java Web Start, встроенные приложения JavaFX и доступ к собственным подключаемым модулям набора инструментов развертывания. Этот параметр не влияет на автономные или автономные приложения Java.

Для получения дополнительной информации см. Раздел 23.1, «Установка уровня безопасности Java-клиента».

20.4.2 Список исключительных сайтов

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

Для получения дополнительной информации см. Главу 29, «Список сайтов-исключений».

20.4.3 Набор правил развертывания

Если в системе установлен активный набор правил развертывания, ссылка Просмотреть активный набор правил развертывания отображается перед кнопкой Управление сертификатами . Щелкните ссылку, чтобы просмотреть набор правил. Для получения информации о сертификате, используемом для подписи набора правил, щелкните ссылку Просмотреть сведения о сертификате в окне «Набор правил развертывания — дополнительная информация».

Когда доступен набор правил, правила определяют, запускается ли RIA без запросов безопасности, с запросами безопасности или блокируется. Дополнительную информацию о правилах развертывания см. В главе 28 «Набор правил развертывания». Для получения дополнительной информации о запросах безопасности см. Раздел 23.5, «Диалоги безопасности».

20.4.4 Восстановить запросы безопасности

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

Чтобы восстановить ранее скрытые запросы, щелкните Восстановить запросы безопасности . Когда вас попросят подтвердить выбор, нажмите Restore All . При следующем запуске приложения отображается запрос безопасности для этого приложения.

20.4.5 Управление сертификатами

Сертификатами уровня пользователя и системы, используемыми для подписи RIA, которые вы запускаете, можно управлять, щелкнув Управление сертификатами .В диалоговом окне «Сертификаты» вы можете импортировать, экспортировать, удалять и просматривать сведения о сертификатах. Информация предоставляется для следующих типов сертификатов:

  • доверенных сертификатов — доверенные сертификаты для подписанных RIA.

  • Secure Site — Сертификаты для безопасных сайтов.

  • ЦС подписывающей стороны — сертификаты центров сертификации (ЦС), которые выдают сертификаты тем, кто подписывает доверенные сертификаты.

  • ЦС безопасных сайтов — сертификаты центров сертификации, которые выдают сертификаты для безопасных сайтов.

  • Проверка подлинности клиента — сертификаты, используемые клиентом для проверки подлинности на сервере.

20.4.5.1 Сертификаты уровня пользователя

Вы можете экспортировать, импортировать, удалять и просматривать подробные сведения о сертификатах пользовательского уровня, используя кнопки в диалоговом окне «Сертификаты». Чтобы экспортировать, удалить или просмотреть сведения, сначала выберите сертификат из списка.

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

Таблица 20-1 Расположение хранилища ключей по умолчанию

Операционная система Расположение

Solaris, Linux, OS X

$ {user.home} /. Java / deployment / security

Microsoft Windows

$ {развертывание.user.home} \ security


Например, расположение по умолчанию в Microsoft Windows 7 для пользователя jsmith -

C: \ Users \ jsmith \ AppData \ LocalLow \ Sun \ Java \ Deployment \ security
 

Чтобы указать хранилище ключей пользовательского уровня в расположении, отличном от расположения по умолчанию, установите свойства в файле deployment.properties уровня пользователя. Информацию о свойствах конфигурации см. В главе 21, «Файл конфигурации и свойства развертывания».В следующей таблице описывается свойство, устанавливаемое для каждого типа сертификата.

Таблица 20-2 Свойства для расположений хранилищ ключей на уровне пользователя

Тип сертификата Название объекта

Доверенных сертификатов

deployment.user.security.trusted.certs

Защищенный сайт

развертывание.user.security.trusted.jssecerts

Подписант CA

deployment.user.security.trusted.cacerts

Защищенный сайт CA

deployment.user.security.trusted.jssecacerts

Аутентификация клиента

развертывание.user.security.trusted.clientcerts


20.4.5.2 Сертификаты системного уровня

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

Надежный, безопасный сайт и сертификат проверки подлинности клиента хранилище ключей файлов по умолчанию не существует. В следующей таблице показано расположение по умолчанию для файла хранилища ключей ЦС подписывающей стороны.

Таблица 20-3 Расположение по умолчанию для хранилища ключей CA подписывающей стороны

I Операционная система Расположение

Solaris, Linux или OS X

$ JAVA_HOME / lib / security / cacerts

Microsoft Windows

$ JAVA_HOME \ lib \ security \ cacerts


В следующей таблице показано расположение по умолчанию для хранилища ключей CA Secure Site.

Таблица 20-4 Расположение по умолчанию для хранилища ключей CA защищенного сайта

Операционная система Расположение

Solaris, Linux или OS X

$ JAVA_HOME / lib / security / jssecacerts

Microsoft Windows

$ JAVA_HOME \ lib \ security \ jssecacerts


Чтобы указать хранилище ключей системного уровня в расположении, отличном от расположения по умолчанию, установите свойства в развертывании на системном уровне.properties файл. Файл Deploy.properties на системном уровне не существует по умолчанию. См. Главу 21, «Файл конфигурации и свойства развертывания» для получения информации о файле системного уровня и свойствах конфигурации. В следующей таблице описывается свойство, устанавливаемое для каждого типа сертификата.

Таблица 20-5 Свойства для расположений хранилищ ключей на уровне системы

Тип сертификата Название объекта

Доверенных сертификатов

развертывание.system.security.trusted.certs

Защищенный сайт

deployment.system.security.trusted.jssecerts

Подписант CA

Deploy.system.security.trusted.cacerts

Защищенный сайт CA

развертывание.system.security.trusted.jssecacerts

Аутентификация клиента

Deploy.system.security.trusted.clientcerts


20,5 Продвинутый

На рис. 20-5 и 20-6 показаны параметры, доступные на вкладке «Дополнительно» в Microsoft Windows.

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

20.5.1 Отладка

Вы можете включить трассировку и ведение журнала.

20.5.2 Консоль Java

Доступны следующие варианты:

20.5.3 Java по умолчанию для браузеров

Доступны следующие варианты, оба выбраны по умолчанию:

Этот параметр игнорируется в текущих версиях Internet Explorer и Firefox, которые автоматически находят и используют последнюю установленную версию JRE.

Для старых версий браузеров этот параметр включает настройки в браузере, которые позволяют использовать JRE, установленную на вашем компьютере.

Например, если вы включите эту опцию для Microsoft Internet Explorer, тогда опция Use JRE for (требуется перезапуск) доступна , где <номер версии> - это версия JRE, установленного на вашем компьютере. (Найдите эту опцию, перейдя в Tools , затем Internet Options , затем щелкните вкладку Advanced .)

Кроме того, если вы включите эту опцию для семейства Mozilla и ваш браузер - Firefox, тогда расширение Java Console <номер версии> появится в списке надстроек , где <номер версии> - это версия JRE, установленного на вашем компьютере.(Доступ к списку надстроек из меню Инструменты в строке меню.)

20.5.4 Создание ярлыка

Этот параметр предоставляет следующие варианты выбора для Java Web Start для создания ярлыков на рабочем столе, выберите только один:

20.5.5 Файл JNLP / ассоциация MIME

Этот параметр позволяет связать файлы с типом JNLP MIME. Доступны следующие варианты, выберите только один:

  • Всегда разрешать

  • Подсказка пользователя (по умолчанию)

  • Никогда не позволять

20.5.6 Установка приложения

Доступны следующие варианты, выберите только один:

  • Установить, если указано (по умолчанию)

  • Установить, если ярлык создан

  • Установить, если подсказка и ярлык

  • Никогда не устанавливать

Приложение или апплет Java, запускаемое с помощью Java Web Start, можно установить или кэшировать на клиентском компьютере.Если приложение Java кэшировано, то Java Web Start сохраняет все приложение в своем кэше; приложение удаляется с клиентского компьютера, когда Java Web Start очищает его кеш. Если приложение Java установлено, оно имеет запись в апплете «Установка и удаление программ» в Панели управления Windows.

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

20.5.7 Безопасная среда выполнения

Доступны следующие варианты, можно выбрать более одного:

  • Разрешить пользователю предоставлять разрешения на подписанный контент

  • Показать баннер с предупреждением о песочнице

  • Разрешить пользователю принимать запросы безопасности JNLP

  • Не запрашивать выбор сертификата клиента, если сертификатов нет или существует только один

  • Предупреждать, если сертификат сайта не соответствует имени хоста

  • Показывать сертификат сайта с сервера, даже если он действителен (по умолчанию не проверяется)

20.5.8 Проверка безопасности смешанного кода (изолированная или надежная)

Доступны следующие варианты, выберите только один:

  • Включить - отображать предупреждение при необходимости (по умолчанию выбрано)

  • Включить - скрыть предупреждение и запустить с защитой

  • Включить - скрыть предупреждение и не запускать ненадежный код

  • Отключить проверку (не рекомендуется)

Для получения дополнительной информации см. Глава 27, «Смешивание привилегированного кода и кода песочницы».«

20.5.9 Выполнение проверки отзыва сертификата на

Перед запуском подписанного апплета или приложения Java Web Start сертификаты, используемые для подписи файла JAR, могут быть проверены, чтобы убедиться, что ни один из них не был отозван. Вы можете проверить все сертификаты или только сертификат от издателя приложения. Если сертификат был отозван, любой RIA, подписанный этим сертификатом, не будет запущен. Эту проверку можно отключить, но делать это не рекомендуется. Доступны следующие варианты выбора, выберите только на:

  • Только свидетельство издателя

  • Все сертификаты в цепочке доверия (выбраны по умолчанию)

  • Не проверять (не рекомендуется)

20.5.10 Проверка отзыва сертификата с помощью

Следующие параметры указывают, что использовать, чтобы определить, был ли сертификат отозван, выберите только один:

  • Списки отозванных сертификатов (CRL)

  • Протокол статуса онлайн-сертификатов (OCSP)

  • И CRL, и OCSP (выбрано по умолчанию)

Если для параметра «Выполнять проверки отзыва сертификатов» выбран параметр «Не проверять», этот параметр игнорируется.

20.5.11 Расширенные настройки безопасности

Доступны следующие варианты, можно выбрать более одного:

  • Использовать сертификаты и ключи в хранилище ключей браузера

  • Включить проверку отзыва из черного списка

  • Включить кеширование пароля для аутентификации

  • Использовать формат ClientHello, совместимый с SSL 2.0 (по умолчанию не отмечен)

  • Используйте TLS 1.0

  • Использовать TLS 1.1

  • Использовать TLS 1.2

20.5.12 Разное

Доступны следующие варианты, по умолчанию ни один не отмечен:

  • Поместите значок Java на панель задач

  • Не предлагать спонсора при установке или обновлении Java

    Выберите этот вариант, если вы не хотите получать предложения от спонсоров в процессе установки или обновления.

20.5.13 Команда для запуска браузера по умолчанию (только Solaris, Linux или OS X)

Позволяет указать расположение запускаемого браузера по умолчанию.

.

Введение в веб-службы на Java

Концепция веб-службы довольно проста; однако внедрение часто сталкивается с множеством проблем, начиная с технических аспектов и заканчивая общей стратегией бизнеса. В этой книге особое внимание уделяется технической реализации и техническим задачам веб-службы на местах. Книга проведет вас через путь от разработки вашего первого приложения веб-службы до более сложного многоуровневого корпоративного приложения. Примеры включают использование коммерчески доступного программного продукта, такого как Oracle Fusion Middleware и открытого исходного кода от Apache Foundation.Благодаря этому путешествию вы сможете понять и освоить процесс, который позволит вам включить звуковые методы в приложение веб-службы.

Эта книга, основанная на лекциях, которые я читал в Trident University International, больше фокусируется на деталях практического подхода к программированию веб-сервисов, чем на его спецификациях; однако, чтобы помочь читателям легче понять эту концепцию, мы даем краткое введение в веб-службы, SOAP и WSDL в первых трех главах.Однако многие детали спецификаций намеренно замалчиваются, чтобы содержание оставалось управляемым.

Веб-служба

(WS) - это парадигма технологий, процессов и программного обеспечения, которая обеспечивает поддержку бизнес-интеграции, в основном, через Интернет-среду. В этой книге представлены основные концепции WS, стека протоколов и приложений. Помимо изучения трех поддерживающих стандартов SOAP, WSDL и UDDI, студенты узнают, как реализовать WS с использованием Java-ориентированных технологий, таких как JAXP, JAXRPC, SAAJ и JAXB.Студенты также изучат, как можно реализовать бизнес-процессы с помощью WS через BPEL.

WS - это программное приложение, идентифицируемое с помощью URI, интерфейсы и привязки которого могут быть определены, описаны и обнаружены с помощью артефактов XML, и оно поддерживает прямое взаимодействие с другими программными приложениями с использованием сообщений на основе XML через Интернет-протоколы (W3C: http: // www.w3.org/TR/ws-desc-reqs). WS в основном предназначен для межмашинного взаимодействия. Стандарт WS полагается на другие стандарты, а именно, SOAP, WSDL и UDDI, чтобы функционировать эффективно.SOAP - это протокол приложения, который используется для передачи сообщений между клиентом WS и сервером WS. HTTP - предпочтительный транспортный протокол для SOAP; однако также использовались протоколы JMS и SMTP. WSDL используется для описания службы, которую может вызывать внешнее приложение. UDDI используется для публикации и рекламы услуг, чтобы их могли найти и использовать другие. UDDI также использует SOAP в качестве протокола приложения.

Книга фокусируется на рабочем механизме WS с практическим упражнением по программированию с использованием базовой Java-среды WS.Эта структура работает с автономным приложением Java, Oracle WebLogic Server (WLS) и сервером Apache Tomcat. Таким образом, ожидается, что читатели обладают достаточными знаниями Java и XML.

.

Что делать, когда Java SE 11 удаляет JNLP

В течение последних 15 лет организация, с которой я работаю, использовала Java Network Launching Protocol (JNLP) для внутреннего распространения настольного приложения Java Swing среди своих пользователей.

Для доступа к приложению Java Swing пользователям необходимо было установить определенную версию платформы Java, Standard Edition (Java SE), которая содержала поддержку JNLP. Когда они хотели использовать приложение, они щелкали ссылку в интрасети организации, и программа Java Web Start ( javaws ) загружала XML по ссылке, интерпретировала его, при необходимости загружала текущую версию приложения. , и запустить его, одновременно управляя изолированной программной средой безопасности, в которой выполнялось приложение.Другими словами, это был хороший способ без особых церемоний распространить полностью настроенное приложение на рабочий стол каждого.

Однако, поскольку JNLP больше не является частью Java SE (начиная с версии 11 и далее), организация столкнулась с решением: прекратить использование JNLP как части Java SE или отменить политику поддержания разумной актуальности Выпуски Java SE. Этот относительно простой на первый взгляд выбор оказался несколько сложным по разным причинам.

Вариант 1. Оставайтесь с текущей версией Java SE и найдите замену JNLP

IcedTea-Web - это проект с открытым исходным кодом, который предоставляет возможности JNLP.Это подразумевает двухэтапный процесс предварительной настройки: 1) установить Java SE и 2) установить IcedTea-Web, что увеличит объем обслуживания на стороне клиента. К сожалению, когда мы оценивали варианты, не было работающего средства IcedTea-Web, совместимого с Java 11, поэтому это означало бы использование Java 8. Однако Java SE 8 подходил к концу в марте 2019 года, поэтому мы должны необходимо создать среду выполнения Java 8 из OpenJDK 8 для установки на клиентские машины и перейти к более ручному процессу отслеживания обновлений OpenJDK 8.Ни один из этих подходов не казался очень привлекательным.

Вариант 2: отойти от JNLP

Поначалу этот подход казался наихудшим из возможных сценариев - нам нужно было бы изменить приложение, чтобы предоставить информацию о конфигурации каким-либо другим способом; все приятные вещи автоматического обновления в JNLP были бы отброшены; и нам понадобится какой-то процесс установки для каждой рабочей станции. Ух! Или мы могли бы переписать существующее клиентское приложение, которое нравится сообществу пользователей, как веб-приложение.Двойной тьфу !!!

Весь этот негатив был преодолен несколькими интересными открытиями и небольшой осторожностью:

  1. Информация о конфигурации может быть упакована как метаданные в таблице метаданных, которая может быть выбрана конечным пользователем в качестве «конфигурации».
  2. Приложение могло довольно легко сравнить свой номер версии с текущим номером версии и отказаться от запуска или, по крайней мере, пожаловаться любому пользователю, использующему устаревшую версию.
  3. Приложение может быть упаковано вместе с настроенной средой выполнения Java, созданной с помощью команд jdeps и jlink , представленных в Open JDK 11, что гарантирует, что приложение всегда будет работать с правильной версией Java.
  4. Весь процесс установки и выполнения может быть выполнен на стороне клиента с помощью файлов Windows .cmd , что устраняет необходимость в установщике (возможно, однажды…).
  5. Приложение и настроенный дистрибутив среды выполнения Java по-прежнему можно обрабатывать как загрузку из интрасети.

По этой детали внимательный читатель может догадаться…

Выбранное решение

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

Вот подробный процесс перехода к решению:

  1. Сборка приложения:
    1. Приложение всегда разрабатывалось и поддерживалось с помощью IDE NetBeans, работающей в среде рабочего стола Linux; это по-прежнему так, используя OpenJDK 11 (из дистрибутива) и NetBeans 10 (загруженный с нового сайта Apache NetBeans).
    2. В процессе сборки создается не зависящая от операционной системы папка dist , содержащая файл приложения .jar и все необходимые библиотеки
  2. Настройка среды выполнения Java 11:
    1. К сожалению, нет возможности настроить межплатформенные среды выполнения Java, поэтому нам нужен промежуточный компьютер с Windows - назовем его IWC.(Я собираюсь сразу сказать, что это главный недостаток нашего подхода.)
    2. OpenJDK 11 предустановленных двоичных файлов установлены на IWC.
    3. Папка приложения dist скопирована в IWC.
    4. Внутри папки dist команда jdeps из OpenJDK 11 определяет, какие компоненты среды выполнения Java необходимы для поддержки приложения:
        jdeps --print-module-deps TheApplication.jar lib \ *  
    5. Используя вывод вышеуказанной команды, команда jlink (также из OpenJDK 11) создает настроенную среду выполнения:
       

      jlink --no-header-files --no-man-pages --compress = 2 \
      --strip-debug –add-modules \ java.base, java.desktop, java.sql, java.security.jgss, java.xml \
      --output customjre

    6. На этом этапе приложение можно запустить (протестировать) из этой папки с помощью команды:
       . \ Customjre \ bin \ java -jar TheApplication.jar  
    7. Файлы Install.cmd и RunTheApplication.cmd копируются в папку dist .
  3. Сборка приложения для распространения:
    1. Папка dist , содержащая приложение, .cmd и настраиваемая среда выполнения архивируются и помещаются на сервер интрасети; ссылка, указывающая на файл .zip , позволяет пользователям загрузить его.
  4. Скачивание, установка и запуск приложения:
    1. Пользователь переходит на страницу, содержащую ссылку, указывающую на файл .zip .
    2. При нажатии на ссылку загружается файл .zip .
    3. Пользователь распаковывает файл .zip , переходит в папку dist и дважды щелкает Install.cmd .
    4. Когда выполняется Install.cmd , он копирует папку dist в известное место на компьютере пользователя и устанавливает ссылку RunTheApplication.cmd на рабочий стол пользователя.
    5. У пользователя должны быть определенные разрешения для установки приложения.
    6. Пользователю не требуется установка Java SE на компьютер.

Приложение было изменено на:

  • Считайте параметры конфигурации из таблицы базы данных (организация считает их «параметрами проекта», поэтому пользователь «выбирает проект»).
  • Строка VERSION = 123 извлекается из RELEASE_NOTES.TXT локально и на сервере, чтобы убедиться, что версии совпадают (и конечный пользователь подвергается преследованиям, если они не совпадают).

Вот и все. Конечно, можно использовать установщик вместо файлов .cmd для «более профессиональной» установки. Также можно найти другие способы установки OpenJDK 11 на IWC, который может даже быть виртуальной машиной (что делает ее VIWC).Жаль, что команда jlink не имеет опции --target-platform или многих других улучшений, которые могут быть желательными или необходимыми в зависимости от характера среды развертывания.

Насколько хорошо это работает?

Ранние отчеты показывают, что пользователи довольны результатами, и системные администраторы больше не несут ответственности за установленную версию Java SE. Что касается специалиста, поддерживающего приложение, то он более или менее согласен с дополнительными этапами сборки, но предпочел бы иметь дело с двумя машинами, чем запускать VIWC на ​​своем прекрасном ноутбуке System76.

Что читать дальше

.

Post A Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

2024 © Все права защищены.