API маршрутизации

В этом разделе описываются ключевые понятия API маршрутизации.

Регистрация маршрута

Для регистрации маршрута экрана добавьте аннотацию @Route к контроллеру экрана, например:

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

Аннотация имеет три параметра:

  • path (или value) – собственно маршрут.

  • parentPrefix используется для сжатия маршрутов (см. ниже).

  • root – это свойство типа boolean, позволяющее указать, зарегистрирован ли маршрут для корневого экрана (например, экран входа в систему или главный экран). Значение по умолчанию – 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 используется, чтобы избежать повторения маршрута customers в URL, когда экран редактора открывается сразу после браузера. Просто укажите повторяющуюся часть в параметре parentPrefix аннотации @Route на экране редактора:

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

Теперь, когда редактор открыт в той же вкладке, что и браузер, полученный адрес будет похож на #main/0/customers/edit?id=…

Отображение состояния пользовательского интерфейса на URL

Интерфейс UrlRouting позволяет изменять текущий URL приложения в соответствии с текущим экраном и некоторыми параметрами. Он имеет следующие методы:

  • pushState() - изменяет адрес и отправляет новую запись истории браузера;

  • replaceState() - заменяет адрес без добавления новой записи истории браузера;

  • getState() - возвращает текущее состояние как объект NavigationState.

Методы pushState()/replaceState() принимают текущий контроллер экрана и дополнительный мэп параметров.

Смотрите пример использования UrlRouting в разделе ниже.

Механизм фильтров навигации позволяет предотвратить переход на некоторые маршруты.

Фильтр навигации – это бин, реализующий интерфейс NavigationFilter. Аннотацию @Order можно использовать для настройки порядка вызова всех фильтров навигации. Используйте константы JmixOrder.HIGHEST_PRECEDENCE и JmixOrder.LOWEST_PRECEDENCE чтобы задать диапазон, используемый фильтрами, определенными в фреймворке.

Интерфейс NavigationFilter имеет метод allowed(), который принимает два аргумента: текущее состояние навигации fromState и запрошенное состояние навигации toState. Метод возвращает экземпляр AccessCheckResult и проверяет, разрешен ли переход из текущего состояния навигации в запрошенное состояние.

JmixLoginScreenFilter является примером фильтра навигации. Он предназначен для проверки, аутентифицирована ли текущая сессия, чтобы предотвратить переход к экрану логина, когда пользователь уже вошел в систему.