This documentation applies to version 8 of the framework! |
La solution standard pour faire du web avec Java est Java EE
HTTP | Java |
HTML | API Servlet |
CSS | JSP |
JavaScript | Taglibs/Tag files |
AJAX | DOM |
Obligatoire | Facultatif |
---|---|
Java | Vaadin |
SASS | GWT |
Le code est en Java
Compilé en bytecode
Basé sur des composants
Programmation évènementielle
Java 8+
Container de servlets Java EE 6+
Interface de plus haut niveau implémentée par tous les composants Vaadin
Représente l’intégralité d’une fenêtre de navigateur
Une instance par fenêtre (ou tab)
UI utilisée spécifiée par un paramètre de servlet
Au chargement de la page
A chaque refresh
Sauf si l’UI
est annotée avec @PreserveOnRefresh
Disposés sur leur container parent via un layout
Label
TextField
Button
Select
Grid
etc.
Comprend un ou des composants enfants
Container spécialisé qui dispose ses composants enfant selon une stratégie
VerticalLayout
HorizontalLayout
GridLayout
FormLayout
etc.
Implémentation du pattern Observer
Présent dans tous les clients lourds :
Swing/AWT
SWT
Flex
Mais pas dans le web
Tous les Component
sont des Subject
Génèrent des évènements en fonction :
Du type de composant
Du type de déclencheur
Button
génère :
FocusEvent
BlurEvent
ClickEvent
Toute classe peut implémenter Observer
p.e. l’UI
Du JavaScript implémente le code serveur
Une interaction client-serveur se traduit par un appel Ajax
Notion d’abonnement portée par une interface
N’importe laquelle :
L’UI
Une classe anonyme
Une classe dédiée
Tous les évènements sont traités dans une unique classe
Si plusieurs objets génèrent le même événement, il faut pouvoir les différencier via des if
public class MyUI implements ClickListener {
private Button button1;
private Button button2;
@Override
public void buttonClick(ClickEvent e) {
if (e.getSource() == button1) ...
else if (e.getSource() == button2) ...
}
}
Porte l’information du comportement avec sa déclaration
Perte de la référence sur le comportement
Couplage fort
button.addClickListener(new ClickListener() {
@Override
public void buttonClick(ClickEvent e) {
...
}
}
Entièrement orienté objet
Lisible
Changement dynamique possible
Séparation des responsabilités
Nommage sémantique
Verbeux
public class SendFormBehavior implements ClickListener() {
@Override
public void buttonClick(ClickEvent e) {
...
}
}
Couplage entre l’Observer et son objet
Transport event occurrences from sources to subscribers, where event sources signal event occurrences to all event subscribers and event subscribers receive event occurrences.
Vaadin Spring Boot’s Event Bus
Une liste déroulante pour les pays
Une liste déroulante pour les villes
Uniquement pour les villes du pays
public class CountryComboBox extends ComboBox {
public CountryComboBox(EventBus bus) {
addValueChangeListener(event -> {
bus.post(new CountryChangedEvent(event.getValue()));
});
}
}
public class CityComboBox extends ComboBox {
@Subscribe
public void changeCities(CountryChangedEvent event) {
// Refresh cities
}
}
public class EventBusUI extends UI {
public void init(VaadinRequest request) {
EventBus bus = new EventBus();
CountryComboBox countries = new CountryComboBox(bus);
CityComboBox cities = new CityComboBox();
bus.register(cities);
// Layout components & set content
}
}
c.setComponentError(ErrorMessage)
XXXRangeValidator :
Date
, Double
& Integer
RegexpValidator
EmailValidator
StringLengthValidator
NullValidator
CompositeValidator
TextField email = TextField(”Email");
email.addValidator(new EmailValidator());
Users often need to have direct links to specific views. The Navigator can be used for most cases of navigation.
Navigator
Gère la navigation
View
Composant affichable
public class NavigatorUI extends UI {
@Override
protected void init(VaadinRequest request) {
Navigator navigator = new Navigator(this, this);
setNavigator(navigator);
navigator.addView("", new InitialView());
navigator.addView("other", new OtherView());
}
}
Gestion évènementielle du changement d’état du modèle vers un composant graphique
Et vice-versa
Propriété p.e. email
Bean p.e Person
Liste de beans
A generic interface for field components and other user interface objects that have a user-editable value.
Defines how the values in a business object should be bound to the fields shown in the user interface. Binder takes care of reading values from the BO and converting the user’s data between the format expected by the BO and the format expected by the field.
Binder<Person> binder = new Binder<>(Person.class);
TextField firstNameField = new TextField("Give name");
TextField lastNameField = new TextField("Family name");
DateField birthDateField = new DateField("Date of birth");
binder.bind(firstNameField, "firstName");
binder.bind(lastNameField, "lastName");
binder.bind(birthDateField, "birthDate");
// User interaction
Person person = binder.getBean();
String firstName = person.getFirstName();
String lastName = person.getLastName();
Date birthdate = person.getBirthDate();
A component that displays a collection of items.
List<Person> persons = ...;
ListDataProvider<Person> provider = new ListDataProvider<>(persons);
Grid<Person> grid = new Grid<>(Person.class);
grid.setDataProvider(provider);
grid.setHeaderVisible(true);
grid.setColumns("firstName", "lastName", "birthDate");
BackendDataProvider
HierarchicalDataProvider
ConfigurableFilterDataProvider
Composant dédié à l’affichage de données tabulées
Indique les colonnes visibles
Mais également leur ordre
Grid<Person> grid = new Grid<>(Person.class);
grid.setColumns("firstName", "lastName");
Par défaut, inféré du nom de l’attribut
Grid<Person> grid = new Grid<>(Person.class);
grid.getColumn("firstName").setCaption("Given Name");
Récupère la valeur de l’attribut
Utilise le Renderer
pour la transformer en String
Affiche la String
dans la cellule
Grid<Person> grid = new Grid<>(Person.class);
Column<Person, ?> column = grid.getColumn("birthDate");
Renderer renderer = new LocalDateRenderer("EE dd MMM yy");
column.setRenderer(renderer);
Grid<Person> grid = new Grid<>(Person.class);
Column<Person, ?> column = grid.getColumn("biography");
Renderer renderer = new HtmlRenderer();
column.setRenderer(renderer);
Grid<Person> grid = new Grid<>(Person.class);
Column<Person, String> column =
grid.addColumn(person -> person.getFirstName());
ButtonRenderer<String> buttonRenderer =
new ButtonRenderer<>(event -> Notification.show("Shown"));
column.setRenderer(buttonRenderer);
Via l’addon Vaadin CDI
Pas de servlet enfant
Ni création
Ni référencement
Pas de référencement explicite de(s) UI(s)
Pas d’enregistrement explicite des Views
Via l’annotation @CDIUI
Chemin indiqué par la valeur :
@CDIUI("")
@CDIUI("fun")
@CDIUI
:
Inféré en fonction du nom de la classe sans le suffixe UI
@CDIUI("main")
public class MyUI extends UI {
public void init(VaadinRequest request) {
// Do something here
}
}
Via l’annotation @CDIView
Clé d’enregistrement dans le Navigator
indiqué par la valeur :
@CDIView("")
Enregistré dans un ViewProvider
Doit être associé au Navigator
@CDIView("hello")
public class MyView extends HorizontalLayout
implements View() { }
@CDIUI("") public class MyUI extends UI {
@Inject
private ViewProvider viewProvider;
public void init(VaadinRequest request) {
Navigator navigator = new Navigator(this, this);
navigator.addProvider(viewProvider);
navigator.navigateTo("hello");
}
}