From 62faad76b081c2f1ae5e77eb6b0ecb215b23e053 Mon Sep 17 00:00:00 2001 From: Konstantin Krivopustov Date: Fri, 23 Nov 2012 15:53:30 +0000 Subject: [PATCH] Refs #1633 CUBA documentation (views) --- doc/content/manual/ru/chapter_development.xml | 39 -- doc/content/manual/ru/chapter_framework.xml | 506 +++++++++++------- doc/content/manual/ru/glossary.xml | 48 +- doc/content/manual/ru/manual.xml | 374 +++++++++---- doc/tools/css/style.css | 4 +- 5 files changed, 618 insertions(+), 353 deletions(-) diff --git a/doc/content/manual/ru/chapter_development.xml b/doc/content/manual/ru/chapter_development.xml index 84b78775d9..757dc2a30a 100644 --- a/doc/content/manual/ru/chapter_development.xml +++ b/doc/content/manual/ru/chapter_development.xml @@ -112,45 +112,6 @@ Описание скриптов сборки TODO -
- Описание конфигурационных файлов - - - datatypes.xml - - TODO - - - - persistence.xml - - TODO - - - - metadata.xml - - TODO - - - - context.xml - - В данном конфигурационном файле задается тип используемой СУБД, а также использование PersistenceManager. - Пример файла context.xml для приложения Магазин: - - - - - web.xml - - Файл web.xml модуля core приложения Магазин: - - - - - TODO -
Создание проекта TODO diff --git a/doc/content/manual/ru/chapter_framework.xml b/doc/content/manual/ru/chapter_framework.xml index 55663dc1ac..7fd38bb6ed 100644 --- a/doc/content/manual/ru/chapter_framework.xml +++ b/doc/content/manual/ru/chapter_framework.xml @@ -43,21 +43,13 @@ - CUBA-приложение всегда состоит как минимум из двух частей: - - - Веб-приложения среднего слоя (Middleware) - - - Веб-приложения веб-клиента (Web Client) - - - Опционально приложение может содержать десктопный клиент и один или несколько порталов. + Обязательным уровнем любого приложения является средний слой - Middleware. Для реализации пользовательского интерфейса как правило используется один или несколько клиентских уровней, например Web Client и Web Portal. + Вышеперечисленные уровни являются стандартными, однако в комплексном приложении для разделения функциональности можно без труда создать произвольное количество как клиентских уровней, так и уровней среднего слоя. Все клиенты взаимодействуют со средним слоем одинаковым образом посредством протокола HTTP, что позволяет размещать средний слой произвольным образом, в том числе за сетевым экраном. Следует отметить, что при развертывании в простейшем случае среднего слоя и веб-клиента на одном сервере между ними организуется локальное взаимодействие в обход сетевого стека для снижения накладных расходов.
Модули приложения - Модуль – наименьшая структурная единица CUBA-приложения. Представляет собой один модуль проекта приложения и соответствующий ему JAR файл. + Модуль – наименьшая структурная единица CUBA-приложения. Представляет собой один модуль проекта приложения и соответствующий ему JAR файл с исполняемым кодом. Стандартные модули: global – включает в себя классы сущностей, интерфейсы сервисов и другие общие для всех уровней классы. Используется на всех уровнях приложения. @@ -210,7 +202,7 @@ сущность -
+
Базовые классы сущностей @@ -402,7 +394,7 @@ Пример:@PrimaryKeyJoinColumn(name = "CARD_ID", referencedColumnName = "ID") - + @NamePattern @@ -1058,177 +1050,180 @@ public class MyBean implements AppContext.Listener { позволяет создавать универсальные механизмы работы с данными -
- Интерфейсы фреймворка метаданных - - - - - -
- Рассмотрим основные интерфейсы метаданных. - - - - Session - - - Точка входа в фреймворк метаданных. Позволяет получать экземпляры MetaClass по имени и по соответствующему классу Java. Обратите внимание на различие методов getClass() и getClassNN() - первые могут возвращать null, вторые нет (NonNull). - Объект Session может быть получен через интерфейс инфраструктуры - Metadata - . - Пример:@Inject +
+ Интерфейсы метаданных + Рассмотрим основные интерфейсы метаданных. +
+ Интерфейсы фреймворка метаданных + + + + + +
+ + + + Session + + + Точка входа в фреймворк метаданных. Позволяет получать экземпляры MetaClass по имени и по соответствующему классу Java. Обратите внимание на различие методов getClass() и getClassNN() - первые могут возвращать null, вторые нет (NonNull). + Объект Session может быть получен через интерфейс инфраструктуры + Metadata + . + Пример:@Inject protected Metadata metadata; ... Session session = metadata.getSession(); MetaClass metaClass1 = session.getClassNN("sec$User"); MetaClass metaClass2 = session.getClassNN(User.class); assert metaClass1 == metaClass2; - - - - - MetaModel - - - Редко используемый интерфейс, служит для группировки мета-классов. - Группировка осуществляется по первым трем частям имени пакета Java класса сущности. Например, мета-класс сущности com.abc.sales.entity.Customer принадлежит мета-модели с именем com.abc.sales - - - - - MetaClass - - - Интерфейс метаданных класса сущности. MetaClass всегда ассоциирован с классом Java, которого он представляет. - Основные методы: - - - getName() – имя сущности, по соглашению первой частью имени до знака $ является код пространства имен, например, sales$Customer - - - getProperties() – список мета-свойств (MetaProperty) - - - getProperty(), getPropertyNN() - получение мета-свойства по имени. Первый метод в случае отсутствия атрибута с указанным именем возвращает null, второй выбрасывает исключение. - Пример:MetaClass userClass = session.getClassNN(User.class); + + + + + MetaModel + + + Редко используемый интерфейс, служит для группировки мета-классов. + Группировка осуществляется по первым трем частям имени пакета Java класса сущности. Например, мета-класс сущности com.abc.sales.entity.Customer принадлежит мета-модели с именем com.abc.sales + + + + + MetaClass + + + Интерфейс метаданных класса сущности. MetaClass всегда ассоциирован с классом Java, которого он представляет. + Основные методы: + + + getName() – имя сущности, по соглашению первой частью имени до знака $ является код пространства имен, например, sales$Customer + + + getProperties() – список мета-свойств (MetaProperty) + + + getProperty(), getPropertyNN() - получение мета-свойства по имени. Первый метод в случае отсутствия атрибута с указанным именем возвращает null, второй выбрасывает исключение. + Пример:MetaClass userClass = session.getClassNN(User.class); MetaProperty groupProperty = userClass.getPropertyNN("group"); - - - getPropertyPath() - позволяет перемещаться по ссылкам. Данный метод принимает строковый параметр - путь из имен атрибутов, разделенных точкой. Возвращаемый объект MetaPropertyPath позволяет обратиться к искомому (последнему в пути) атрибуту вызовом getMetaProperty(). - Пример:MetaClass userClass = session.getClassNN(User.class); + + + getPropertyPath() - позволяет перемещаться по ссылкам. Данный метод принимает строковый параметр - путь из имен атрибутов, разделенных точкой. Возвращаемый объект MetaPropertyPath позволяет обратиться к искомому (последнему в пути) атрибуту вызовом getMetaProperty(). + Пример:MetaClass userClass = session.getClassNN(User.class); MetaProperty groupNameProp = userClass.getPropertyPath("group.name").getMetaProperty(); assert groupNameProp.getDomain().getName().equals("sec$Group"); - - - getJavaClass() – класс сущности, которому соответствует данный MetaClass - - - getAnnotations() – коллекция мета-аннотаций - - - - - - - MetaProperty - - - Интерфейс метаданных атрибута сущности. - Основные методы: - - - getName() – имя свойства, соответствует имени атрибута сущности - - - getDomain() – мета-класс, которому принадлежит данное свойство - - - getType() – тип свойства: - - простой тип: DATATYPE - - - перечисление: ENUM - - - ссылочный тип двух видов: - - - ASSOCIATION − простая ссылка на другую сущность. Например, отношение заказа и покупателя − ассоциация. - - - COMPOSITION − ссылка на сущность, которая не имеет самостоятельного значения без владеющей сущности. COMPOSITION можно считать "более тесным" отношением, чем ASSOCIATION. Например, отношение заказа и пункта этого заказа − COMPOSITION, т.к. пункт не может существовать без заказа, которому он принадлежит. - - - Вид ссылочного атрибута ASSOCIATION или COMPOSITION влияет на режим редактирования сущности: в первом случае сохранение связанной сущности в базу данных происходит независимо, а во втором − связанная сущность сохраняется в БД только вместе с владеющей сущностью. - - - - - getRange() – интерфейс Range, детально описывающий тип данного атрибута - - - isMandatory() – признак обязательности атрибута. Используется, например, визуальными компонентами для сигнализации пользователю о необходимости ввода значения. - - - isReadOnly() – признак неизменности атрибута - - - getInverse() – для ссылочного атрибута возвращает мета-свойство с обратной стороны ассоциации, если таковое имеется - - - getAnnotatedElement() – поле (java.lang.reflect.Field) или метод (java.lang.reflect.Method), соответствующие данному атрибуту сущности - - - getJavaType() – класс Java данного атрибута сущности. Это либо тип поля класса, либо тип возвращаемого значения метода. - - - getDeclaringClass() – класс Java, содержащий данный атрибут - - - - - - - Range - - - Интерфейс, детально описывающий тип атрибута сущности. - Основные методы: - - - isDatatype() – возвращает true для атрибута простого типа - - - asDatatype() - возвращает - Datatype - для атрибута простого типа - - - isEnum() – возвращает true для атрибута типа перечисления - - - asEnumeration() - возвращает - Enumeration - для атрибута типа перечисления - - - isClass() – возвращает true для ссылочного атрибута типа ASSOCIATION или COMPOSITION - - - asClass() - возвращает мета-класс ассоциированной сущности для ссылочного атрибута - - - isOrdered() – возвращает true если атрибут представляет собой упорядоченную коллекцию (например List) - - - getCardinality() – вид отношения для ссылочного атрибута: ONE_TO_ONE, MANY_TO_ONE, ONE_TO_MANY, MANY_TO_MANY - - - - - + + + getJavaClass() – класс сущности, которому соответствует данный MetaClass + + + getAnnotations() – коллекция мета-аннотаций + + + + + + + MetaProperty + + + Интерфейс метаданных атрибута сущности. + Основные методы: + + + getName() – имя свойства, соответствует имени атрибута сущности + + + getDomain() – мета-класс, которому принадлежит данное свойство + + + getType() – тип свойства: + + простой тип: DATATYPE + + + перечисление: ENUM + + + ссылочный тип двух видов: + + + ASSOCIATION − простая ссылка на другую сущность. Например, отношение заказа и покупателя − ассоциация. + + + COMPOSITION − ссылка на сущность, которая не имеет самостоятельного значения без владеющей сущности. COMPOSITION можно считать "более тесным" отношением, чем ASSOCIATION. Например, отношение заказа и пункта этого заказа − COMPOSITION, т.к. пункт не может существовать без заказа, которому он принадлежит. + + + Вид ссылочного атрибута ASSOCIATION или COMPOSITION влияет на режим редактирования сущности: в первом случае сохранение связанной сущности в базу данных происходит независимо, а во втором − связанная сущность сохраняется в БД только вместе с владеющей сущностью. + + + + + getRange() – интерфейс Range, детально описывающий тип данного атрибута + + + isMandatory() – признак обязательности атрибута. Используется, например, визуальными компонентами для сигнализации пользователю о необходимости ввода значения. + + + isReadOnly() – признак неизменности атрибута + + + getInverse() – для ссылочного атрибута возвращает мета-свойство с обратной стороны ассоциации, если таковое имеется + + + getAnnotatedElement() – поле (java.lang.reflect.Field) или метод (java.lang.reflect.Method), соответствующие данному атрибуту сущности + + + getJavaType() – класс Java данного атрибута сущности. Это либо тип поля класса, либо тип возвращаемого значения метода. + + + getDeclaringClass() – класс Java, содержащий данный атрибут + + + + + + + Range + + + Интерфейс, детально описывающий тип атрибута сущности. + Основные методы: + + + isDatatype() – возвращает true для атрибута простого типа + + + asDatatype() - возвращает + Datatype + для атрибута простого типа + + + isEnum() – возвращает true для атрибута типа перечисления + + + asEnumeration() - возвращает + Enumeration + для атрибута типа перечисления + + + isClass() – возвращает true для ссылочного атрибута типа ASSOCIATION или COMPOSITION + + + asClass() - возвращает мета-класс ассоциированной сущности для ссылочного атрибута + + + isOrdered() – возвращает true если атрибут представляет собой упорядоченную коллекцию (например List) + + + getCardinality() – вид отношения для ссылочного атрибута: ONE_TO_ONE, MANY_TO_ONE, ONE_TO_MANY, MANY_TO_MANY + + + + + +
Формирование метаданных Основной источник формирования структуры метаданных - аннотированные классы сущностей. @@ -1405,26 +1400,143 @@ String formattedValue = format.format(value);
Представления - Механизм представлений обеспечивает извлечение из БД и передачу клиенту графов сущностей, ограниченных в глубину и/или по атрибутам. - Представление всегда должно быть задано при запросе данных у middleware. Получив выборку данных по представлению, клиентский код может быть уверен, что все запрошенные атрибуты и связанные сущности получены, и их можно использовать без опаски получить NullPointerException или исключение типа LazyInitializationException. Представление решает и обратную задачу − ненужные атрибуты не извлекаются из БД, что снижает нагрузку в случае "широких" сущностей (содержащих большое число атрибутов). - Для каждой сущности по умолчанию доступны два типа представления с именами _local и _minimal - - - _local определяет все локальные атрибуты сущности (т.е. все, кроме ссылок на другие сущности); - - - _minimal определяет атрибуты, входящие в InstanceName. Если InstanceName не задано, данное представление определяет только системные атрибуты (id, createTs и пр.). - - - Представления нужно определять в файле ext-views.xml модуля core. - - Внимание - Имя представления должно быть уникально в пределах сущности. При этом рекомендуется давать более "описательные" имена. Например, не "browse", а "nameOfEntityBrowse". Это упрощает поиск XML-описателей представлений по имени. - - Пример представления для сущности User, которое должно выбирать все простые поля и ссылку на группу: - <view entity="sec$User" name="user.browse" extends="_local"> - <property name="group" view="_local"/> -</view> +
+ Общие сведения + При извлечении сущностей из базы данных обычно встает вопрос - как обеспечить загрузку связанных сущностей на нужную глубину? + Например, для браузера Заказов нужно отобразить дату и сумму заказа совместно с названием Покупателя, т.е. загрузить связанный экземпляр Покупателя. А для экрана редактирования Заказа необходимо загрузить еще и коллекцию Пунктов заказа, причем каждый Пункт заказа должен содержать связанный экземпляр Товара для отображения его наименования. + Загрузка по требованию в большинстве случаев не может помочь, так как обработка данных как правило происходит не в транзакции, в которой загружаются сущности, а, например, на клиентском уровне в пользовательском интерфейсе. В то же время задание энергичной загрузки в аннотациях сущностей недопустимо, так как приводит к постоянному извлечению всего графа связанных сущностей, который может быть очень большим. + Другой похожей проблемой является ограничение набора локальных атрибутов сущностей загружаемого графа: например, некоторая сущность имеет 50 атрибутов, в том числе BLOB, а в экране отображается только 10 атрибутов. Зачем загружать из БД, затем сериализовать и передавать клиенту 40 атрибутов, которые ему в данный момент не нужны? + Механизм представлений (views) решает эти проблемы, обеспечивая извлечение из базы данных и передачу клиенту графов сущностей, ограниченных в глубину и по атрибутам. Представление является описателем графа объектов, который требуется в некотором экране UI или другом процессе обработки данных. + Обработка представлений производится следующим образом: + + все связи в модели данных объявляются с признаком загрузки по требованию (fetch = FetchType.LAZY, см. ) + + + в процессе загрузки данных через DataService клиентский код помимо JPQL запроса указывает нужное представление + + + на основе представления формируется так называемый Fetch Plan - особенность лежащего в основе слоя ORM фреймворка Apache OpenJPA. Fetch Plan влияет на формирование SQL запроса к базе данных: как на список возвращаемых полей, так и на соединения с другими таблицами, содержащими связанные сущности. + + + ссылки, не включенные в Fetch Plan (иногда это полезно для упрощения основного SQL запроса), загружаются отдельными SQL запросами, для чего механизм обработки представлений просто обращается к соответствующим методам чтения атрибутов + + + в результате на момент завершения транзакции, загружающей данные, в памяти Middleware содержится граф объектов, заданный JPQL запросом и представлением. + + +
+ Классы представления + + + + + +
+ Представление определяется экземпляром класса View, в котором: + + entityClass - класс сущности, для которого определено представление. Другими словами, "корень" дерева загружаемых сущностей. + + + name - имя представления. Должно быть либо null, либо уникальным в пределах данной сущности. + + + properties - коллекция экземпляров класса ViewProperty, соответствующих загружаемым атрибутам сущности. + + + includeSystemProperties - признак включения системных атрибутов (входящих в состав базовых интерфейсов персистентных сущностей BaseEntity и Updatable). Системные атрибуты не перечисляются в properties явно, а учитываются механизмом обработки представлений в зависимости от того, какие интерфейсы реализует данная сущность. + + + Класс ViewProperty имеет следующие свойства: + + name - имя атрибута сущности + + + view - для ссылочных атрибутов задает представление, с которым необходимо загружать связанную сущность + + + lazy - для ссылочных атрибутов признак того, что данный атрибут нужно не включать в Fetch Plan, а загружать отдельным SQL запросом, инициированным обращением к атрибуту. Следует иметь в виду, что атрибут в любом случае будет загружен на момент окончания транзакции, данный признак влияет только на способ загрузки. + + + + Независимо от набора атрибутов, определенного в представлении, всегда загружаются следующие атрибуты: + + id - идентификатор сущности + + + version - для оптимистично блокируемых сущностей, реализующих Versioned + + + deleteTs, deletedBy - для сущностей, реализующих + SoftDelete + + + + +
+
+ Создание представлений + Представление может быть создано двумя путями: + + программно - созданием экземпляра View, например:View view = new View(Order.class) + .addProperty("date") + .addProperty("amount") + .addProperty("customer", new View(Customer.class) + .addProperty("name") + ); + Как правило, таким способом создаются представления, используемые только в каком-то одном месте бизнес-логики. + + Механизм обработки представлений кэширует создаваемые для именованных представлений объекты Fetch Plan. Это означает, что если Вы программно создадите два представления для одной сущности с одинаковыми именами, но с разным набором атрибутов, то выборка со вторым представлением окажется неверной. + Поэтому никогда не задавайте имен для "одноразовых" представлений, создаваемых программно. + + + + декларативно - путем создания описателя на XML и его развертывания в репозитории представлений ViewRepository. При развертывании на основе XML-описателя создаются и кэшируются экземпляры View. В дальнейшем в любом месте кода приложения требуемое представление можно получить вызовом репозитория с указанием класса сущности и имени представления. + + + Рассмотрим подробнее декларативный способ создания и работы с представлениями. + Ссылка на ViewRepository может быть получена через интерфейс инфраструктуры + Metadata + . Для получения экземпляра View, содержащегося в репозитории, используются методы getView(). Для развертывания XML-описателей представлений в репозитории используются методы deployViews(). + В репозитории для каждой сущности по умолчанию доступны два представления с именами _local и _minimal: + + _local включает в себя все локальные атрибуты сущности + + + _minimal включает в себя атрибуты, входящие в имя экземпляра сущности, и задаваемые аннотацией + @NamePattern + . Если аннотация @NamePattern для сущности не указана, данное представление не включает никаких атрибутов. + + + Подробная структура XML-описателей изложена в + Пример описателя представления для сущности Заказ, которое должно обеспечить загрузку всех локальных атрибутов, ассоциированного Покупателя и коллекции Пунктов заказа:<view class="com.haulmont.sales.entity.Order" + name="orderWithCustomer" + extends="_local"> + <property name="customer" view="_minimal"/> + <property name="items" view="itemsInOrder"/> +</view> + Рекомендуемый способ группировки и развертывания описателей представлений: + + В модуле core в корне src создать файл {имя_проекта}-views.xml и поместить в него все описатели представлений, которые должны быть доступны глобально, т.е. на всех уровнях приложения. + + + Зарегистрировать данный файл в свойстве + cuba.viewsConfig + уровня Middleware, т.е. в файле {имя_проекта}-app.properties модуля core. Это обеспечит автоматическое развертывание представлений на старте приложения в репозитории Middleware (см. метод MetadataImpl.initViews()). Развернутые представления будут доступны и для Middleware, и для клиентских уровней приложения, которые получат соответствующие экземпляры View при подключении к среднему слою. + + + Если существуют представления, которые необходимы только какому-то одному клиентскому уровню приложения, то можно определить их в аналогичном файле этого уровня, например {имя_проекта}-web-views.xml, и зарегистрировать в свойстве + cuba.viewsConfig + этого уровня, т.е. в файле {имя_проекта}-web-app.properties. Тогда клиентский уровень сначала загрузит все имеющиеся представления с Middleware, а затем развернет свои собственные (см. MetadataClientImpl.initViews()). + Возможна также ситуация, когда некоторому клиентскому уровню не нужны глобальные представления, зарегистрированные на среднем слое, или нужны редко. В этом случае имеет смысл объявить на этом клиентском уровне свойство + cuba.lazyLoadServerViews + , тогда глобальные представления будут загружаться на клиентский уровень не все сразу, а по необходимости. + + + Если на момент развертывания некоторого представления в репозитории уже есть представление для этого же класса сущности и с таким же именем, то новое будет проигнорировано. Для того, чтобы представление заменило имеющееся в репозитории и гарантированно было развернуто, в XML-описателе должен быть явно указан атрибут overwrite = "true". В частности, развертывание представлений клиентского уровня производится после загрузки представлений со среднего слоя, поэтому некоторое клиентское представление может оказаться "замаскированным" одноименным представлением Middleware. + + Рекомендуется давать представлениям "описательные" имена. Например, не "browse", а "customerBrowse". Это упрощает поиск XML-описателей представлений по имени в процессе разработки приложения. + +
Интерфейсы инфраструктуры @@ -1445,6 +1557,10 @@ String formattedValue = format.format(value); Metadata Обеспечивает доступ к сессии метаданных и ViewRepository.
+
+ Resources + TODO +
Scripting Scripting − глобальный интерфейс инфраструктуры, решающий следующие задачи: diff --git a/doc/content/manual/ru/glossary.xml b/doc/content/manual/ru/glossary.xml index 52d9c569cb..3088ffb493 100644 --- a/doc/content/manual/ru/glossary.xml +++ b/doc/content/manual/ru/glossary.xml @@ -56,6 +56,17 @@ + + З + + + Загрузка по требованию + + + Режим загрузки данных, при котором связанные сущности загружаются не одновременно с основной сущностью, а отложенно, при обращении к соответствующему атрибуту. Загрузка по требованию возможна только в рамках транзакции, в которой была загружена основная сущность. + + + И @@ -89,6 +100,17 @@ + + Л + + + Локальный атрибут + + + Атрибут сущности, не являющийся ссылкой или коллекцией ссылок на другую сущность. Значения всех локальных атрибутов сущности как правило хранятся в одной таблице (исключение составляют некоторые стратегии наследования сущностей). + + + П @@ -100,7 +122,7 @@ См. - + Персистентный контекст @@ -150,6 +172,17 @@ + + Э + + + Энергичная загрузка + + + Загрузка данных подклассов и связанных объектов одновременно с основной запрашиваемой сущностью. + + + A @@ -180,13 +213,11 @@ E - + Eager Fetching - - Энергичная загрузка − загрузка данных подклассов и связанных объектов одновременно с основной запрашиваемой сущностью. - + @@ -210,6 +241,13 @@ + + L + + Lazy loading + + + J diff --git a/doc/content/manual/ru/manual.xml b/doc/content/manual/ru/manual.xml index 587768c134..e7c71aa258 100644 --- a/doc/content/manual/ru/manual.xml +++ b/doc/content/manual/ru/manual.xml @@ -108,9 +108,268 @@ - Часто задаваемые вопросы - TODO - + Описание конфигурационных файлов +
+ datatypes.xml + TODO +
+
+ persistence.xml + TODO +
+
+ metadata.xml + TODO +
+
+ views.xml + Файлы данного типа используются для описания представлений, см. + Схема XML доступна по адресу http://schemas.haulmont.com/cuba/4.0/view.xsd + + + views - корневой элемент + Элементы views: + + view - описатель View + Атрибуты view: + + class - класс сущности + + + name - имя представления, должно быть уникальным в пределах сущности + + + systemProperties - признак включения системных атрибутов сущности (входящих в состав базовых интерфейсов персистентных сущностей BaseEntity и Updatable). Необязательный атрибут, по умолчанию false. + + + overwrite - признак того, что данный описатель должен переопределить представление с таким же классом и именем, уже развернутое в репозитории. Необязательный атрибут, по умолчанию false. + + + extends - указывает имя представления той же сущности, от которого нужно унаследовать атрибуты. Порядок следования описателей в файле при этом не важен. Например, при указании extends="_local" в текущее представление будут включены все локальные атрибуты сущности. Необязательный атрибут. + + + Элементы view: + + property - описатель ViewProperty + Атрибуты property: + + name - имя атрибута сущности + + + view - для ссылочного атрибута указывает имя представления, с которым должна загружаться ассоциированная сущность. Порядок следования описателей в файле при этом не важен. + + + lazy - для ссылочных атрибутов признак того, что данный атрибут нужно не включать в Fetch Plan, а загружать отдельным SQL запросом, инициированным обращением к атрибуту. Необязательный атрибут, по умолчанию false. + Рекомендуется использовать lazy для атрибутов-коллекций, если таких атрибутов больше одного для данного графа представлениий. Т.е. устанавливайте lazy = "true" для всех коллекций, кроме одной. + + + Элементы property: + + property - описатель атрибута связанной сущности. Таким способом можно определить неименованное представление для связанной сущности прямо внутри текущего описателя (inline). + + + + + + + include - включение другого файла типа views.xml + Атрибуты include: + + file - путь к файлу по правилам интерфейса + Resources + + + + + + + + Пример:<views xmlns="http://schemas.haulmont.com/cuba/4.0/view.xsd"> + + <view class="com.haulmont.sales.entity.Order" + name="orderWithCustomer" + extends="_local"> + <property name="customer" view="_minimal"/> + </view> + + <view class="com.haulmont.sales.entity.Item" + name="itemsInOrder"> + <property name="quantity"/> + <property name="product" view="_minimal"/> + </view> + + <view class="com.haulmont.sales.entity.Order" + name="orderWithCustomerDefinedInline" + extends="_local"> + <property name="customer"> + <property name="name"/> + <property name="email"/> + </property> + </view> + +</views> + См. также свойство приложения + cuba.viewsConfig + +
+
+ web.xml + TODO +
+
+ context.xml + TODO +
+
+ + Описание свойств приложения + + + cuba.viewsConfig + + Конфигурационный параметр, задающий набор файлов views.xml, автоматически развертываемых на старте приложения. См. + Уровень: все + Пример:cuba.viewsConfig=cuba-views.xml reports-views.xml sales-views.xml + + + + cuba.lazyLoadServerViews + + Указывает, что глобальные представления c Middleware нужно загружать на клиентский уровень не все сразу, а по необходимости. См. + Значение по умолчанию: false + Интерфейс: ClientConfig + Уровень: клиентский - Web Client, Web Portal, Desktop Client + + + + cuba.availableLocales + + Список поддерживаемых языков интерфейса. Формат свойства: <Название языка>|<Языковой код>. Значения разных языков между собой разделяются точкой с запятой. Пример: cuba.availableLocales=French|fr;English|en + <Название языка> − это название, которое будет отображаться в списках доступных языков. Например, в окне входа в систему, в экране редактирования пользователя. <Языковой код> − это суффикс для формирования файлов локализации. Например, messages_fr.properties. + Следует иметь в виду, что язык, который указан первым в списке языков свойства cuba.availableLocales, будет отображаться первым в списке доступных языков в том случае, если среди языков данного свойства не будет найден текущий язык системы. В противном случае первым будет отображаться язык системы. + Если для языка, указанного в свойстве, отсутствует файл для его локализации, то по умолчанию берется локализация из файла без суффикса − messages.properties. + Значение по умолчанию: cuba.availableLocales=English|en;Russian|ru + Интерфейс: GlobalConfig + Уровень: все + + + + cuba.web.localeSelectVisible + + Включает или отключает возможность пользователя выбирать язык +интерфейса при входе в систему. + Значение по умолчанию: + cuba.web.localeSelectVisible=true + Интерфейс: GlobalConfig + Уровень: свойство принадлежит всем уровням. + + + + cuba.trustedClientPassword + + Пароль, используемый методом LoginService.loginTrusted(). Доверенный клиент может зайти в систему, не вводя пользовательский пароль. Это свойство используется при интеграции с Active Directory. + Интерфейсы: ServerConfig, WebConfig + Уровень: Middleware, Web Client, Web Portal + + + + cuba.userSessionExpirationTimeoutSec + + Задает таймаут неактивности сессии пользователя + в секундах. + Значение по умолчанию: + cuba.userSessionExpirationTimeoutSec=1800 + Интерфейс: ServerConfig + Уровень: Middleware. + + В большинстве случаев рекомендуется выставлять параметры cuba.userSessionExpirationTimeoutSec и cuba.httpSessionExpirationTimeoutSec в одинаковое значение. + + + + + cuba.httpSessionExpirationTimeoutSec + + Задает таймаут бездействия HTTP-сессии + в секундах. + Значение по умолчанию: + cuba.httpSessionExpirationTimeoutSec=1800 + Интерфейс: WebConfig + Уровень: Web Client. + + В большинстве случаев рекомендуется выставлять параметры cuba.userSessionExpirationTimeoutSec и cuba.httpSessionExpirationTimeoutSec в одинаковое значение. + + + + + cuba.passwordPolicyEnabled + + Определяет, нужно ли применять политику проверки пароля. Если свойство имеет значение true, то все новые пароли будут проверены в соответствии со свойством cuba.passwordPolicyRegExp. + Значение по умолчанию: + cuba.passwordPolicyEnabled=false + Интерфейс: ClientConfig + Уровни: Web Client, Web Portal, Desktop Client. + + + + cuba.passwordPolicyRegExp + + В данном свойстве задается регулярное выражение, которое используется в политике проверки пароля. + Значение по умолчанию: + cuba.passwordPolicyRegExp=((?=.*\\d)(?=.*\\p{javaLowerCase}) (?=.*\\p{javaUpperCase}).{6,20}) + Это означает, что в пароль должен содержать от 6 до 20 символов, в нем можно использоваться цифры, символы и буквы латинского алфавита. При этом обязательно в пароле должна быть хотя бы одна цифра, одна буква в нижнем регистре и одна буква в верхнем регистре. Более подробная информация о синтаксисе регулярных выражений можно найти на сайтах: http://ru.wikipedia.org/wiki/Регулярные_выражения и http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html + Интерфейс: ClientConfig + Уровни: Web Client, Web Portal, Desktop Client. + + + + cuba.web.loginDialogDefaultUser + + Задает имя пользователя по умолчанию. Оно будет автоматически указываться в экране входа в систему. Если в качестве значения свойства указать +<disabled>, то при входе в систему пользователь сам будет вводить имя. + Значение по умолчанию: + cuba.web.loginDialogDefaultUser=admin + Интерфейс: WebConfig + Уровень: Web Client. + + + + cuba.web.loginDialogDefaultPassword + + Задает имя пользователя по умолчанию. Оно будет автоматически указываться в экране входа в систему. Если в качестве значения свойства указать +<disabled>, то при входе в систему пользователь сам будет вводить пароль. + Значение по умолчанию: + cuba.web.loginDialogDefaultPassword=admin + Интерфейс: WebConfig + Уровень: Web Client. + + + + cuba.user.fullNamePattern + + Задает шаблон формирования полного имени пользователя. + Значение по умолчанию + cuba.user.fullNamePattern={LL| }{F|. }{M|.} + Таким образом, можно сформировать полное имя по шаблону из имени, отчества и фамилии пользователя. В шаблоне используются следующие правила: + + + Фигурными скобками {} разделяются части шаблона между собой + + + Правила формирования шаблона внутри фигурных скобок: один из следующих символов и далее, без пробела, символ |. + LL означает фамилию пользователя, написанную в полном варианте (Иванов) + L означает фамилию пользователя, написанную в кратком варианте (И) + FF означает имя пользователя, написанного в полном варианте (Петр) + F означает фамилию пользователя, написанную в кратком варианте (П) + MM означает отчество пользователя, написанное в полном варианте (Сергеевич) + M означает отчество пользователя, написанное в кратком варианте (С) + + + После символа | могут идти любые символы, в том числе, и пробел. + + + + + Схема базы данных @@ -123,114 +382,5 @@
- - Описание конфигурационных свойств - - - cuba.availableLocales. Список поддерживаемых языков интерфейса. Формат свойства: <Название языка>|<Языковой код>. Значения разных языков между собой разделяются точкой с запятой. Пример: cuba.availableLocales=French|fr;English|en - <Название языка> − это название, которое будет отображаться в списках доступных языков. Например, в окне входа в систему, в экране редактирования пользователя. <Языковой код> − это суффикс для формирования файлов локализации. Например, messages_fr.properties. - Следует иметь в виду, что язык, который указан первым в списке языков свойства cuba.availableLocales, будет отображаться первым в списке доступных языков в том случае, если среди языков данного свойства не будет найден текущий язык системы. В противном случае первым будет отображаться язык системы. - Если для языка, указанного в свойстве, отсутствует файл для его локализации, то по умолчанию берется локализация из файла без суффикса − messages.properties. - Значение по умолчанию: - cuba.availableLocales=English|en;Russian|ru - Интерфейс: GlobalConfig - Уровень: свойство принадлежит всем уровням. - - - cuba.web.localeSelectVisible. Включает или отключает возможность пользователя выбирать язык -интерфейса при входе в систему. - Значение по умолчанию: - cuba.web.localeSelectVisible=true - Интерфейс: GlobalConfig - Уровень: свойство принадлежит всем уровням. - - - cuba.trustedClientPassword. Пароль, используемый методом LoginService.loginTrusted(). Доверенный клиент может зайти в систему, не вводя пользовательский пароль. Это свойство используется при интеграции с Active Directory. - Интерфейсы: GlobalConfig, ServerConfig - Уровень: свойство принадлежит всем уровням. - - - cuba.userSessionExpirationTimeoutSec задает таймаут неактивности сессии пользователя - в секундах. - Значение по умолчанию: - cuba.userSessionExpirationTimeoutSec=1800 - Интерфейс: ServerConfig - Уровень: Middleware. - - Совет - В большинстве случаев рекомендуется выставлять параметры cuba.userSessionExpirationTimeoutSec и cuba.httpSessionExpirationTimeoutSec в одинаковое значение. - - - - cuba.httpSessionExpirationTimeoutSec задает таймаут бездействия HTTP-сессии - в секундах. - Значение по умолчанию: - cuba.httpSessionExpirationTimeoutSec=1800 - Интерфейс: WebConfig - Уровень: Web Client. - - Совет - В большинстве случаев рекомендуется выставлять параметры cuba.userSessionExpirationTimeoutSec и cuba.httpSessionExpirationTimeoutSec в одинаковое значение. - - - - cuba.passwordPolicyEnabled определяет, нужно ли применять политику проверки пароля. Если свойство имеет значение true, то все новые пароли будут проверены в соответствии со свойством cuba.passwordPolicyRegExp. - Значение по умолчанию: - cuba.passwordPolicyEnabled=false - Интерфейс: ClientConfig - Уровни: Web Client, Web Portal, Desktop Client. - - - cuba.passwordPolicyRegExp. В данном свойстве задается регулярное выражение, которое используется в политике проверки пароля. - Значение по умолчанию: - cuba.passwordPolicyRegExp=((?=.*\\d)(?=.*\\p{javaLowerCase}) (?=.*\\p{javaUpperCase}).{6,20}) - Это означает, что в пароль должен содержать от 6 до 20 символов, в нем можно использоваться цифры, символы и буквы латинского алфавита. При этом обязательно в пароле должна быть хотя бы одна цифра, одна буква в нижнем регистре и одна буква в верхнем регистре. Более подробная информация о синтаксисе регулярных выражений можно найти на сайтах: http://ru.wikipedia.org/wiki/Регулярные_выражения и http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html - Интерфейс: ClientConfig - Уровни: Web Client, Web Portal, Desktop Client. - - - cuba.web.loginDialogDefaultUser задает имя пользователя по умолчанию. Оно будет автоматически указываться в экране входа в систему. Если в качестве значения свойства указать -<disabled>, то при входе в систему пользователь сам будет вводить имя. - Значение по умолчанию: - cuba.web.loginDialogDefaultUser=admin - Интерфейс: WebConfig - Уровень: Web Client. - - - cuba.web.loginDialogDefaultPassword задает имя пользователя по умолчанию. Оно будет автоматически указываться в экране входа в систему. Если в качестве значения свойства указать -<disabled>, то при входе в систему пользователь сам будет вводить пароль. - Значение по умолчанию: - cuba.web.loginDialogDefaultPassword=admin - Интерфейс: WebConfig - Уровень: Web Client. - - - cuba.user.fullNamePattern задает шаблон формирования полного имени пользователя. - Значение по умолчанию - cuba.user.fullNamePattern={LL| }{F|. }{M|.} - Таким образом, можно сформировать полное имя по шаблону из имени, отчества и фамилии пользователя. В шаблоне используются следующие правила: - - - Фигурными скобками {} разделяются части шаблона между собой - - - Правила формирования шаблона внутри фигурных скобок: один из следующих символов и далее, без пробела, символ |. - LL означает фамилию пользователя, написанную в полном варианте (Иванов) - L означает фамилию пользователя, написанную в кратком варианте (И) - FF означает имя пользователя, написанного в полном варианте (Петр) - F означает фамилию пользователя, написанную в кратком варианте (П) - MM означает отчество пользователя, написанное в полном варианте (Сергеевич) - M означает отчество пользователя, написанное в кратком варианте (С) - - - После символа | могут идти любые символы, в том числе, и пробел. - - - - - - - TODO - diff --git a/doc/tools/css/style.css b/doc/tools/css/style.css index bcbf90bf57..0296ad2f55 100644 --- a/doc/tools/css/style.css +++ b/doc/tools/css/style.css @@ -363,8 +363,8 @@ pre { } .tip { - background: #FAF7F5; - border: solid #e2d2c9 1px; + background: #ecf2ff; + border: solid #4c72bf 1px; } .tip .title { color: #80614D;