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
является примером фильтра навигации. Он предназначен для проверки, аутентифицирована ли текущая сессия, чтобы предотвратить переход к экрану логина, когда пользователь уже вошел в систему.