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