Определение каскадного списка значений c помощью Oracle JDeveloper 11g

Источник: oracle
Стив Мюнч, член команды Oracle ACE

В приложениях, работающих с большими объемами данных, часто требуется, чтобы пользователи выбирали значения из так называемых списков выбора. Во многих случаях список допустимых значений, выбираемых для одного поля, зависит от выбора, сделанного пользователем в другом поле. Например, в приложении для глобальной коммерции пользователь может сначала выбрать страну и тем самым дать приложению указание отобразить список продуктов для продажи в этой конкретной стране.

Возможность упрощения создания списков значений (List of Value - LOV) для поддержания этого вида сценариев стала одним из самых частых расширенных вопросов по Oracle Application Development Framework (Oracle ADF) 11g (инфраструктура разработки приложений Oracle11g). В этой колонке я хочу показать, насколько простой стала эта задача. Для этого я хочу бросить беглый взгляд на предстоящий в скором будущем выпуск Oracle JDeveloper/Oracle ADF 11g и использовать его для построения LOV, включая списки с каскадными зависимостями данных.

Для дальшего продвижения надо загрузить и установить выпуск Oracle JDeveloper 11.1.1.0 Technology Preview, который можно скачать с сайта http://www.oracle.com/technology/products/jdev/11. Как и в других моих учебных статьях по инфраструктурам, необходимо иметь экземпляр Oracle Database, в котором существует используемая по умолчанию схема SCOTT.

Настройка модели

Начнем с создания нового приложения в Oracle JDeveloper. Если у вас нет никаких других открытых приложений, кликните по узлу New Application, который появляется в Application Navigator. Если же имеются другие открытые приложения, выберите из списка приложений в верхней части Application Navigator узел New Application. В любом случае появится диалоговое окно Create Application. Введите в поле New Application значение OraMagDemo, а в поле Prefix New Application - oramag.lovdemo. Для поля Application Template выберите значение Web Application [ADF Faces, ADF Page Flow, ADF BC], а затем кликните по OK, чтобы создать приложение.

Затем построим наше приложение-стартер (как и в предыдущих статьях об инфраструктурах), создавая по умолчанию бизнес-компоненты для таблиц DEPT и EMP в учетной записи SCOTT. Для этого кликните правой кнопкой мыши по Model project в Application Navigator и выберите New. В появляющемся диалоговом окне New Gallery выберите категорию ADF Business Components (в группировке Business Tier) и дважды кликните по Business Components в мастере таблиц. Когда появится окно диалога Initialize Business Components Project, нажмите на New для создания нового подключения базы данных на уровне приложения. В диалоговом окне Create Database Connection введите для имени подключения значение Scott, введите соответствующее имя пользователя и пароль для схемы SCOTT, а также введите имя хоста и идентификатор экземпляра (SID) для подключения к вашей базе данных. Заметим, что в Oracle JDeveloper 11g значение SID по умолчанию теперь равно XE. Это значение по умолчанию будет работать, если вы будете использовать Oracle Database Express Edition, но надо заменить его правильным SID (например, ORCL), если будет использоваться другой выпуск Oracle Database. Кликните по OK, чтобы создать подключение базы данных, затем снова нажмите OK, чтобы запустить Business Components из мастера таблиц. Как и прежде пройдите мастер, чтобы определить объекты-сущности из таблиц DEPT и EMP, DeptView и EmpView, обновляемые объекты отображаемого элемента для каждого соответствующего объекта-сущности и модуль приложения по имени HRModule. Как и прежде не утруждайте себя созданием каких бы то ни было объектов отображаемого элемента только для чтения или диаграммы бизнес-компонентов.

При определении списка значений в Oracle JDeveloper вы ссылаетесь на объект отображаемого элемента, который предлагает источник допустимых выборов для вашего списка. В рассматриваемом примере нужно создать два списка значений. Сначала требуется определить список значений для атрибута Deptno созданного выше объекта отображаемого элемента EmpView, используя объект отображаемого элемента DeptView как источник для списка допустимых отделов. Затем следует построить более сложный список значений для атрибута Mgr. Этот список будет ссылаться на новый объект отображаемого элемента, получающийся в результате запроса к отфильтрованному списку тех служащих, которые могут быть использованы в качестве менеджеров для выбранного служащего. В этом упражнении давайте предположим, что список доступных менеджеров для данного служащего будет списком других служащих того же самого отдела, наряду с любым служащим, не имеющим менеджера (например, президентом).

