Въведение във Ваадин

1. Общ преглед

Vaadin е Java сървърна рамка за създаване на уеб потребителски интерфейси. Използвайки го, можем да създадем нашия интерфейс, използвайки функции на Java.

2. Зависимости и настройка на Maven

Нека започнем с добавяне на следните зависимости към нашия pom.xml :

 com.vaadin vaadin-server   com.vaadin vaadin-client-compiled   com.vaadin vaadin-themes  

Най-новите версии на зависимостите могат да бъдат намерени тук: vaadin-server, vaadin-client-compiled, vaadin-themes.

  • пакет vaadin-server - включва класове за обработка на всички детайли на сървъра като сесии, комуникация с клиенти и т.н.
  • vaadin-client-compiled - базира се на GWT и включва необходимите пакети за компилиране на клиента
  • vaadin-themes - включва някои предварително направени теми и всички помощни програми за създаване на нашите теми

За да компилираме нашите джаджи Vaadin, трябва да конфигурираме плъгина maven-war, vaadin-maven-plugin и maven-clean-plugin. За пълния pom не забравяйте да проверите pom файла в изходния код - в края на урока.

Също така трябва да добавим хранилището Vaadin и управлението на зависимостите:

  vaadin-addons //maven.vaadin.com/vaadin-addons      com.vaadin vaadin-bom 13.0.9 pom import   

На DependencyManagement версии контроли за маркери на всички Vaadin зависимости.

За да стартираме бързо приложението, ще използваме приставката Jetty:

 org.eclipse.jetty jetty-maven-plugin 9.3.9.v20160517  2 true  

Най-новата версия на приставката можете да намерите тук: jetty-maven-plugin.

С този плъгин можем да стартираме нашия проект с помощта на командата:

mvn jetty:run

3. Какво представлява Ваадин?

Най-просто казано, Vaadin е Java рамка за създаване на потребителски интерфейси , с теми и компоненти и много опции за разширяемост.

Структурата покрива и сървърната страна , което означава, че всяка промяна, която правите в потребителския интерфейс, незабавно се изпраща на сървъра - така че всеки момент приложението за бекенда знае какво се случва във фронта.

Vaadin се състои от клиентска и сървърна страна - като клиентската страна е изградена върху добре познатата рамка на Google Widget Toolkit, а сървърната страна се обработва от VaadinServlet .

4. Сервлетът

Обикновено приложението Vaadin не използва файл web.xml ; вместо това той определя своя сървлет, използвайки пояснения:

@WebServlet(urlPatterns = "/VAADIN/*", name = "MyUIServlet", asyncSupported = true) @VaadinServletConfiguration(ui = VaadinUI.class, productionMode = false) public static class MyUIServlet extends VaadinServlet {}

В този случай този сървлет обслужва съдържание от / VAADIN пътя.

5. Основният клас

Класът VaadinUI, на който се прави позоваване в сървлета, трябва да разшири класа на потребителския интерфейс от рамката и трябва да замени метода init , за да завърши зареждането на приложението с активиран Vaadin.

Следващата стъпка е да създадете оформление и да го добавите към основното оформление на приложението:

