Anwendungsbeispiel mit Spring Boot und Vaadin
1. Überblick
2. Konfiguration
Beginnen wir mit dem Hinzufügen von Maven-Abhängigkeiten zu einer Standard-Spring Boot-Anwendung:
com.vaadin
vaadin-spring-boot-starter
Vaadin ist auch eine anerkannte Abhängigkeit vonSpring Initializer.
In diesem Tutorial wird eine neuere Version von Vaadin als die vom Startermodul bereitgestellte Standardversion verwendet. Um die neuere Version zu verwenden, definieren Sie einfach die Vaadin-Stückliste wie folgt:
com.vaadin
vaadin-bom
10.0.11
pom
import
3. Backend-Service
Wir verwenden eineEmployee-Entität mit den EigenschaftenfirstName undlastName, um CRUD-Operationen daran auszuführen:
@Entity
public class Employee {
@Id
@GeneratedValue
private Long id;
private String firstName;
private String lastName;
}
Hier ist das einfache, entsprechende Spring Data-Repository - zum Verwalten der CRUD-Operationen:
public interface EmployeeRepository extends JpaRepository {
List findByLastNameStartsWithIgnoreCase(String lastName);
}
Wir deklarieren die AbfragemethodefindByLastNameStartsWithIgnoreCase auf der Schnittstelle vonEmployeeRepository. Es wird die Liste vonEmployees zurückgegeben, die mitlastName übereinstimmt.
Füllen Sie die Datenbank auch mit einigen StichprobenEmployees vor:
@Bean
public CommandLineRunner loadData(EmployeeRepository repository) {
return (args) -> {
repository.save(new Employee("Bill", "Gates"));
repository.save(new Employee("Mark", "Zuckerberg"));
repository.save(new Employee("Sundar", "Pichai"));
repository.save(new Employee("Jeff", "Bezos"));
};
}
4. Vaadin UI
4.1. MainView Klasse
DieMainView-Klasse ist der Einstiegspunkt für Vaadins UI-Logik. Annotation @Route tells Spring Boot to automatically pick it up and show at the root of the web app:
@Route
public class MainView extends VerticalLayout {
private EmployeeRepository employeeRepository;
private EmployeeEditor editor;
Grid grid;
TextField filter;
private Button addNewBtn;
}
Wir können die URL anpassen, unter der die Ansicht angezeigt wird, indem wir der Annotation@Routeeinen Parameter geben:
@Route(value="myhome")
Die Klasse verwendet die folgenden UI-Komponenten, um auf der Seite angezeigt zu werden:
EmployeeEditor editor - Zeigt das FormularEmployee an, mit dem Mitarbeiterinformationen zum Erstellen und Bearbeiten bereitgestellt werden.
Grid<Employee> grid - Umgürten, um die Liste vonEmployees anzuzeigen
TextField filter - Textfeld zur Eingabe des Nachnamens, anhand dessen der Gürtel gefiltert wird
Button addNewBtn - Schaltfläche zum Hinzufügen eines neuenEmployee. Zeigt denEmployeeEditor-Editor an.
Es verwendet intern dieemployeeRepository, um die CRUD-Operationen auszuführen.
4.2. Komponenten zusammen verdrahten
MainView erweitertVerticalLayout. VerticalLayout is a component container, which shows the subcomponents in the order of their addition (vertikal).
Als nächstes initialisieren wir die Komponenten und fügen sie hinzu.
Wir versehen die Schaltfläche mit einem + Symbol.
this.grid = new Grid<>(Employee.class);
this.filter = new TextField();
this.addNewBtn = new Button("New employee", VaadinIcon.PLUS.create());
Wir verwendenHorizontalLayout, um das Filtertextfeld und die Schaltfläche horizontal anzuordnen. Fügen Sie dann das folgende Layout, Raster und den folgenden Editor zum übergeordneten vertikalen Layout hinzu:
HorizontalLayout actions = new HorizontalLayout(filter, addNewBtn);
add(actions, grid, editor);
Geben Sie die Rasterhöhe und die Spaltennamen an. Wir fügen auch Hilfetext in das Textfeld ein:
grid.setHeight("200px");
grid.setColumns("id", "firstName", "lastName");
grid.getColumnByKey("id").setWidth("50px").setFlexGrow(0);
filter.setPlaceholder("Filter by last name");
Beim Start der Anwendung würde die Benutzeroberfläche folgendermaßen aussehen:
4.3. Hinzufügen von Logik zu Komponenten
Wir setzenValueChangeMode.EAGER auf das Textfeldfilter. This syncs the value to the server each time it’s changed on the client.
Wir haben auch einen Listener für das Wertänderungsereignis festgelegt, der die gefilterte Liste der Mitarbeiter basierend auf dem infilter: angegebenen Text zurückgibt
filter.setValueChangeMode(ValueChangeMode.EAGER);
filter.addValueChangeListener(e -> listEmployees(e.getValue()));
Bei Auswahl einer Zeile innerhalb des Gürtels wird das FormularEmployeeangezeigt, sodass der Benutzer den Vor- und Nachnamen bearbeiten kann:
grid.asSingleSelect().addValueChangeListener(e -> {
editor.editEmployee(e.getValue());
});
Wenn Sie auf die Schaltfläche Neuen Mitarbeiter hinzufügen klicken, wird das leere FormularEmployeeangezeigt:
addNewBtn.addClickListener(e -> editor.editEmployee(new Employee("", "")));
Schließlich hören wir uns die Änderungen des Editors an und aktualisieren das Raster mit Daten aus dem Backend:
editor.setChangeHandler(() -> {
editor.setVisible(false);
listEmployees(filter.getValue());
});
Die FunktionlistEmployees ruft die gefilterte Liste vonEmployees ab und aktualisiert das Raster:
void listEmployees(String filterText) {
if (StringUtils.isEmpty(filterText)) {
grid.setItems(employeeRepository.findAll());
} else {
grid.setItems(employeeRepository.findByLastNameStartsWithIgnoreCase(filterText));
}
}
4.4. Das Formular erstellen
Wir verwenden ein einfaches Formular, damit der Benutzer einen Mitarbeiter hinzufügen / bearbeiten kann:
@SpringComponent
@UIScope
public class EmployeeEditor extends VerticalLayout implements KeyNotifier {
private EmployeeRepository repository;
private Employee employee;
TextField firstName = new TextField("First name");
TextField lastName = new TextField("Last name");
Button save = new Button("Save", VaadinIcon.CHECK.create());
Button cancel = new Button("Cancel");
Button delete = new Button("Delete", VaadinIcon.TRASH.create());
HorizontalLayout actions = new HorizontalLayout(save, cancel, delete);
Binder binder = new Binder<>(Employee.class);
private ChangeHandler changeHandler;
}
The @SpringComponent is just an alias to Springs @Component annotation, um Konflikte mit der Klasse von VaadinsComponentzu vermeiden.
Das@UIScope bindet die Bean an die aktuelle Vaadin-Benutzeroberfläche.
Derzeit werden bearbeiteteEmployee in der Mitgliedsvariablenemployee gespeichert. Wir erfassen die Eigenschaften vonEmployeeüber die TextfelderfirstName undlastName.
Das Formular verfügt über drei Schaltflächen:save,cancel unddelete.
Sobald alle Komponenten miteinander verbunden sind, sieht das Formular für eine Zeilenauswahl wie folgt aus:
Wir verwenden einBinder which binds the form fields with the Employee properties using the naming convention:
binder.bindInstanceFields(this);
Wir nennen die entsprechende EmployeeRepositor-Methode basierend auf den Benutzeroperationen:
void delete() {
repository.delete(employee);
changeHandler.onChange();
}
void save() {
repository.save(employee);
changeHandler.onChange();
}
5. Fazit
In diesem Artikel haben wir eine CRUD-UI-Anwendung mit vollem Funktionsumfang geschrieben, die Spring Boot und Spring Data JPA für die Persistenz verwendet.
Wie üblich ist der Codeover on GitHub verfügbar.