
Август 2005
Профессионалу разработчику
Стив Мюнх
Просмотр и редактирование данных
(Browsing and Editing Data by Steve Muench)
Источник: журнал Oracle Magaine, no.4, 2005, http://www.oracle.com/technology/oramag/oracle/05-jul/o45frame.html
Перенесите свой путь в Web.
Ранее (см., например, ссылку во врезке) я уже рассказывал о различных компонентах, которые предоставляет Oracle ADF (Application Development Framework – Структура Разработки приложений), чтобы упростить процесс создания бизнес-сервисов, основанных на базе данных. Модуль приложения (application module) обеспечивает использование клиентов транзакционных компонентов для просмотра и изменения данных объекта представления (view object), объект представления выполняет SQL-запросы и взаимодействует с объектами сущностей для обработки обновлений, а объект сущности (entity object) инкапсулирует данные бизнес-области и проверки для строк в таблице.
Эта статья позволит нам лучше понять компоненты доступа к данным Oracle ADF. Для этого мы создадим простое приложение с возможностью просмотра и редактирования, используя данные, незащищенные модулем приложения. (Обратите внимание, что шаги в этой статье используют Oracle JDeveloper 10g, Release 10.1.2, который доступен на OTN.)
Просмотр данных страница за страницей
Для построения приложения начнем с данных из тестовой таблицы SCOTT.EMP и созданного в Oracle JDeveloper 10g соединения с тестовой базой данных. Затем сгенерируем объект сущности для таблицы EMP, соответствующий обновляемому объекту представления, и модуль приложения, с которым будут работать клиенты. Затем перейдем к выводу этих данных на Web-страницу.
Запустив Oracle JDeveloper 10g и определив соединение для пользователя SCOTT, создадим новую рабочую область приложения. Выберите File -> New, затем в диалоговом окне New Gallery выберите Application Workspace из категории General. В диалоговом окне Create Application Workspace введите имя приложения, выберите шаблон приложения Web Application [Default] и нажмите OK.
Далее, в навигаторе приложений (Applications Navigator) щелкните правой кнопкой мыши по вновь созданному проекту Model и выберите New из контекстного меню. В диалоговом окне New Gallery разверните категорию (Business Tier) Business Components и дважды щелкните мышью на Business Components from Tables. В диалоговом окне Business Components Project Initialization выберите соединение с базой данных SCOTT и нажмите OK. После приветственной страницы необходимо последовательно пройти по четырем “мастер”- страницам для создания бизнес-компонентов. На первой странице выберите объект сущности Emp для таблицы EMP. На второй странице выберите обновляемый объект представления EmpView для объекта сущности Emp. На третьей странице нажмите Next, чтобы пропустить создание любых представлений только_для_чтения. На четвертой странице назовите модуль приложения HRModule. Наконец, нажмите Finish, чтобы сгенерировать объекты.
Создав простые прикладные компоненты приложения, сконцентрируемся на интерфейсе. Начнем с создания страницы, показывающей данные из объекта представления EmpView в HTML таблице. В навигаторе приложений нажмите правую кнопку мыши на проекте ViewController и выберите из контекстного меню пункт Open Struts Page Flow Diagram. Диаграмма потоков страниц (page flow diagram), которая появляется, показывает все страницы на нашем Web-уровне, а также переходы между этими страницами. Поскольку изначально диаграмма пустая, необходимо создать на ней новую страницу, чтобы начать работать.
Из палитры Component перетащите компонент Data Page на диаграмму потоков страниц. Измените имя страницы под иконкой, которая появляется, на /BrowseEmps. Важно, чтобы имя страницы начиналось с символа “/”; в противном случае при попытке запустить страницу вы получите сообщение об ошибке “неверный путь”.
Для редактирования содержимого страницы дважды щелкните по ней, чтобы открыть визуальный конструктор. Когда вы сделаете это в первый раз, появится диалоговое окно Create Page. Выберите /BrowseEmps.uix из выпадающего списка имен страниц и нажмите OK. Появится страница конструктора.
Нажмите на закладку Data Controls под палитрами, чтобы перейти к палитре Data Control и разверните узел HRModuleDataControl, чтобы увидеть источник данных EmpView1. Элемент данных (data control) – это абстракция для любого бизнес сервиса, реализованного модулем приложения, Web-сервисом, пользовательским Java-классом, или каким-либо иным способом. Палитра Data Control показывает источники данных и операции, которые поддерживает каждый сервис.
Для того, чтобы поместить данные EmpView на страницу BrowseEmps, перетащите источник данных EmpView1 из окна палитры Data Control и поместите его на страницу. Запустив приложение, можно немедленно увидеть результаты. Для этого вернитесь в диаграмму потоков страниц, щелкните правой кнопкой мыши по иконке страницы /BrowseEmps и выберите Run из контекстного меню. Oracle JDeveloper 10g стартует встроенные контейнеры Oracle Application Server для J2EE (OC4J) сервера и запускает ваш Web-браузер по умолчанию. Когда страница появится, вы увидите данные о сотрудниках, представленные в виде таблицы, что позволяет пользователям перемещаться по данным со страницы на страницу, сортировать по столбцу, щелкнув по заголовку столбца, и выбирать нужную строку.
Улучшение пользовательского Web-интерфейса
При тестировании просматриваемой страницы вы заметите, что первая страница показывает строки с 1 по 10, как и ожидалось, а вторая страница показывает строки с 5 по 14, вместо того, чтобы показывать строки с 11 по 14. Это происходит потому, что по умолчанию объект представления показывает последнюю страницу результатов заполненной целиком. Это поведение легко отключить, сделав так, чтобы переход от страницы к странице работал так, как ожидает Web-пользователь.
В проекте Model дважды щелкните по объекту представления EmpView и выберите панель настройки (Tuning) в окне редактора объекта представления (View Object Editor). Просто отключите свойство "Fill Last Page of Rows when Paging through Rowset", чтобы отменить поведение по умолчанию, и нажмите OK для сохранения изменений.
Далее, настройте два свойства модуля приложения, чтобы следовать правилам хорошего тона, принятым в Web-приложениях. В навигаторе приложений щелкните правой кнопкой мыши по компоненту HRModule и выберите из контекстного меню пункт Configurations. Щелкните по Edit, чтобы изменить набор конфигурационных свойств HRModuleLocal и выберите закладку Properties в новом окне. Найдите в алфавитном списке свойство jbo.locking.mode, и измените его значение с pessimistic на optimistic, чтобы избежать удержания блокировок Web-сессией в то время, пока пользователь занят другими делами. Затем выберите закладку Pooling and Scalability. Поскольку вы не работаете в мультисерверной конфигурации, где имеет смысл отказоустойчивость приложения, можно улучшить производительность, отключив свойство "Failover Transaction State Upon Managed Release". Дважды нажмите OK, чтобы закрыть редактор конфигурации.
Затем, измените BrowseEmps так, чтобы показывалось 5 строк вместо 10, по умолчанию. Перейдите из диаграммы потоков страниц к окну визуального конструктора для страницы BrowseEmps. Обратите внимание, что наверху страницы Structure можно выбрать из трех мини закладок, которые показывают структурную информацию, связанную со страницей. Если подвести курсор к этим трем мини закладкам, можно увидеть, что они называются XML Structure, Design Structure, и UI Model. Выберите закладку UI Model, чтобы увидеть данные, связанные с текущей страницей. Щелкните по иконке EmpView1Iterator и посмотрите на инспектор свойств (Property Inspector). Обратите внимание, что у EmpView1Iterator есть свойство Range Size, которое имеет значение 10. Итератор отслеживает текущую запись в конкретном источнике данных и позволяет пользователю перемещаться вверх и вниз по строкам этого источника данных. Размер области (range size) итератора определяет, сколько записей показывается на каждой странице при пролистывании. Измените значение этого свойства в инспекторе свойств с 10 на 5.
Теперь, закройте свой браузер, чтобы очистить данные (cookie), существующие в течении сессии, которые были установлены свойством отказоустойчивости во время последнего запуска, и запустите вновь страницу BrowseEmps из диаграммы потоков страниц, как раньше. На этот раз вы увидите пять строк на странице, а на последней странице – записи с 11 по 14, как и ожидалось.
Создание формы для ввода
Теперь повторим шаги, выполненные ранее, чтобы создать вторую страницу, которая даст пользователям возможность редактировать информацию о сотрудниках. Вновь в диаграмме потоков страниц перетащите из палитры Component компонент Data Page и назовите его /EditEmp. Дважды щелкните по новой странице, и выберите /EditEmp.uix из диалогового окна создания страницы. В визуальном конструкторе для страницы EditEmp перейдите к палитре Data Control и найдите внизу выпадающий список "Drag and Drop As:". Измените значение по умолчанию Read-Only Table на Input Form (With Navigation). Затем перетащите источник данных EmpView1 и поместите его на странице.
Удалите кнопку Submit, выбрав ее в визуальном редакторе и нажав клавишу Delete. Как упоминалось раньше, кроме источников данных, палитра Data Control показывает также операции, поддерживаемые каждым бизнес сервисом. Разверните папку Operations, которая является непосредственным потомком HRModuleDataControl, перетащите операцию Commit в форму и поместите ее справа от существующей кнопки Last. По умолчанию кнопка Commit будет недоступна до тех пор, пока пользователь не внесет какие-либо изменения, но ее легко можно сделать постоянно доступной. В визуальном редакторе выберите кнопку Commit, найдите свойство disabled в инспекторе свойств, и установите его значение в false. (Возможно, вам придется сначала установить значение в true, а затем в false.) Затем измените значение свойства event кнопки Commit с generic name action на Commit, чтобы оно соответствовало имени встроенной операции Commit. Наконец, перейдите к окну Structure, выберите мини-закладку Design Structure и выберите компонент form (который является непосредственным потомком body). В инспекторе свойств измените значение свойства form's method с GET на POST. После сохранения изменений можно запустить страницу EditEmp из диаграммы потоков страниц, чтобы проверить ее функциональность. Например, попытайтесь перейти на эту страницу и сохранить измененное значение зарплаты.
Соединение страниц
До сих пор мы тестировали наши две страницы независимо, но они будут более полезны конечному пользователю, если мы соединим их, так чтобы просмотр, выбор и редактирование были одной плавной последовательностью шагов. Поскольку предыдущие задания выполнялись, в основном, с использованием перетаскивания и изменения некоторых свойств, вы можете ожидать, что соединение страниц будет таким же простым. И вы будете правы!
Вновь используя диаграмму потоков страниц, можно дать возможность странице BrowseEmps вызывать страницу EditEmp. В палитре Component выберите компонент Forward и соедините страницу BrowseEmps со страницей EditEmp, щелкнув сначала по BrowseEmps, а затем по EditEmp. Появится стрелка, соединяющая иконки страниц, которая отражает этот вызов. Поскольку необходимо также, чтобы из страницы EditEmp можно было вернуться к странице просмотра, когда пользователи сохраняют свои изменения, повторите процесс, чтобы соединить страницу EditEmp с BrowseEmps с помощью другого компонента Forward. На этот раз, щелкнув по EditEmp, обратите внимание, что можно управлять направлением линии, щелкая по поверхности диаграммы несколько раз, чтобы указать “маршрут” своей линии, прежде чем окончательно щелкнуть по иконке BrowseEmps для завершения операции. Всегда можно добавить дополнительные точки на линии на диаграмме, удерживая клавишу Shift и щелкнув мышью по пятнышку в середине линии, на которой нужно добавить точки. Можно удалить существующую точку, если она вам не нужна, щелкнув по ней мышью и удерживая клавишу Shift. По умолчанию диаграмма пытается автоматически выпрямить линии, но если вы хотите, чтобы линии оставались точно такими, как вы их создали, щелкните правой кнопкой мыши по диаграмме, выберите из контекстного меню пункт Display Properties, и отключите эту настройку.
Вернемся в визуальный конструктор для страницы BrowseEmps, пора добавить кнопку Edit для перемещения на страницу EditEmp. Перетащите submitButton из палитры компонентов и поместите его между существующими словами Select and и управлением навигацией по страницам в области заголовка таблицы, непосредственно над столбцом Ename. В инспекторе свойств укажите значение Edit для свойства text, и значение Edit для свойства event.
Теперь, у нас есть кнопка Edit на странице BrowseEmps, которая вызывает событие с именем Edit, и кнопка Commit на странице EditEmp, которая вызывает событие Commit. Последний шаг – это переименование линий между нашими страницами таким образом, чтобы их имена соответствовали именам событий, вызываемым при каждой навигации. Поэтому, вновь в диаграмме потоков страниц дважды щелкните по метке по умолчанию success на стрелке от BrowseEmps к EditEmp, и измените имя на Edit, чтобы оно соответствовало событию Edit кнопки Edit. Повторите эти шаги, чтобы переименовать стрелку от EditEmp к BrowseEmps с success на Commit, чтобы оно соответствовало событию Commit кнопки Commit. Этот последний штрих завершает процесс создания страниц редактирования и просмотра, и теперь можно запустить страницу из диаграммы потоков страниц BrowseEmps и гордо поиграть с этим маленьким приложением, которое было так быстро смонтировано.
В качестве дополнительного упражнения вы можете попытаться добавить некоторые декларативные правила проверки для объекта сущности Emp в проекте Model. Например, попытайтесь добавить проверку диапазона для атрибута Sal, и перезапустите приложение. На странице редактирования попытайтесь ввести неверное значение зарплаты, и вы увидите, что Oracle ADF предоставляет даже больше, чем функциональность по умолчанию, когда сообщения об ошибках последовательно появляются в информационной области наверху страницы.
Заключение
Надеюсь, что этот стремительный обзор конструирования простых ADF Web-приложений помог вам понять визуальные и декларативные возможности, которые предлагают Oracle JDeveloper 10g и Oracle ADF для быстрого построения Web-приложений, основанных на базах данных. Следующая статья будет посвящена расширению генератора приложений для Oracle JDeveloper 10g - Oracle JHeadstart 10g для Oracle ADF.
Стив Мюнх – менеджер-консультант по продукту для Oracle JDeveloper. За время его более чем пятнадцатилетней работы в Oracle, он поддерживал и разрабатывал Oracle инструменты и XML технологии, и продолжает пропагандировать их. Он является автором книги “Building Oracle XML Applications” (“Построение Oracle XML приложений”) (O'Reilly & Associates, 2000), участвует в “tips and tricks” (“подсказки и хитрости”) на OTN и в “Dive into BC4J and ADF” (“Погружение в BC4J и ADF”).
|