public class VaadinUI extends UI { @Override protected void init(VaadinRequest vaadinRequest) { VerticalLayout verticalLayout = new VerticalLayout(); verticalLayout.setSpacing(true); verticalLayout.setMargin(true); setContent(verticalLayout); }

6. Мениджъри на оформление на Vaadin

Рамката се предлага с редица предварително дефинирани мениджъри за оформление.

6.1. VerticalLayout

Подредете компонентите в колона, където първата добавена е отгоре, а последната е отдолу:

VerticalLayout verticalLayout = new VerticalLayout(); verticalLayout.setSpacing(true); verticalLayout.setMargin(true); setContent(verticalLayout);

Обърнете внимание как тук свойствата са взаимствани свободно от типичната CSS терминология.

6.2. HorizontalLayout

Това оформление поставя всеки компонент един до друг отляво надясно, подобно на вертикалното оформление:

HorizontalLayout horizontalLayout = new HorizontalLayout();

6.3. GridLayout

Това оформление поставя всяка джаджа в мрежа, като параметър трябва да предадете колоните и редовете на мрежата:

GridLayout gridLayout = new GridLayout(3, 2);

6.4. FormLayout

Оформлението на формуляра поставя надписа и компонента в две различни колони и може да има незадължителни индикатори за задължителни полета:

FormLayout formLayout = new FormLayout();

7. Ваадин Компоненти

Сега, когато оформлението е обработено, нека разгледаме някои от най-често срещаните компоненти за изграждане на нашия потребителски интерфейс.

7.1. Етикет

Етикетът, разбира се, е добре познат - и просто се използва за показване на текст:

Label label = new Label(); label.setId("LabelID"); label.setValue("Label Value"); label.setCaption("Label"); gridLayout.addComponent(label);

След като създадем компонента, забележете критичната стъпка от добавянето му към оформлението.

7.2. Връзка

Приспособлението за връзка е по същество основна хипервръзка:

Link link = new Link("Baeldung", new ExternalResource("//www.baeldung.com/")); link.setTargetName("_blank");

Забележете как типичните HTML стойности на всички елементи са тук.

7.3. Текстово поле

This widget is used to input text:

TextField textField = new TextField(); textField.setIcon(VaadinIcons.USER);

We can further customize the elements; for example, we can quickly add images to the widgets via the setIcon() API.

Also, note that Font Awesome is shipped out of the box with the framework; it's defined as an Enum, and we can easily make use of it.

7.4. TextArea

As you'd expect, TextArea is available next to the rest of the traditional HTML elements:

TextArea textArea = new TextArea();

7.5. DateField and InlineDateField

This powerful component is used to pick dates; the date parameter is the current date to be selected in the widget:

DateField dateField = new DateField("DateField", LocalDate.ofEpochDay(0));

We can go further and nest it inside a combo box control to save space:

InlineDateField inlineDateField = new InlineDateField();

7.6. PasswordField

This is the standard masked password input:

PasswordField passwordField = new PasswordField();

7.7. RichTextArea

With this component, we can show formatted text, and it provides an interface to manipulate such text with buttons to control the fonts, size, alignment, etc.are:

RichTextArea richTextArea = new RichTextArea(); richTextArea.setCaption("Rich Text Area"); richTextArea.setValue(""); richTextArea.setSizeFull(); Panel richTextPanel = new Panel(); richTextPanel.setContent(richTextArea);

7.8. Button

Buttons are used for capturing user input and come in a variety of sizes and colors.

To create a button we instantiate the widget class as usual:

Button normalButton = new Button("Normal Button");

Changing the style we can have some different buttons:

tinyButton.addStyleName("tiny"); smallButton.addStyleName("small"); largeButton.addStyleName("large"); hugeButton.addStyleName("huge"); dangerButton.addStyleName("danger"); friendlyButton.addStyleName("friendly"); primaryButton.addStyleName("primary"); borderlessButton.addStyleName("borderless"); linkButton.addStyleName("link"); quietButton.addStyleName("quiet");

We can create a disabled button:

Button disabledButton = new Button("Disabled Button"); disabledButton.setDescription("This button cannot be clicked"); disabledButton.setEnabled(false); buttonLayout.addComponent(disabledButton);

A native button that uses the browser's look:

NativeButton nativeButton = new NativeButton("Native Button"); buttonLayout.addComponent(nativeButton);

And a button with an icon:

Button iconButton = new Button("Icon Button"); iconButton.setIcon(VaadinIcons.ALIGN_LEFT); buttonLayout.addComponent(iconButton);

7.9. CheckBox

The check box is a change state element, is checked or is unchecked:

CheckBox checkbox = new CheckBox("CheckBox"); checkbox.setValue(true); checkbox.addValueChangeListener(e -> checkbox.setValue(!checkbox.getValue())); formLayout.addComponent(checkbox);

7.10. Lists

Vaadin has some useful widgets to handle lists.

First, we create a list of our items to be placed in the widget:

List numbers = new ArrayList(); numbers.add("One"); numbers.add("Ten"); numbers.add("Eleven");

The ComboBox is a drop down list:

ComboBox comboBox = new ComboBox("ComboBox"); comboBox.addItems(numbers); formLayout.addComponent(comboBox);

The ListSelect vertically places items and uses a scroll bar in case of overflow:

ListSelect listSelect = new ListSelect("ListSelect"); listSelect.addItems(numbers); listSelect.setRows(2); formLayout.addComponent(listSelect);

The NativeSelect is like the ComboBox but have the browser look and feel:

NativeSelect nativeSelect = new NativeSelect("NativeSelect"); nativeSelect.addItems(numbers); formLayout.addComponent(nativeSelect);

The TwinColSelect is a dual list where we can change the items between these two panes; each item can only live in one of the panes at a time:

TwinColSelect twinColSelect = new TwinColSelect("TwinColSelect"); twinColSelect.addItems(numbers);

7.11. Grid

The grid is used to show data in a rectangular way; you have rows and columns, can define header and foot for the data:

Grid grid = new Grid(Row.class); grid.setColumns("column1", "column2", "column3"); Row row1 = new Row("Item1", "Item2", "Item3"); Row row2 = new Row("Item4", "Item5", "Item6"); List rows = new ArrayList(); rows.add(row1); rows.add(row2); grid.setItems(rows);

The Row class above is a simple POJO we've added to represent a row:

public class Row { private String column1; private String column2; private String column3; // constructors, getters, setters }

8. Server Push

Another interesting feature is an ability to send messages from the server to the UI.

To use server push, we need to add the following dependency to our pom.xml:

 com.vaadin vaadin-push 8.8.5 

The latest version of the dependency can be found here: vaadin-push.

Also, we need to add the @Push annotation to our class representing UI:

@Push @Theme("mytheme") public class VaadinUI extends UI {...}

We create a label to capture the server push message:

private Label currentTime;

We then create a ScheduledExecutorService that sends the time from the server to the label:

ScheduledExecutorService scheduleExecutor = Executors.newScheduledThreadPool(1); Runnable task = () -> { currentTime.setValue("Current Time : " + Instant.now()); }; scheduleExecutor.scheduleWithFixedDelay(task, 0, 1, TimeUnit.SECONDS);

The ScheduledExecutorService is running on the server side of the application and every time it runs, the user interface gets updated.

9. Data Binding

We can bind our user interface to our business classes.

First, we create a Java class:

public class BindData { private String bindName; public BindData(String bindName){ this.bindName = bindName; } // getter & setter }

Then we bind our class that has a single field to a TextField in our user interface:

Binder binder = new Binder(); BindData bindData = new BindData("BindData"); binder.readBean(bindData); TextField bindedTextField = new TextField(); binder.forField(bindedTextField).bind(BindData::getBindName, BindData::setBindName);

First, we create a BindData object using the class we created before, then the Binder binds the field to the TextField.

10. Validators

We can create Validators to validate the data in our input fields. To do that, we attach the validator to the field we want to validate:

BindData stringValidatorBindData = new BindData(""); TextField stringValidator = new TextField(); Binder stringValidatorBinder = new Binder(); stringValidatorBinder.setBean(stringValidatorBindData); stringValidatorBinder.forField(stringValidator) .withValidator(new StringLengthValidator("String must have 2-5 characters lenght", 2, 5)) .bind(BindData::getBindName, BindData::setBindName);

Then we validate our data before we use it:

Button buttonStringValidator = new Button("Validate String"); buttonStringValidator.addClickListener(e -> stringValidatorBinder.validate());

In this case, we are using the StringLengthValidator that validates the length of a String but Vaadin provides other useful validators and also allows us to create our custom validators.

11. Summary

Of course, this quick writeup barely scratched the surface; the framework is much more than user interface widgets, Vaadin provides all you need for creating modern web applications using Java.

И както винаги кодът може да бъде намерен в Github.