В 2016 многие из нас пообещали себе новые свершения, например, прочесть отложенную книгу, освоить новый вид спорта или язык программирования т.п. Изучение новых технологий в чем-то сродни вышеописанным действиям. Итак, для таких энтузиастов небольшой обзор про удобные «инструменты» для разработки web-приложений на языке Java.
Новый цикл статей будет посвящена Vaadin и Liquibase.
В первой статье хочу вам рассказать о нескольких этапах для начала знакомства с этим FrameWork-ом(Vaadin). Мы поговорим о «загрузке» шаблона и первичном добавлении элементов на «макет». Немного поговорим о Liquibase. В следующих статьях планируется добавить обработку файлов xml.

Vaadin.
Для меня — это «интерпретатор» кода на Java в интерфейс пользователя. Фактически я уменьшаю разработку до уровня контроля за java-слоем. Благодаря сервер-ориентированной архитектуре, основанной на JavaEE, вы можете заложить пласт сложной логики, не потерявшись в настройках отдельных частей. А уже подготовленная оптимизации для браузеров(я говорю о кроссбраузерности) сведет эту часть работы к минимуму.
Сервер-ориентированная модель позволяет быстро(далее вы это увидите) и качественно создавать приложения уменьшая риски «застрять» на определенном этапе. Вы разрабатываете на Java, а на клиенте увидите JavaScript.
Дополнительно нужно сказать, что использование AJAX сулит повышение скорости обмена в интерфейсе.
В этом направлении сейчас развиваются много программных продуктов. Некоторые из них описаны в нижеуказанных первой и четвертой статьях.
Если говорить об использовании, то для средних и крупных компаний — это отличный выбор(имхо).
Необходимая информация о Vaadin.
Официальный сайт Vaadin
Далее несколько ссылок на видео. Очень советую посмотреть.
На русском языке. В нем идет рассказ о наглядном создании небольшого приложения.
На иностранном языке. Лучшая практика — очень удачный рассказ о том как правильно создавать части интерфейса.
Статьи по FrameWork.
Ссылка на первую статью. Небольшая статья про отличия Vaadin от «собратьев».
Ссылка на вторую статью. Обзор возможностей FrameWork-а.
Ссылка на третью статью. Полезные «фичи».
Ссылка на четвертую статью. Тут про GWT и Vaadin. Обзор.

Для создания вашего первого шаблона вы можете поступить следующим образом.
Первое, это произвести установку и настройку нескольких частей для корректной разработки. Если, например, вы используете IntelliJ IDEA, то при создании нового проекта выбрать в разделе «Additional Libraries and FrameWorks» выбрать Vaadin. После этого вам будет предложено указать «Vaadin Distribution» и дополнительно вы можете проставить «Create sample application», перед этими действиями укажите обязательно путь к Project SDK и Application Server (все эти настройки производятся в одном окне).
Кстати, шаблоны есть и для других IDE.
Ссылки на шаблоны.
Vaadin Plug-in for Eclipse.
Vaadin Plug-in for NetBeans.
В проекте, после запуска TomCat вы можете увидеть вот такую надпись «Hello World». По этой ссылке можно посмотреть процесс еще раз.

Что такое Liquibase и зачем он нам понадобился?
Ссылка на сайт Liquibase .
Хорошая статья об особенностях работы.
Еще один отлично написанный материал.
Что такое Liquibase? Для меня — это удобный механизм, для создания идентичных видов объектов на различных базах данных(Oracle, PostgreSQL и других). Очень удачный выбор для компаний, разрабатывающих софт.
Если попробовать описать очень кратко, то вы описываете в xml таблицы, последовательности и другие объекты. Далее один и тот же файл может быть использован для установки на различных видах БД(с определенными ограничениями).
В этой статье начнем делать интерфейс пользователя для, например, создания файлов Liquibase (ограничимся xml вариантом).
Именно благодаря поддержке множества БД мы и попробуем изучить и применять эту возможность

Забыл упомянуть об Apache Tomcat. Ссылка на сайт Tomcat.
В мною предложенном варианте в тестах вы можете использовать встроенную возможность запуска прямо из среды разработки.

Начнем с интерфейса пользователя в Vaadin.
Кстати на самом сайте вы можете найти пример построения «Адресной книги».
Мы попробуем пойти своим путем и создать пускай похожее, но все таки «свое» приложение.
Начнем.
Если вам удалось подгрузить шаблон, то выглядит он примерно вот так:
package com;

import com.vaadin.server.VaadinRequest;
import com.vaadin.ui.*;

/**
 * Created by Terran on 20.01.2016.
 */
public class MyVaadinApplication extends UI {
    @Override
    public void init(VaadinRequest request) {
        VerticalLayout layout = new VerticalLayout();
        setContent(layout);
        layout.addComponent(new Label("Hello, world!"));
    }
}

В коде вы можете увидеть строку.
final VerticalLayout layout = new VerticalLayout();

