Routes Registration
In aanvulling op het registreren van routes met de @Route annotaties, is het mogelijk om routes dynamisch te registreren, bij te werken of te verwijderen tijdens runtime op basis van app-logica, gebruikersrollen of andere voorwaarden. Deze flexibiliteit stelt je in staat om de navigatie dynamischer te beheren, in plaats van routes statisch te definiëren op compilatietijd.
Dynamisch registreren van routes
Je kunt een route dynamisch registreren met behulp van de RouteRegistry-klasse, die toegankelijk is via de Router. Dit maakt het mogelijk om nieuwe routes toe te voegen tijdens runtime, wat flexibele navigatie mogelijk maakt.
Voorbeeld: Dynamisch registreren van een route
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Registreer de instellingenroute dynamisch
registry.register("/settings", SettingsView.class);
// Navigeer naar de instellingenweergave
router.navigate(SettingsView.class);
In dit voorbeeld wordt de /settings route dynamisch geregistreerd, en de app navigeert naar de nieuw geregistreerde weergave.
Voorwaardelijke route-registratie
Vaak moeten routes worden toegevoegd of verwijderd op basis van specifieke voorwaarden, zoals gebruikersrollen of de status van de app. Met dynamische routing kun je routes voorwaardelijk registreren of verwijderen tijdens runtime.
Voorbeeld: Voorwaardelijke registratie op basis van gebruikersrol
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Controleer gebruikersrol en registreer geschikte routes
if (user.hasRole("editor")) {
registry.register("/editor/dashboard", EditorDashboardView.class);
} else if (user.hasRole("viewer")) {
registry.register("/viewer/dashboard", ViewerDashboardView.class);
}
// Navigeer naar het juiste dashboard
if (user.hasRole("editor")) {
router.navigate(EditorDashboardView.class);
} else if (user.hasRole("viewer")) {
router.navigate(ViewerDashboardView.class);
}
In dit voorbeeld:
- De
/editor/dashboardof/viewer/dashboardroute wordt dynamisch geregistreerd op basis van de rol van de gebruiker. - De app navigeert naar het juiste dashboard op basis van de toegangsrechten van de gebruiker.
Routes verwijderen
Net zoals routes dynamisch kunnen worden toegevoegd, kunnen ze ook tijdens runtime worden verwijderd wanneer ze niet langer nodig zijn, of wanneer de context van de app verandert.
Voorbeeld: Een geregistreerde route verwijderen
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Verwijder de route voor de instellingenweergave
registry.unregister("/settings");
// Optioneel, verwijder op klasse-niveau
registry.unregister(SettingsView.class);
In dit voorbeeld wordt de /settings route dynamisch verwijderd wanneer deze niet langer vereist is.
Routes registreren bij app-startup
Je kunt dynamische routes registreren tijdens de initiatie van de app, zodat bepaalde weergaven beschikbaar zijn op basis van de omgeving of configuratie bij de opstart.
Voorbeeld: Routes registreren tijdens app-startup
@Routify
public class Application extends App {
@Override
protected void onWillRun() {
// Registreer een debugweergave alleen in de ontwikkelingsmodus
if (Environment.getCurrent().isDebug()) {
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
registry.register("/debug", DebugView.class);
}
}
}
In dit voorbeeld:
- Een
DebugViewwordt dynamisch geregistreerd tijdens de opstart van de app, maar alleen als de app draait in de ontwikkelingsmodus.
Dynamisch registreren van @Route geannoteerde componenten
Naast het handmatig definiëren van routes, is het mogelijk om componenten die al zijn geannoteerd met @Route dynamisch te registreren. Dit is nuttig wanneer je al geannoteerde klassen wilt gebruiken maar ze dynamisch wilt registreren op basis van app-logica.
Voorbeeld: Een @Route geannoteerde component registreren
@Route("profile")
public class ProfileView extends Composite<Div> {
// Logica voor de profielweergave
}
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Registreer de ProfileView dynamisch met zijn @Route annotatie
registry.register(ProfileView.class);
// Navigeer naar de ProfileView
router.navigate(ProfileView.class);
In dit voorbeeld:
- De
ProfileViewklasse is geannoteerd met@Route("profile"). - De route wordt dynamisch geregistreerd tijdens runtime met behulp van
registry.register(ProfileView.class).
Routes registreren vanuit een heel pakket
Als je app een groot aantal routes heeft die zijn georganiseerd binnen een pakket, kun je alle @Route-geannoteerde componenten uit dat pakket dynamisch registreren.
Voorbeeld: Alle routes uit een pakket registreren
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Registreer alle routes binnen het "com.myapp.admin" pakket
RouteRegistry.ofPackage(new String[] { "com.myapp.admin" }, registry);
In dit voorbeeld:
- De
ofPackagemethode scant hetcom.myapp.adminpakket en registreert alle klassen die zijn geannoteerd met@Route. - Dit is bijzonder nuttig voor grote applicaties met talrijke routes georganiseerd per pakket.
Bij versies vanaf 25.11 kunnen integratiekaders hun eigen route-ontdekkingsmechanisme bieden via de RouteRegistryProvider SPI. Dit maakt kader-specifieke functies mogelijk, zoals afhankelijkheidsinjectie voor dynamisch geregistreerde routes. Zie Route Registry Provider voor meer details.
Geregistreerde routes ophalen
Om een lijst van alle dynamisch geregistreerde routes op te halen, gebruik je de RouteRegistry-klasse. Dit is nuttig wanneer je routes programmatisch wilt beheren of weergeven.
Voorbeeld: Alle geregistreerde routes ophalen en weergeven
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
List<RouteEntry> routes = registry.getAvailableRouteEntires();
routes.forEach(route -> console().log("Pad: " + route.getPath()));
In dit voorbeeld haalt de app alle momenteel geregistreerde routes op en drukt hun paden af.
Dynamisch beheren van route-aliases
webforJ stelt je in staat om meerdere aliassen voor een enkele weergave te registreren. Dit betekent dat gebruikers dezelfde weergave kunnen bereiken via verschillende URL-paden.
Voorbeeld: Dynamisch registreren van route-aliases
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();
// Registreer een primaire route
registry.register("/contact", ContactView.class);
// Registreer aliassen voor de contactweergave
registry.register("/support", ContactView.class);
registry.register("/help", ContactView.class);
In dit voorbeeld is de ContactView toegankelijk via drie verschillende paden: /contact, /support, en /help.