路由 API

本章节介绍路由 API 的主要内容。

路由注册

如需为界面注册路由,在界面控制器添加 @Route 注解,示例:

@Route("button-screen")
public class ButtonScreen extends Screen {
}

该注解有三个参数:

  • path(或 value)表示路由值。

  • parentPrefix 用来做路由压缩(squashing)(参阅 这里)。

  • root 是一个布尔值属性,用来确定一个路由是否定义根界面(例如,登录界面主界面)。默认值为 false

    如果你创建了一个根界面,使用了非默认 login 的其他路径,并且做成了可以不需要登录而通过链接直接访问的界面,则需要为匿名用户启用该界面。否则,当用户输入 URL 时,比如 /#your-root-screen,他们会被重定向到 /#login 界面,而不会打开需要的根界面。

    参阅 匿名访问界面 部分,有如何为匿名用户创建根界面的示例。

路由压缩

此功能目的是为了在打开多个带有相同部分路由的界面时保持 URL 干净易读。

假设对于 Customer 实体,我们有浏览和编辑界面:

@Route("customers")
public class CustomerBrowse extends StandardLookup<Customer> {
}
@Route("customers/edit")
public class CustomerEdit extends StandardEditor<Customer> {
}

在打开浏览界面之后立刻打开编辑界面,此时 URL 压缩能用来避免 URL 中重复的 customers 路由部分。需要在编辑界面的 @Route 注解中用 parentPrefix 参数指定路由的重复部分:

@Route(value = "customers/edit", parentPrefix = "customers")
public class CustomerEdit extends StandardEditor<Customer> {
}

现在,当与浏览界面在同一标签页打开编辑界面时,地址将像这样:#main/0/customers/edit?id=…

UI 状态映射至 URL

UrlRouting 接口支持根据当前界面和一些参数来修改当前应用程序的 URL。其包含如下方法:

  • pushState() - 更改地址并添加新的浏览器历史记录。

  • replaceState() - 替换地址但不添加新的浏览器历史记录。

  • getState() - 将当前状态作为 NavigationState 对象返回。

pushState()/replaceState() 方法接受当前界面控制器和一组参数(map 形式,可选)为输入参数。

使用 UrlRouting 的示例,请参阅 后面 章节。

导航过滤器可以用来阻止切换到某些路由。

导航过滤器是实现了 NavigationFilter 接口的 Spring bean。可以使用 @Order 注解来配置所有导航过滤器的调用顺序。常量 JmixOrder.HIGHEST_PRECEDENCEJmixOrder.LOWEST_PRECEDENCE 用来定义框架中的过滤器优先级范围。

NavigationFilter 接口有 allowed() 方法,可以使用两个输入参数:当前导航状态 fromState 和请求的导航状态 toState。此方法返回 AccessCheckResult 实例并检查是否允许从当前导航状态切换到请求导航状态。

参考 JmixLoginScreenFilter 作为示例。支持在用户已经登录的情况下,检查当前会话是否已授权,这样能阻止导航至登录界面。