Фактически это «макет», на который мы будем добавлять элементы(сейчас помимо основных элементов на сайте вы можете найти огромное количество дополнительных).

Предложим будущему пользователю два варианта, первый – это перейти к созданию элементов, второй – перейти по ссылке на habrahabr.ru. Тут вы вольны использовать любой ресурс, в реальном приложении — это может быть сайт технической поддержки.

Для этого добавим несколько элементов. Вот они:
final Label startVariant = new Label();
   startVariant.setValue("Choose button");
layout.addComponent(startVariant);

Button buttonClick = new Button("The option to create");
   buttonClick.setStyleName(ValoTheme.BUTTON_TINY);
layout.addComponent(buttonClick);

Button buttonHabrahabr = new Button("Go habrahabr.ru");
   buttonHabrahabr.setStyleName(ValoTheme.BUTTON_DANGER);
layout.addComponent(buttonHabrahabr);

При старте (я запускаю с помощью Tomcat версия — 7.0.65) у вас будет следующее.


Будущему пользователю доступно два варианта, первый – перейти к созданию объектов, второй идем на habrahabr.ru.

Итак, далее пользователь жмет на кнопку «The option to create»(«Опции создания»). Предложим выбор. Для этого мы добавим addClickListener на действие. Примерно вот так:

buttonHabrahabr.addClickListener(new Button.ClickListener() {
    @Override
    public void buttonClick(Button.ClickEvent clickEvent) {
        
    }
});

Т.к. удобнее использовать Lambda выражения все следующие обработчики будем писать с помощью них. -->
buttonHabrahabr.addClickListener((Button.ClickListener) clickEvent -> {

});


