Skip to main content

Маршрутизация

Каждой странице N2O выдается свой URL адрес. С помощью маршрутизации можно контролировать формирование URL адресов этих страниц. В браузезе N2O страницы открываются по следующему URL:

http://localhost:8080/#/[route]

, где route адрес N2O страницы. Для каждой страницы route должен быть уникальным.

Адреса страниц имеют иерархическую структуру. Если страница вложенная (открывается через open-page), то её адрес будет содержать адрес предыдущей страницы, плюс добавочная часть.

Эта добавочная часть называется маршрутом и задаётся атрибутом route. Маршрут должен начинаться со знака "/", например, route="/home".

Маршрут может содержать параметры пути, которые задаются через двоеточие, например, /:master_id/detail. Параметр пути указывает на значение идентификатора модели виджета, от которого образована зависимость. На эти параметры можно ссылаться для получения значений, заданных на предыдущих страницах.

note

Т.к. адреса N2O страниц формируются иерархически, то параметры пути будут сохраняться в адресах всех вложенных страниц. Следовательно, параметры пути должны быть уникальными. Если они повторяются, то нет смысла их дублировать в адресе. Будет использоваться значение первого параметра с таким же именем.

Маршрутизация в приложенни#

Начальные адреса страниц задаются в блоке навигации шапки или боковой панели:

<nav>  <page id="homePage" route="/home"></nav>

Пример

http://localhost:8080/#/home

Если route не задан, адресом по умолчанию будет id страницы.

Можно указать пустой маршрут route="/", в таком случае страница будет открываться по корневому адресу.

Корневой адрес регистрируется автоматичеки, если в структуре приложения задать атрибут welcome-page-id:

<application welcome-page-id="homePage">  ...</application>

Пример

http://localhost:8080/#/

Маршрутизация виджетов#

Виджеты могут иметь свою добавочную часть URL, относительно адреса страницы. Она так же задается атрибутом route:

<simple-page>  <table route="/list">    ...  </table><simple-page>

Пример

http://localhost:8080/#/list

Для основного виджета страницы маршрут по умолчанию отсутствует, что эквивалентно route="/". Для остальных случаев, если route не задан, маршрутом по умолчанию будет id виджета.

Адрес виджета может содержать параметр пути, который нужен для master/detail фильтрации. Параметр пути задается в атрибуте route через знак ":"

<table id="master" route="/person"       query-id="person">  ...<!-- master виджет --></table>
<table depends-on="master" route="/:person_id/docs"       query-id="docs" master-field-id="id" detail-field-id="person.id">  ...<!-- detail виджет --></table>

Пример

http://localhost:8080/#/person/123/docs

, где 123 значение параметра пути person_id, которое соответствует значению поля id выделенной записи таблицы master.

Параметр пути может быть только у зависимых виджетов (виджеты с depends-on). Но его указывать необязательно.

Если атрибут route для зависимого виджета не задан, или задан без указания параметра пути, то параметр пути будет определяться через атрибут master-param:

<table depends-on="master"       master-param="person_id"       query-id="docs"       master-field-id="id" detail-field-id="person.id">  ...<!-- detail виджет --></table>

Пример

Если master-param не задан, имя параметра пути сгенерируется автоматически.

Маршрутизация вложенных страниц#

Маршрут вложенных страниц задается атрибутом route в месте, вызывающем открытие страницы:

<open-page page-id="childPage" route="/child"/>

Пример

http://localhost:8080/#/parent/child

, где /parent адрес родительской страницы.

Если route не задан, маршрутом по умолчанию будет идентификатор кнопки (или действия).

Если атрибут route для открываемой страницы задан с указанием параметра пути, то необходимо прописать <path-param>, который описывает какое значение (константа или ссылка на поле в модели) будет использоваться в пути:

<open-page page-id="listContacts" route="/:person_id/contacts">    <!-- Задание параметра через ссылку на поле personId -->#    <path-param name="person_id" value="{personId}"/></open-page>
http://localhost:8080/#/person/123/contacts

Параметры запроса адреса страницы#

Помимо параметров пути, адреса страниц могут иметь параметры запроса. Они задаются в URL как "ключ=значение" после вопросительного знака "?":

http://localhost:8080/#/[route]?param1=[value1]&param2=[value2]

Имя параметра должно быть уникально в рамках одной страницы. Если имя параметра совпадет с каким-либо из существующих, то будет использоваться значение параметра, заданного ранее.

Параметры можно использовать в качестве значений по умолчанию
<form>  <input-text id="parent_id" param="parent_id"/>  <date-interval id="date" begin-param="dateBegin"/></form>

Параметры запроса могут задаваться в параметрах фильтрации.

Для этого необходимо описать параметры фильтрации <query-param> в открывающем новую страницу действии. Описанные в <query-param> параметры попадут в url в качестве параметров запроса. В новой странице необходимо описать <pre-filters> у виджетов, которые будут брать значение из url и фильтровать данные виджета. В <pre-filter> указываем при этом param - имя параметра в url и routable="true" - параметр, указывающий, что значение надо брать из url.

<open-page page-id="listContacts" route="/:person_id/contacts">  <path-param name="person_id" value="123"/>  <query-param name="contact_type" value="{type.id}"/></open-page>
http://localhost:8080/#/persons/123/contacts?contact_type=phone

, где contact_type параметр запроса, соответствующий значению фильтрации по полю type.id.

Открываемая страница listContacts.page.xml
<page>  <form>    ...    <pre-filters>      <eq field-id="type.id" param="contact_type" routable="true"/>    </pre-filters>  </form></page>
Параметрами запроса могут быть пользовательские фильтры:
<table id="main" query-id="persons" route="/persons">  <filters>    <input-text id="name"/>  <filters>  ...</form>
http://localhost:8080/#/persons?main_name=Joe

, где main_name сгенерированный автоматически параметр запроса, соответствующий значению фильтрации по полю name.

Параметры запроса выборки#

Маршрут и параметры запроса значений выборки так же можно контролировать.

Маршрут выборки указывается атрибутом route:

<query route="/persons">  ...</query>

Пример

http://localhost:8080/n2o/data/persons

Параметрами запроса выборки могут быть фильтры:

<field id="name">  <filters>    <like filter-id="name" param="name_like"/>  </filters>  ...</field>

Пример

http://localhost:8080/n2o/data/persons?name_like=Joe

Параметрами запроса выборки могут быть сортировки:

<field id="name">  <sorting param="sorting_name"/>  ...</field>

Пример

http://localhost:8080/n2o/data/persons?sorting_name=asc

Репликация маршрутизации с использованием БД (через JDBC)#

Для включения репликации роутов через jdbc необходимо добавить параметр:

n2o.config.register.store-type=jdbc

и необходимо настроить JdbcTemplate.

Для изменения названия используемой таблицы необходимо задать параметр:

n2o.config.register.jdbc.table-name=route_repository

структура поля таблицы:

id uuid PRIMARY KEY,url char(255),class char(255),context binary

Для автоматического создания таблицы при старте сервиса необходимо задать параметр:

n2o.config.register.jdbc.create-table=true