Чтобы определить этот новый объект отображаемого элемента, кликните правой кнопкой мыши по Model project в панели Application Navigator и выберите New. Выберите категорию ADF Business Components и дважды кликните по компоненту View Object, чтобы открыть мастер Create View Object. В панели Name замените название на ManagerListForDepartment и кликните по Next. В панели Entity Objects (объекты-сущности) выберите из списка Available объект-сущность Emp, кликните по кнопке Add (стрелка вправо) и кликните по Next. В панели Attributes включите атрибуты Empno и Ename и дважды кликните по Next, чтобы перейти к панели SQL Statement. В поле Where добавьте следующую фразу: (DEPTNO =:CurrentDept OR MGR IS NULL) AND EMPNO! =:CurrentEmp. Эта фраза служит фильтром списка служащих для генерации того набора, который был определен выше. Кликните по Next, чтобы перейти к панели Bind Variables. В этой панели создайте две новые переменные с именами CurrentDept и CurrentEmp (на обе из которых имеются ссылки во фразе WHERE) и назначьте им тип Number. Теперь кликните по Finish, чтобы создать объект отображаемого элемента.

Определение списков значений

Теперь, когда созданы объекты уровня основной модели, на следующем шаге необходимо сконфигурировать эти два списка значений. В Oracle ADF 11g можно конфигурировать список значений как декларативную опцию любого атрибута объекта отображаемого элемента. Определение списка значений на уровне модели гарантирует, что вместо его определения в рамках пользовательского интерфейса (UI), UI представит список значений правильно и непротиворечиво, независимо от той конкретной клиентской UI-технологии с поддержкой Oracle ADF, которую вы решили использовать.

В Application Navigator, дважды кликнув по EmpView, откройте редактор объекта отображаемого элемента. Отметим, что в Oracle JDeveloper 11g редакторы бизнес-компонентов появляются как закладки внутри основной области редактора, а не в модальном диалоговом окне. Выберите категорию Attributes по левому краю страницы редактора и выберите атрибут Deptno в таблице, которая появляется в разделе Attributes в верхней части фрейма редактора. Найдите ниже заголовок раздела List of Values: Deptno и кликните по зеленому значку "плюс" справа от заголовка, чтобы создать для атрибута Deptno список значений. Когда появится диалоговое окно List of Values, кликните по зеленому значку "плюс" в разделе List Data Source, чтобы добавить источник данных, который и будет поставлять список допустимых выборов значения этого атрибута. В появляющемся диалоговом окне View Accessors выберите объект отображаемого элемента DeptView в списке Available View Objects с левой стороны и кликните по кнопке Add Instance (стрелка вправо), чтобы добавить новое средство доступа к представлению с именем DeptView1 для выбранного объекта отображаемого элемента. Затем нажмите на OK. Отметьте, что недавно добавленный источник данных средства доступа к представлениям DeptView1 появляется в отображении структуры данных List Data Source в диалоговом окне List of Values. Раскройте его и выберите атрибут Deptno. Отметим, что раздел List Return Value обновляется, чтобы показать, как атрибуты в источнике данных списка будут назначены атрибутам в основном объекте отображаемого элемента, когда пользователь делает выбор из списка. В этом примере вам не потребуется изменять этот раздел, но отметьте, что вы можете в вашем приложении отобразить дополнительные атрибуты возвращаемого значения, добавляя их к этому списку.

Перед тем как выйти из диалогового окна List of Values, кликните по кнопке Edit List UI Hints... (в верхней части окна), чтобы открыть диалоговое окно List UI Hints. Эти параметры настройки предлагают информацию, которая определяет то, как именно список должен быть отображен в пользовательском интерфейсе. Отметим, что используемый по умолчанию тип списка указывает на стиль показа Choice List. Для этого простого примера можно по умолчанию использовать этот тип списка, но если кликнуть по списку, то можно увидеть и другие типы элементов управления списком для применения в конкретных приложениях. В разделе Display Attributes выберите из списка Available атрибут Dname и кликните по кнопке Add (стрелка вправо), чтобы добавить его к списку выбранных атрибутов. Такой выбор указывает на то, что вы хотите, чтобы пользователь видел в списке название отдела, а не его номер. Наконец, кликните по OK, чтобы закрыть диалоговое окно List UI Hints и еще раз кликните по OK, чтобы закрыть диалоговое окно List of Values.

Затем сконфигурируем список значений для атрибута Mgr. Как и прежде, выберите этот атрибут в разделе Attributes редактора объекта отображаемого элемента для объекта-сущности EmpView. Затем кликните по зеленому значку "плюс" в заголовке раздела List of Values: Mgr. Когда появится диалоговое окно List of Values, кликните по зеленому значку "плюс" в разделе List Data Source, чтобы добавить новый источник данных, который будет поставлять список допустимых выборов для значения этого атрибута. В диалоговом окне View Accessors выберите объект отображаемого элемента ManagerListForDepartment из списка Available View Objects в левой стороне и кликните по кнопке Add Instance (стрелка вправо), чтобы добавить новое средство доступа к представлению с именем ManagerListForDepartment1 для выбранного объекта отображаемого элемента.