Далее сделаем обработку добавим к кнопке (buttonClick) Listener и при нажатии сделаем вывод еще одного элемента ComboBox.
buttonClick.addClickListener((Button.ClickListener) clickEvent -> {

    final ComboBox boxChange;
    layout.addComponent(boxChange = new ComboBox("Choose creation variant "));

    boxChange.addItems("Create Table", "Create PrimaryKey");


После перезапуска TomCat получим результат:


Тут сразу бросается в глаза расположение кнопок(«The option to create» и «Go habrahabr.ru»). Они очень близко, на мой взгляд.
Это легко поправить.

Уберем добавление элементов и добавим новый горизонтальный слой(«макет»), на него добавим кнопки, а уже новый слой на оригинальный layout.
layout.addComponent(buttonClick); layout.addComponent(buttonHabrahabr);

final HorizontalLayout horizontalLayoutForButton = new HorizontalLayout();
   horizontalLayoutForButton.addComponents(buttonClick,buttonHabrahabr);
   horizontalLayoutForButton.setSpacing(true);

layout.addComponent(horizontalLayoutForButton);


Вот, что мы получим после перезапуска сервера приложения (TomCat).


Для «Create table» допишем следующую часть.
boxChange.addValueChangeListener((Property.ValueChangeListener) valueChangeEvent -> {
  if (Objects.equals(boxChange.getValue(), "Create Table")) {

      }
  else if (Objects.equals(boxChange.getValue(), "Create PrimaryKey")) {
  
    }
}


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

boxChange.addValueChangeListener((Property.ValueChangeListener) valueChangeEvent -> {
  if (Objects.equals(boxChange.getValue(), "Create Table")) {

      boxChange.setReadOnly(true);

      final TextField tableName = new TextField("Enter table name");
      tableName.setWidth("300px");
      tableName.setRequired(true);

      tableName.addValueChangeListener(event -> {
          String value = (String) event.getProperty().getValue();
          Notification.show("Value is: " + value);
      });
      tableName.setImmediate(true);

      final TextField authorName = new TextField("Enter author name");
      authorName.setWidth("300px");
      authorName.setRequired(true);

      authorName.addValueChangeListener(event -> {
          String authorNameValue = (String) event.getProperty().getValue();
          Notification.show("Value is: " + authorNameValue);
      });
      authorName.setImmediate(true);

      layout.addComponent(tableName);
      layout.addComponent(authorName);



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


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

С этого момента немного покопаемся в Liquibase . Для начала стоит посмотреть ссылки с примерами.

Создание таблицы — «Change: ‘createTable’»
Пример создания.
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <changeSet id="1" author="bob">
        <createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="boolean" defaultValueBoolean="true"/>
        </createTable>
    </changeSet>

</databaseChangeLog>


Для создания файла нам нужно добавлять/записать данные в (id, author, tableName, name, type) и далее собирать отдельные «кусочки» в единый файл, т.к. в реальной ситуации у нас может быть очень много разных полей.
Как мы с вами будем это делать? Существует несколько вариантов. Их попробуем разобрать в следующей статье.
to be continued…
Вы использовали данные «инструменты» для создания приложений?

Проголосовало 4 человека. Воздержавшихся нет.

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

Комментарии (12)


  1. cry_san
    25.01.2016 08:47

    Я немного знаю html, и этих знаний явно недостаточно для построения полноценного интерфейса пользователя. С помощью Vaadin-а я могу реализовывать некоторые задумки.

    С помощью Vaadin-а можно реализовать… но зачем?
    Надеюсь, вы пообещали себе в этом году выучить HTML, CSS и JavaScript. На самом деле это будет наилучшим решением.


    1. Terran37
      25.01.2016 10:38
      -4

      А Вы знаете, что сейчас процесс изучения «HTML, CSS и JavaScript» происходит сам собой, во время изучения данного FrameWork-а.


      1. cry_san
        25.01.2016 10:51

        Ну так так каждый выбирает по себе.
        Просто мне кажется, что лучше изучить основы сразу, а потом уже «надстройку». Нежели сперва учить нечто, чтобы от него перейти к основам. ИМХО.


        1. Terran37
          25.01.2016 14:33

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


          1. igor_suhorukov
            25.01.2016 17:29
            +2

            Чистый GWT и так уже достаточный слой абстракции над JS, который иногда тоже сильно мешает. Но вполне позволяет быстро начать работу над корпоративными веб приложениями java разработчикам. А Vaadin — слишком толстая абстракция которая зачем-то навязывает и server side часть приложения.


            1. Terran37
              26.01.2016 07:00

              Вот смотрите, касательно GWT в первой статье, на которую я привожу ссылку, указывается на особенности GWT.

              Концепция GWT почти такая же, как у Vaadin: вы пишите код только на Java. Только GWT транслирует ваш Java-код в JavaScript. Сложности начинаются тогда, когда надо обработать событие, приходящее из браузера (например, обработка нажатий кнопки или сабмита формы). Чтобы из сгенерированного JavaScript-кода вызвать код на серверной стороне, надо сделать несколько магических пассов: создать абстрактный класс-фабрику, его реализацию и т.п.

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



    1. Throwable
      25.01.2016 11:52

      Это не будет наилучшим решением. Поверх HTML/CSS/Js вы все-равно используете какую-нибудь библиотеку стилей типа bootstrap или polymer, которые вместо каши тегов вводят концепт виджетов и добавляют к ним поведение. Для логики используете какой-нибудь JQuery или Angular. Для каждого запроса приходится отдельно разрабатывать интерфейс с сервером и мепить (ручками или полуавтоматически) получаемые структуры данных на виджеты. Так что на одном HTML/CSS/JS далеко не уедешь.

      Vaadin позволяет быстро разработать вебприложение типа админки, фактически программируя только серверную часть. Взаимодействие с браузером полностью прозрачно. Плюс в том, что многие нюансы UI уже учтены и идут из коробки. Плюс мепить данные на сервере в typesafe java-объекты на порядок проще, нежели заморочки с Json. Фреймворк будет близок тем, кто разрабатывал приложения на Swing и подобных библиотеках виджетов.


  1. ruslanys
    25.01.2016 21:59
    +2

    Vaadin, конечно, прекрасный фреймворк, но Вы не упомянули о том, что логика по отображению страницы формируется на серверной стороне. Так, например, если на клиенте при нажатии на кнопку нужно открыть pop-up, это вызовет запрос на сервер (тонкий клиент).

    За удобство приходится платить. Поэтому vaadin не подходит для нагруженных решений (слишком много лишних запросов от клиента). Можно, конечно, разделить Java код на клиент и сервер, как в классическом GWT, сделать толстый клиент, но тогда его придётся разрабатывать отдельно и взаимодействовать с сервером через RPC.

    Что касается liquidbase, мне больше нравится Flyway. В SQL миграциях проще разобраться на взгляд, чем в xml. А совместимость с несколькими СУБД редко бывает необходима.


    1. Terran37
      25.01.2016 22:38
      -2

      Vaadin, конечно, прекрасный фреймворк, но Вы не упомянули о том, что логика по отображению страницы формируется на серверной стороне

      Да, и это не беда.
      За удобство приходится платить. Поэтому vaadin не подходит для нагруженных решений

      Спорный момент, нужно смотреть.
      Flyway

      Не встречал Flyway в работе, попробую посмотреть.


    1. Terran37
      25.01.2016 22:46

      Vaadin, конечно, прекрасный фреймворк, но Вы не упомянули о том, что логика по отображению страницы формируется на серверной стороне.


      В этой статье мне важно не описать Vaadin и Liquidbase(для этого я оставил ссылки на видео и сайты), а сделать так, что бы читатели увидели разные способы создания приложений и посмотрели один из вариантов. Сравнили со своим подходом.


      1. ruslanys
        26.01.2016 11:33
        +1

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


        1. Terran37
          26.01.2016 22:31

          Решил последовать вашему совету, немного расширил комментарии и добавил краткое описание. Возможно будет проще ориентироваться.