Routing and Composites
Jusqu'à présent, ce tutoriel n'a été qu'une application monopage. Cette étape va changer cela. Vous déplacerez l'interface utilisateur que vous avez créée dans Travailler avec des données vers sa propre page et créerez une autre page pour ajouter de nouveaux clients. Ensuite, vous connecterez ces pages afin que votre application puisse naviguer entre elles en appliquant ces concepts :
- Routage
- Composants composites
- Le composant
ColumnsLayout
Compléter cette étape crée une version de 3-routing-and-composites.
Exécuter l'application
Alors que vous développez votre application, vous pouvez utiliser 3-routing-and-composites comme comparaison. Pour voir l'application en action :
-
Naviguez vers le répertoire de niveau supérieur contenant le fichier
pom.xml; il s'agit de3-routing-and-compositessi vous suivez la version sur GitHub. -
Utilisez la commande Maven suivante pour exécuter l'application Spring Boot localement :
mvn
L'exécution de l'application ouvre automatiquement un nouveau navigateur à http://localhost:8080.
Applications routables
Auparavant, votre application n'avait qu'une seule fonction : afficher un tableau des données des clients existants. Dans cette étape, votre application sera également capable de modifier les données des clients en ajoutant de nouveaux clients. Séparer les interfaces utilisateur pour l'affichage et la modification est bénéfique pour la maintenance à long terme et les tests, vous allez donc ajouter cette fonctionnalité sous forme de page distincte. Vous allez rendre votre application routable afin que webforJ puisse accéder et charger les deux interfaces utilisateur individuellement.
Une application routable rend l'interface utilisateur en fonction de l'URL. Annoter la classe qui étend la classe App avec @Routify active le routage, et l'élément packages indique à webforJ quels packages contiennent des composants UI.
Lorsque vous ajoutez l'annotation @Routify à Application, supprimez la méthode run(). Vous déplacerez les composants de cette méthode vers une classe que vous créerez dans le package com.webforj.tutorial.views. Votre fichier Application.java mis à jour devrait ressembler à ceci :
@SpringBootApplication
@StyleSheet("ws://css/card.css")
@AppTheme("system")
//Annotation @Routify ajoutée
@Routify(packages = "com.webforj.tutorial.views")
@AppProfile(name = "CustomerApplication", shortName = "CustomerApplication")
public class Application extends App {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
// Méthode App.run() remplacée supprimée
}
Conserver l'annotation @StyleSheet dans Application applique ce CSS globalement.
Création de routes
L'ajout de l'annotation @Routify rend votre application routable. Une fois qu'elle est routable, votre application cherchera dans le package com.webforj.tutorial.views pour les routes.
Vous devrez créer les routes pour vos interfaces utilisateur et également spécifier leurs Types de Route. Le type de route détermine comment mapper le contenu de l'UI à l'URL.
Le premier type de route est View. Ces types de routes se mappent directement à un segment d'URL spécifique dans votre application. Les interfaces utilisateur pour le tableau et le formulaire de nouveau client seront toutes deux des routes de type View.
Le deuxième type de route est Layout, qui contient une interface utilisateur qui apparaît sur plusieurs pages, comme un en-tête ou une barre latérale. Les routes de mise en page enveloppent également les vues enfants sans contribuer à l'URL.
Pour spécifier le type de route d'une classe, ajoutez le type de route à la fin du nom de la classe comme suffixe.
Par exemple, MainView est un type de route View.
Pour maintenir les deux fonctions de l'application séparées, votre application doit mapper les interfaces utilisateur à deux routes uniques de type View : une pour le tableau et une pour le formulaire de client. Dans /src/main/java/com/webforj/tutorial/views, créez deux classes avec un suffixe View :
MainView: Cette vue contiendra leTableprécédemment dans la classeApplication.FormView: Cette vue contiendra un formulaire pour ajouter de nouveaux clients.
Mapper les URL aux composants
Votre application est routable et sait chercher deux routes de type View, MainView et FormView, mais elle n'a pas d'URL spécifique pour les charger. En utilisant l'annotation @Route sur une classe de vue, vous pouvez indiquer à webforJ où la charger en fonction d'un segment d'URL donné. Par exemple, en utilisant @Route("about") dans une vue, vous mappez localement la classe à http://localhost:8080/about.
Comme son nom l'indique, MainView est la classe que vous souhaitez charger initialement lorsque l'application s'exécute. Pour ce faire, ajoutez une annotation @Route qui mappe MainView à l'URL racine de votre application :
@Route("/")
public class MainView {
public MainView() {
}
}
Pour le FormView, mappez la vue de sorte qu'elle se charge lorsque l'utilisateur se rend à http://localhost:8080/customer :
@Route("customer")
public class FormView {
public FormView() {
}
}
Si vous n'assignez pas explicitement de valeur pour l'annotation @Route, le segment d'URL est le nom de la classe converti en minuscule, avec le suffixe View supprimé.
MainViewserait mappé sur/mainFormViewserait mappé sur/form
Caractéristiques partagées
Au-delà d'être toutes deux des routes de vue, MainView et FormView partagent des caractéristiques supplémentaires. Certaines de ces traits communs, comme l'utilisation de composants Composite, sont fondamentaux pour l'utilisation des applications webforJ, tandis que d'autres facilitent simplement la gestion de votre application.
Utilisation de composants Composite
Lorsque l'application était monopage, vous stockiez les composants à l'intérieur d'un Frame. À partir de maintenant, avec une application à plusieurs vues, vous devrez envelopper ces composants UI à l'intérieur de composants Composite.
Les composants Composite sont des enveloppes qui facilitent la création de composants réutilisables.
Pour créer un composant Composite, héritez de la classe Composite avec un composant lié spécifié qui sert de fondation de la classe, par exemple, Composite<FlexLayout>.
Ce tutoriel utilise des éléments Div comme composants liés, mais ils peuvent être n'importe quel composant, tel que FlexLayout ou AppLayout. En utilisant la méthode getBoundComponent(), vous pouvez référencer le composant lié et avoir accès à ses méthodes. Cela vous permet de définir la taille, d'ajouter un nom de classe CSS, d'ajouter des composants que vous souhaitez afficher dans le composant Composite, et d'accéder aux méthodes spécifiques au composant.
Pour MainView et FormView, étendez Composite avec Div comme composant lié. Ensuite, référez-vous à ce composant lié afin que vous puissiez ajouter ultérieurement les interfaces utilisateur. Les deux vues devraient ressembler à la structure suivante :
// Étendez Composite avec un composant lié
public class MainView extends Composite<Div> {
// Accédez au composant lié
private Div self = getBoundComponent();
// Créez un composant UI
private Button submit = new Button("Submit");
public MainView() {
// Ajoutez le composant UI au composant lié
self.add(submit);
}
}
Définir le titre du cadre
Lorsque l'utilisateur a plusieurs onglets dans son navigateur, un titre unique de cadre l'aide à identifier rapidement quelle partie de l'application il a ouverte.
L'annotation @FrameTitle définit ce qui apparaît dans le titre du navigateur ou l'onglet de la page. Pour les deux vues, ajoutez un titre de cadre en utilisant l'annotation @FrameTitle :
- MainView
- FormView
@Route("/")
@FrameTitle("Tableau des clients")
public class MainView extends Composite<Div> {
private Div self = getBoundComponent();
public MainView(CustomerService customerService) {
}
}
@Route("customer")
@FrameTitle("Formulaire de client")
public class FormView extends Composite<Div> {
private Div self = getBoundComponent();
public FormView(CustomerService customerService) {
}
}
CSS partagé
Avec un composant lié que vous pouvez référencer dans MainView et FormView, vous pouvez le styliser avec du CSS.
Vous pouvez utiliser le CSS de la première étape, Créer une application de base, pour donner aux deux vues des styles de conteneur UI identiques.
Ajoutez le nom de classe CSS card au composant lié dans chaque vue :
- MainView
- FormView
@Route("/")
@FrameTitle("Tableau des clients")
public class MainView extends Composite<Div> {
private Div self = getBoundComponent();
public MainView() {
self.addClassName("card");
}
}
@Route("customer")
@FrameTitle("Formulaire de client")
public class FormView extends Composite<Div> {
private Div self = getBoundComponent();
public FormView() {
self.addClassName("card");
}
}
Utilisation de CustomerService
Le dernier trait partagé pour les vues est l'utilisation de la classe CustomerService.
Le Table dans MainView affiche chaque client, tandis que FormView ajoute de nouveaux clients. Comme les deux vues interagissent avec les données des clients, elles ont besoin d'accéder à la logique métier de l'application.
Les vues accèdent à cela par le biais du service Spring créé dans Travailler avec des données, CustomerService. Pour utiliser le service Spring dans chaque vue, faites de CustomerService un paramètre de constructeur :
- MainView
- FormView
@Route("/")
@FrameTitle("Tableau des clients")
public class MainView extends Composite<Div> {
private Div self = getBoundComponent();
public MainView(CustomerService customerService) {
this.customerService = customerService;
self.addClassName("card");
}
}
@Route("customer")
@FrameTitle("Formulaire de client")
public class FormView extends Composite<Div> {
private Div self = getBoundComponent();
public FormView(CustomerService customerService) {
this.customerService = customerService;
self.addClassName("card");
}
}
Création de MainView
Après avoir rendu votre application routable, donné aux vues des enveloppes de composants Composite et inclus le CustomerService, vous êtes prêt à construire les interfaces utilisateur uniques à chaque vue. Comme mentionné précédemment, MainView contient les composants UI initialement dans Application. Cette classe a également besoin d'un moyen de naviguer vers FormView.
Regroupement des méthodes du Table
Alors que vous déplacez les composants de Application vers MainView, il est judicieux de commencer à sectionner les parties de votre application, afin qu'une méthode personnalisée puisse apporter des changements au Table d'un coup. La section de votre code maintenant le rend plus gérable à mesure que l'application devient plus complexe.
Maintenant, votre constructeur MainView ne devrait appeler qu'une seule méthode buildTable() qui ajoute les colonnes, définit la taille et référence le dépôt :
private void buildTable() {
table.setSize("1000px", "294px");
table.setMaxWidth("90vw");
table.addColumn("firstName", Customer::getFirstName).setLabel("Prénom");
table.addColumn("lastName", Customer::getLastName).setLabel("Nom");
table.addColumn("company", Customer::getCompany).setLabel("Société");
table.addColumn("country", Customer::getCountry).setLabel("Pays");
table.setColumnsToAutoFit();
table.getColumns().forEach(column -> column.setSortable(true));
table.setRepository(customerService.getRepositoryAdapter());
}
Navigation vers FormView
Les utilisateurs ont besoin d'un moyen pour naviguer de MainView à FormView en utilisant l'interface utilisateur.
Dans webforJ, vous pouvez naviguer directement vers une nouvelle vue en utilisant la classe de vue. Le routage via une classe au lieu d'un segment d'URL garantit que webforJ empruntera le chemin correct pour charger la vue.
Pour naviguer vers une vue différente, utilisez la classe Router pour obtenir l'emplacement actuel avec getCurrent(), puis utilisez la méthode navigate() avec la classe de la vue comme paramètre :
Router.getCurrent().navigate(FormView.class);
Ce code enverra de manière programmatique les utilisateurs vers le nouveau formulaire de client, mais la navigation doit être connectée à une action utilisateur.
Pour permettre aux utilisateurs d'ajouter un nouveau client, vous pouvez modifier ou remplacer le bouton d'information de Application. Au lieu d'ouvrir une boîte de dialogue de message, le bouton peut naviguer vers la classe FormView :
private Button addCustomer = new Button("Ajouter un client", ButtonTheme.PRIMARY,
e -> Router.getCurrent().navigate(FormView.class));
MainView complété
Avec la navigation vers FormView et les méthodes de tableau regroupées, voici à quoi devrait ressembler MainView avant de passer à la création de FormView :
Création de FormView
FormView affichera un formulaire pour ajouter de nouveaux clients. Pour chaque propriété de client, FormView disposera d'un composant éditable pour que les utilisateurs interagissent. De plus, il aura un bouton pour que les utilisateurs soumettent les données et un bouton annuler pour les ignorer.
Création d'une instance de Customer
Lorsqu'un utilisateur édite les données d'un nouveau client, les modifications ne doivent être appliquées au dépôt que lorsqu'il est prêt à soumettre le formulaire. Utiliser une instance de l'objet Customer est un moyen pratique d'éditer et de maintenir les nouvelles données sans modifier directement le dépôt. Créez un nouveau Customer à l'intérieur de FormView à utiliser pour le formulaire :
private Customer customer = new Customer();
Pour rendre l'instance de Customer éditable, chaque propriété, sauf l'id, devrait être associée à un composant éditable. Les changements qu'un utilisateur effectue dans l'UI devraient être reflétés dans l'instance de Customer.
Ajout de composants TextField
Les trois premières propriétés éditables dans Customer (firstName, lastName et company) sont toutes des valeurs de type String, et devraient être représentées par un éditeur de texte à une ligne. Les composants TextField sont un excellent choix pour représenter ces propriétés.
Avec le composant TextField, vous pouvez ajouter une étiquette et un écouteur d'