跳至主要内容

Routes Registration

在 ChatGPT 中打开

除了使用 @Route 注释 注册路由 外,还可以根据应用逻辑、用户角色或其他条件,在运行时动态注册、更新或删除路由。这样的灵活性使您能够更动态地管理导航,而不是在编译时静态地定义路由。

动态注册路由

您可以使用 RouteRegistry 类动态注册路由,该类可以通过 Router 访问。这使您能够在运行时添加新路由,从而实现灵活的导航。

示例:注册动态路由

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

// 动态注册设置路由
registry.register("/settings", SettingsView.class);

// 导航到设置视图
router.navigate(SettingsView.class);

在此示例中,/settings 路由被动态注册,应用程序导航到新注册的视图。

条件路由注册

通常,路由需要根据特定条件,例如用户角色或应用程序的状态进行添加或删除。通过动态路由,您可以有条件地在运行时注册或注销路由。

示例:基于用户角色的条件注册

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

// 检查用户角色并注册适当的路由
if (user.hasRole("editor")) {
registry.register("/editor/dashboard", EditorDashboardView.class);
} else if (user.hasRole("viewer")) {
registry.register("/viewer/dashboard", ViewerDashboardView.class);
}

// 导航到适当的仪表板
if (user.hasRole("editor")) {
router.navigate(EditorDashboardView.class);
} else if (user.hasRole("viewer")) {
router.navigate(ViewerDashboardView.class);
}

在此示例中:

  • 根据用户的角色动态注册 /editor/dashboard/viewer/dashboard 路由。
  • 应用程序根据用户的访问权限导航到适当的仪表板。

删除路由

就像路由可以动态添加一样,当不再需要它们或应用程序的上下文发生变化时,也可以在运行时删除。

示例:删除注册的路由

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

// 删除设置视图的路由
registry.unregister("/settings");

// 可选,通过组件类删除
registry.unregister(SettingsView.class);

在此示例中,当不再需要时,动态删除 /settings 路由。

在应用启动时注册路由

您可以在应用初始化期间注册动态路由,从而使某些视图可用,具体取决于启动时的环境或配置。

示例:在应用启动期间注册路由

@Routify
public class Application extends App {

@Override
protected void onWillRun() {
// 仅在开发模式下注册调试视图
if (Environment.getCurrent().isDebug()) {
Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

registry.register("/debug", DebugView.class);
}
}
}

在此示例中:

  • 仅在应用程序处于开发模式时,动态注册 DebugView

动态注册 @Route 注释的组件

除了手动定义路由外,还可以动态注册已经用 @Route 注释的组件。当您希望利用预注释的类但根据应用逻辑动态注册它们时,这非常有用。

示例:注册 @Route 注释的组件

@Route("profile")
public class ProfileView extends Composite<Div> {
// 个人资料视图逻辑
}

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

// 动态注册带有 @Route 注释的 ProfileView
registry.register(ProfileView.class);

// 导航到 ProfileView
router.navigate(ProfileView.class);

在此示例中:

  • ProfileView 类带有 @Route("profile") 注释。
  • 使用 registry.register(ProfileView.class) 在运行时动态注册路由。

从整个包注册路由

如果您的应用程序有大量路由按包组织,您可以动态注册包中的所有 @Route 注释的组件。

示例:从包中注册所有路由

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

// 注册 "com.myapp.admin" 包中的所有路由
RouteRegistry.ofPackage(new String[] { "com.myapp.admin" }, registry);

在此示例中:

  • ofPackage 方法扫描 com.myapp.admin 包并注册所有带有 @Route 注释的类。
  • 这对于路由数量众多的较大应用程序特别有用。

检索注册的路由

要检索所有动态注册路由的列表,请使用 RouteRegistry 类。当您需要以编程方式管理或显示可用路由时,这很有用。

示例:检索和显示所有注册的路由

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

List<RouteEntry> routes = registry.getAvailableRouteEntires();
routes.forEach(route -> console().log("Path: " + route.getPath()));

在此示例中,应用程序检索当前注册的所有路由并打印它们的路径。

动态管理路由别名

webforJ 允许您为单个视图注册多个别名。这意味着用户可以使用不同的 URL 路径访问相同的视图。

示例:动态注册路由别名

Router router = Router.getCurrent();
RouteRegistry registry = router.getRegistry();

// 注册主路由
registry.register("/contact", ContactView.class);

// 注册联系人视图的别名
registry.register("/support", ContactView.class);
registry.register("/help", ContactView.class);

在此示例中,ContactView 通过三种不同的路径访问:/contact/support/help