Routes Registration
Neben der Registrierung von Routen mit den @Route-Anmerkungen ist es möglich, Routen zur Laufzeit dynamisch zu registrieren, zu aktualisieren oder zu entfernen, basierend auf der Anwendungslogik, Benutzerrollen oder anderen Bedingungen. Diese Flexibilität ermöglicht es Ihnen, die Navigation dynamischer zu verwalten, anstatt Routen zur Compile-Zeit statisch zu definieren.
Dynamisches Registrieren von Routen
Sie können eine Route dynamisch mit der Klasse RouteRegistry registrieren, die über den Router zugänglich ist. Dadurch können Sie während der Laufzeit neue Routen hinzufügen, was eine flexible Navigation ermöglicht.
Beispiel: Dynamisches Registrieren einer Route
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Die Einstellungen-Route dynamisch registrieren
registry.register("/settings", SettingsView.class);
// Zur Einstellungen-Ansicht navigieren
router.navigate(SettingsView.class);
In diesem Beispiel wird die Route /settings dynamisch registriert, und die App navigiert zur neu registrierten Ansicht.
Bedingte Routenregistrierung
Oft müssen Routen basierend auf bestimmten Bedingungen wie Benutzerrollen oder dem Zustand der App hinzugefügt oder entfernt werden. Mit dynamischem Routing können Sie Routen zur Laufzeit bedingt registrieren oder abmelden.
Beispiel: Bedingte Registrierung basierend auf der Benutzerrolle
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Benutzerrolle überprüfen und entsprechende Routen registrieren
if (user.hasRole("editor")) {
registry.register("/editor/dashboard", EditorDashboardView.class);
} else if (user.hasRole("viewer")) {
registry.register("/viewer/dashboard", ViewerDashboardView.class);
}
// Zur entsprechenden Dashboard navigieren
if (user.hasRole("editor")) {
router.navigate(EditorDashboardView.class);
} else if (user.hasRole("viewer")) {
router.navigate(ViewerDashboardView.class);
}
In diesem Beispiel:
- Die Route
/editor/dashboardoder/viewer/dashboardwird basierend auf der Benutzerrolle dynamisch registriert. - Die App navigiert zum entsprechenden Dashboard basierend auf den Zugriffsrechten des Benutzers.
Routen entfernen
Ebenso wie Routen dynamisch hinzugefügt werden können, können sie auch zur Laufzeit entfernt werden, wenn sie nicht mehr benötigt werden oder sich der Kontext der App ändert.
Beispiel: Entfernen einer registrierten Route
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Die Route für die Einstellungen-Ansicht entfernen
registry.unregister("/settings");
// Optional nach Komponentenklasse entfernen
registry.unregister(SettingsView.class);
In diesem Beispiel wird die Route /settings dynamisch entfernt, wenn sie nicht mehr benötigt wird.
Routen beim App-Startup registrieren
Sie können dynamische Routen während der App-Initialisierung registrieren, sodass bestimmte Ansichten basierend auf der Umgebung oder Konfiguration beim Startup verfügbar sind.
Beispiel: Routen während des App-Startups registrieren
@Routify
public class Application extends App {
@Override
protected void onWillRun() {
// Eine Debug-Ansicht nur im Entwicklungsmodus registrieren
if (Environment.getCurrent().isDebug()) {
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
registry.register("/debug", DebugView.class);
}
}
}
In diesem Beispiel:
- Eine
DebugViewwird während des App-Startups dynamisch registriert, aber nur, wenn die App im Entwicklungsmodus läuft.
Dynamisches Registrieren von @Route annotierten Komponenten
Neben der manuellen Definition von Routen ist es möglich, bereits mit @Route annotierte Komponenten dynamisch zu registrieren. Dies ist nützlich, wenn Sie vorannotierte Klassen nutzen möchten, diese jedoch dynamisch basierend auf der Anwendungslogik registrieren möchten.
Beispiel: Registrieren einer @Route annotierten Komponente
@Route("profile")
public class ProfileView extends Composite<Div> {
// Logik der Profilansicht
}
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Dynamisches Registrieren der ProfileView mit ihrer @Route Annotation
registry.register(ProfileView.class);
// Zur ProfileView navigieren
router.navigate(ProfileView.class);
In diesem Beispiel:
- Die
ProfileView-Klasse ist mit@Route("profile")annotiert. - Die Route wird zur Laufzeit dynamisch mit
registry.register(ProfileView.class)registriert.
Routen aus einem gesamten Paket registrieren
Wenn Ihre App eine große Anzahl von Routen enthält, die innerhalb eines Pakets organisiert sind, können Sie alle @Route-annotierten Komponenten aus diesem Paket dynamisch registrieren.
Beispiel: Registrieren aller Routen aus einem Paket
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Alle Routen im Paket "com.myapp.admin" registrieren
RouteRegistry.ofPackage(new String[] { "com.myapp.admin" }, registry);
In diesem Beispiel:
- Die Methode
ofPackagedurchsucht das Paketcom.myapp.adminund registriert alle Klassen, die mit@Routeannotiert sind. - Dies ist besonders nützlich für große Anwendungen mit zahlreichen Routen, die nach Paketen organisiert sind.
Beginnend mit 25.11 können Integrationsframeworks ihren eigenen Routenentdeckungsmechanismus über das RouteRegistryProvider SPI bereitstellen. Dies ermöglicht framework-spezifische Funktionen wie Dependency Injection für dynamisch registrierte Routen. Siehe Route Registry Provider für Details.
Abfragen registrierter Routen
Um eine Liste aller dynamisch registrierten Routen abzurufen, verwenden Sie die Klasse RouteRegistry. Dies ist nützlich, wenn Sie verfügbar Routen programmatisch verwalten oder anzeigen müssen.
Beispiel: Abrufen und Anzeigen aller registrierten Routen
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
List<RouteEntry> routes = registry.getAvailableRouteEntires();
routes.forEach(route -> console().log("Pfad: " + route.getPath()));
In diesem Beispiel ruft die App alle derzeit registrierten Routen ab und gibt deren Pfade aus.
Dynamisches Verwalten von Routen-Aliassen
webforJ ermöglicht es Ihnen, mehrere Aliasse für eine einzige Ansicht zu registrieren. Das bedeutet, dass Benutzer dieselbe Ansicht über verschiedene URL-Pfade erreichen können.
Beispiel: Dynamisches Registrieren von Routen-Aliassen
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Eine Hauptroute registrieren
registry.register("/contact", ContactView.class);
// Aliasse für die Kontaktansicht registrieren
registry.register("/support", ContactView.class);
registry.register("/help", ContactView.class);
In diesem Beispiel ist die ContactView über drei verschiedene Pfade zugänglich: /contact, /support und /help.