Поскольку у этого объекта отображаемого элемента имеются переменные связывания, вы должны конфигурировать, как эти значения связывания получают свои значения. Для этого удостоверьтесь, что выбрано средство доступа к представлению ManagerListForDepartment1, и кликните по кнопке Edit. В диалоговом окне Edit View Accessor отметьте, что имена переменных связывания CurrentDept и CurrentEmp появляются в разделе Bind Parameter Values. Сделайте отметку во флажке Row-level bind values exist и дважды кликните по столбцу Value для переменной связывания CurrentEmp в таблице. Если надо назначить значение этой переменной связывания значение атрибута Empno в текущей строке, то введите в эту ячейку выражение Empno (с учетом регистра). Точно так же дважды кликните по столбцу значения для переменной связывания CurrentDept и введите выражение Deptno, чтобы назначить значение этой переменной связывания значением атрибута Deptno для текущей строки. Наконец, кликните по OK, чтобы закрыть диалоговое окно Edit View Accessor и снова кликните по OK, чтобы закрыть диалоговое окно View Accessors. В диалоговом окне List of Values раскройте ManagerListForDepartment1 в дереве List Data Source и выберите его атрибут Empno. Затем, как и прежде, кликните по Edit UI Hints, чтобы сконфигурировать Ename как атрибут отображения списка. Кликните по OK, чтобы закрыть диалоговое окно List UI Hints и еще раз кликните по OK, чтобы закрыть диалоговое окно List of Values.

Тестирование ваших списков значений

Вы можете использовать усовершенствованный браузер Oracle ADF 11g Oracle Business Component Browser, чтобы немедленно проверить LOV, который только что сконфигурировали. Чтобы выполнить модуль приложения в Oracle Business Component Browser, щелкните правой кнопкой мыши по компоненту HRModule в Application Navigator и выберите Run. После того, как в появившемся диалоговом окне вы кликнете по Connect, появится окно Oracle Business Component Browser. Дважды кликните по экземпляру объекта отображаемого элемента EmpView1, чтобы увидеть его данные. Как показано на рисунке 1, оба поля (и Mgr, и Deptno) имеют вид списка. Если вы выберете список Mgr, то вы должны обратить внимание, что в список включены служащие текущего отдела (исключая текущего служащего) и служащие типа KING, у которых нет менеджера. Когда вы переместитесь к другим строкам результирующего набора, вы сможете увидеть, что списки автоматически изменяются, чтобы отобразить текущий отдел для текущего служащего. Если же для служащего изменить отдел, выбирая из списка другое название отдела, то вы должны обратить внимание, что, когда вы выбираете список Mgr, набор выборов будет автоматически обновлен, чтобы отобразить новый выбранный отдел.

Рис. 1: Тестирование объекта отображаемого элемента с каскадными списками значений

После завершения эксперимента выберите File -> Exit, чтобы выйти из Oracle Business Component Browser. Поскольку в Oracle JDeveloper 11g с Oracle ADF Swing была осуществлена новая реализация Oracle Business Component Browser, этот пример служит также живой иллюстрацией того, как приложения Oracle ADF Swing могут автоматически использовать определенные моделью LOV.

Использование в технологии JavaServer Faces списков значений

Теперь, когда сконфигурированы и протестированы LOV для объекта отображаемого элемента EmpView, посмотрим, насколько просто можно использовать их в Web-страницах с поддержкой Ajax, применяя технологию JavaServer Faces (JSF). Находясь в Application Navigator, раскройте проект ViewController и входящую в него папку Web Content, чтобы отобразить папку Page Flows проекта. В этой папке дважды кликните по узлу adfc-config, чтобы открыть блок-схему страницы. Затем перейдите в палитру Components и найдите раздел Activities. В этом разделе перетащите компонент View и опустите его на блок-схему страницы. Когда на диаграмме появится новое представление, переименуйте компонент Employees и нажмите ENTER. Чтобы создать для этого представления страницу JSF, дважды кликните по значку, представляющему новое, представление. Когда появится диалоговое окно JSP Create JSF, кликните по OK, чтобы создать страницу Employees.jspx, используя настройки по умолчанию. В визуальном проектировщике страниц появится новая Web-страница.

На следующем шаге следует опустить собранные данные на страницу. Сначала взгляните на Application Navigator и обратите внимание, что фрейм сгруппирован по нескольким разделам, каждый из которых содержит именованную область заголовка и стрелку, чтобы дать возможность раскрыть или свернуть контент раздела. Под разделом Projects в Application Navigator находится раздел Data Controls. Раскройте этот раздел, а затем раскройте HRModuleDataControl, чтобы показать EmpView1 и коллекции данных DeptView1, которые оно содержит. Перетащите коллекцию данных EmpView1 и опустите ее в центральную часть визуального редактора страниц JSF. Из меню Create выберите Forms -> ADF Form для создания пригодной для редактирования формы, показывающей данные EmpView1. В появившемся диалоговом окне Edit Form Fields обратите внимание на то, что значение Component To Use для атрибутов Mgr и Deptno установлено на ADF Select One Choice. По умолчанию Oracle JDeveloper выбирает эти значения компонентов UI, как результат сконфигурированной ранее при определении списка значений для этих двух атрибутов подсказки List type UI. Сделайте отметку в окошке метки Include Navigation Controls и кликните по OK, чтобы создать форму. Отметьте, что, как и ожидалось, поля Mgr и Deptno имеют вид списков.

Для традиционной Web-страницы, в том случае, если пользователь делает изменение (например, выбирает отдел из списка), эти изменения не вступают в силу до тех пор, пока этот человек не кликнет по кнопке Submit, чтобы послать результаты выполнения формы на сервер. Однако компоненты JSF для Oracle ADF Faces облегчают построение в большей степени интерактивных Web-страниц. Например, вы можете разрешить списку Deptno автоматически представлять изменения на сервер всякий раз, когда конечный пользователь изменяет какое-либо значение, просто устанавливая свойство AutoSubmit на значение TRUE. Чтобы сделать так, выберите View -> Property Inspector из главного меню Oracle JDeveloper, чтобы показать Property Inspector. Затем выберите в визуальном редакторе список Deptno. В окне Property Inspector обратите внимание на то, что свойства сгруппированы по категориям, типа Common, Data, Appearance, Style и Behavior. Кликните по категории Behavior и установите свойство AutoSubmit на TRUE.

Поскольку список значений для атрибута Mgr сконфигурирован, как зависящий от текущего значения атрибута Deptno, нужно выполнить два дополнительных декларативных шага, чтобы обеспечить принудительное немедленное обновление списка Mgr для отражения изменений в списке менеджеров. На первом шаге необходимо назначить уникальное имя для идентификации списка Deptno для страницы. Чтобы сделать это, выберите в Property Inspector категорию Common, напечатайте в поле Id имя DeptList и нажмите ENTER. Второй шаг должен сконфигурировать список Mgr, чтобы он обновлялся всякий раз, когда изменяется значение компонента Deptno. Для этого выберите в визуальном редакторе список Mgr. Затем выберите в Property Inspector категорию Behavior, наберите то же самое имя DeptList в поле PartialTriggers и нажмите ENTER.

Теперь пришло время выполнить страницу. Кликните правой кнопкой мыши по странице Employees.jspx в Application Navigator и выберите Run. Утилита Oracle JDeveloper запустит встроенные контейнеры Oracle для сервера приложений J2EE (OC4J) и откроет страницу в используемом вами по умолчанию браузере. Если предположить, что используется Internet Explorer 7.0 или Mozilla Firefox 2.0.0.3 (или более поздние их версии), то вы увидите страницу, похожую на ту, что показана на рисунке 2. Чтобы проверить приложение, попробуйте выполнить те же самые шаги, которые вы проделывали ранее, используя Oracle Business Component Browser. Вы увидите, что когда вы перемещаетесь от строки к строке, декларативно сконфигурированные списки обновляются, отражая текущий выбор и набор допустимых выборов. А когда изменяется отдел для имеющегося служащего, список отбора Mgr немедленно обновляется, чтобы отобразить управляемый данными набор допустимых значений.

Рис. 2: Каскадный список значений для страницы JSF

В этой колонке я показал как, используя несколько декларативных параметров настройки, можно конфигурировать и простые, и каскадные списки значений и использовать их на Web-страницах, не прибегая ни к какому программированию. Этот пример выдвигает на передний план первую в ряду новых декларативных возможностей, которые должны появиться в выпуске Oracle JDeveloper/Oracle ADF 11g. В следующих колонках я раскажу о многих других подобных опциях. Для получения дополнительной информации о новых возможностях Oracle JDeveloper/Oracle ADF 11g советую обратиться к http://otn.oracle.com/products/jdev/11.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=21318