основы разработки приложений lotus domino расширенный
Книга по Lotus. Разработка приложений в среде Domino 7: Глава1
Как мы уже говорили, в следующих главах книги будут более подробно рассматриваться новейшие возможности и функции разработки приложений, появившиеся в Lotus Domino 7. Для примера в книге будут приведены приложения, чтобы показать, как использовать каждую новую функцию, появившуюся в Lotus Domino 7 применительно к деятельности компании ITSO Electronics. Эти приложения можно загрузить с Web-сайта IBM Redbooks. Для получения более подробной информации см. приложение А, «Дополнительный материал».
Замечание. Эти приложения предназначены только лишь для того, чтобы дать представление о новых возможностях и функциях разработки приложений, появившихся в Lotus Domino 7. Они не предназначены для использования при налаживании производства. |
Вымышленная компания ITSO Electronics использует Lotus Domino для поддержки работы отдела продаж. Через несколько лет они внедрили приложение, отслеживающее продажи для того, чтобы помочь сотрудникам отдела продаж взаимодействовать со своими покупателями. Доступ к базе данных можно получить с помощью клиента Lotus Notes или с помощью Web-браузера.
Существуют две основные базы данных в приложении, отслеживающем продажи ITSO Electronics: база данных Sales (Продажи) и база данных Customers (Покупатели). Рис. 1.1 и 1.2 иллюстрируют пользовательский интерфейс, который применяется при доступе из Lotus Notes. Третья база данных, Products (Продукты), используется для ключевых слов продуктов. Напрямую она не доступна для персонала. Наконец четвертая база данных была добавлена к существующей среде приложения для элементов Web-сервисов.
Замечание. Все примеры сценариев баз данных, содержащих новые функции и описанные в данной книге, вложены в приложение А, «Дополнительный материал», для удобства изучения. |
Замечание. Для применения Web-сервисов не требуется использование отдельной базы данных Lotus Domino, потому что Web-сервисы могут быть добавлены или объединены с любой базой данных Domino. Для наглядности мы использовали в данной книге отдельную базу данных Web Services. Данное решение объясняется тем, что оно позволяет упростить и изолировать информацию Web-сервисов. |
Рис. 1.3 иллюстрирует архитектуру приложения ITSO Electronics, в которой базы Sales, Customers, Products и Web Services располагаются на сервере DB2 UDB, но доступ к которым осуществляется через сервер Lotus Domino.
Мы представляем вам разработку приложения ITSO Electronics в Lotus Domino 7 в четырех главах, описание которых идет по следующему принципу.
В гл. 2, «Использование интеграции DB2 для улучшения приложения ITSO Electronics», мы будем изучать расширение интеграции DB2 с Lotus Domino и то, как возможности хранения данных и взаимодействия смогут сделать приложение ITSO Electronics, написанное в среде Lotus Domino, значительно более мощным и функциональным. И, что куда более важно, вы поймете, как самим сделать свое приложение намного более функциональным. Вопреки исторически сложившимся возможностям интеграции реляционных баз данных, используя Lotus Enterprise IntegratorO, мы исследуем достоинства архитектуры DB2 в разработке приложений Lotus Domino. Мы обсудим, как подготовиться к интеграции DB2 и Lotus Domino, DB2 Access Views и Query Views, DB2 federation, а также коснемся вопросов безопасности интеграции хранения данных DB2 с Lotus Domino. Также в эту главу включены советы по диагностике при установке и конфигурировании среды DB2.
Web-сервисы можно считать, пожалуй, наиболее интересным дополнением, появившимся в инструментарии разработки приложений Lotus Domino, и в гл. 3, «Улучшение работы приложения ITSO Electronics с помощью Web-сервисов», мы приступим к обсуждению технологии Web-сервисов и того, как она позволяет увеличить возможности и доступ к приложению ITSO Electronics, сделанному в среде Lotus Domino. В то время как СОМ-интеграция предложила открытый доступ к Lotus Domino начиная с версий 5.0х, Web-сервисы перешагнули зависимость от модели доступа к данным, открыв разработчикам приложений Lotus Domino сервисную интеграцию. В этой главе мы займемся исследованием сервисно-ориентированной архитектуры (SOA) и тем, как Web-сервисы соответствуют плану SOA, а также уделим внимание языку описания Web-сервисов (WSDL), простому протоколу доступа к объектам (SOAP), процессу добавления элементов Web-сервисов к приложениям Lotus Domino, обращению с исключениями и ошибками, безопасностью и употреблению Web-сервисов.
В Lotus Domino 7 появилось несколько новых мощных элементов разработки приложений, которые мы будем обсуждать и демонстрировать в гл. 4, «Применение новых элементов разработки приложений в приложении ITSO Electronics», в которой мы будем улучшать приложение ITSO Electronics. Мы детально изучим добавления к языку формул, включая классы и объекты LotusScript и Java, а также действия, осуществляемые по щелчку правой кнопки мыши и возможности общих столбцов.
В гл. 5, «Диагностирование и исправление неполадок в приложении ITSO Electronics», речь пойдет о новейших инструментах диагностирования и отладки приложений в среде Lotus Domino 7. Используя приложение ITSO Electronics в качестве примера, мы изучим методы оптимизации кода вашего приложения Lotus Notes, дополнительные возможности отладки LotusScript, а также новые возможности отладки Java, включая удаленную отладку.
Основы разработки приложений lotus domino расширенный
Курс: Основы разработки приложений Lotus Domino (расширенный)
Описание курса:
Данный курс дает слушателям основные знания и навыки, необходимые для разработки приложений в Lotus Domino. После прохождения курса слушатель получит навыки и знания, необходимые для разработки приложений в Lotus Domino
Аудитория:
Курс предназначен для разработчиков, сотрудников службы технической поддержки, желающих приобрести, углубить или систематизировать знания и навыки разработки приложений для Lotus Notes
Необходимая подготовка:
Желательно иметь некоторый базовый объем знаний в Lotus Domino и опыт работы в области разработки программного обеспечения
После изучения курса слушатель будет уметь:
• Создавать базы данных в Lotus Domino
• Эффективно использовать среду разработки Lotus Domino Designer
• Эффективно использовать языки программирования для разработки приложений в Lotus Domino
• Использовать элементы дизайна в приложениях Lotus Domino
Описание курса:
Модуль 1. Изучение приложений в Lotus Domino
• История продукта Lotus Domino\Notes
• Изучение архитектуры Lotus Domino
• Типы клиентов
• Структура БД Domino
• Типы приложений часто реализуемых в Domino:
• Электронная почта/ электронная записная книжка, организатор личной информации
• Библиотеки документов
• Дискуссии
• Изучение интерфейса Lotus Domino Designer
• Запуск Lotus Domino Designer
• Определение основных областей и их предназначение в интерфейсе
• Папки и закладки
• Языки поддерживаемые и используемые в Domino
• Язык LotusScript
• Java
• JavaScript
• Критерий выбора языка
Модуль 2. Технология разработки приложений в Lotus Domino Designer
• Создание и тиражирование баз данных
• Создание новой, пустой БД в Lotus Domino
• Создание копии базы данных
• Создание базы по шаблону
• Безопасность приложений в Lotus Domino
• Уровни безопасности
• Управление доступом к БД и ролями
• Управление доступом к документам
• Обзор элементов дизайна
• Формы
• Представления и папки
• Агенты
• Навигационные структуры
• Страницы
• Разделяемые элементы: подформы, поля, столбцы, действия
• Библиотеки скриптов
• Ресурсы
Модуль 3. Разработка форм в Lotus Domino Designer
• Создание Форм
• Проектирование форм
• Свойства формы
• Оформление формы
• Использование подформ
• Добавление таблиц на форму
• Свойства таблиц
• Программная реализация таблиц
• Добавление полей на форму
• Поля
• Имена полей
• Типы данных
• Способы получения значений в поле
• Условия, соблюдаемые при проектировании полей, предопределенные имена полей
• Опции и условия скрытия
Модуль 4. Язык @-формул в Lotus Domino
• Общие сведения о языке @-формул
• Синтаксис языка формул
• Порядок вычисления формул полей, отработки событий на форме и полях
• Основные выражения на языке формул
• Типы данных в языке @-формул
Модуль 5. Разработка представлений в Lotus Domino Designer
• Создание представлений и папок
• Создание представления
• Свойства представлений
• Стандартные и календарные представления
• Добавление колонок в представление
• Способы добавления колонок
• Присваивание значения колонке
• Свойства колонок
• Организация документов в представлении
• Отбор документов
• Сортировка в колонках, опции сортировок
• Категоризация, общие правила оформления колонок с категоризацией
• Итоговых значение в представлениях
Модуль 6. Разработка агентов в Lotus Domino Designer
• Общие сведения об агентах
• Свойства агентов
• Триггеры агентов
• Запуск агентов по расписанию
• Безопасность агентов
Модуль 7. Оптимизация разработки и организация интерфейса приложения в Lotus Domino
• Многократное использование дизайна
• Подформы
• Общие поля
• Общие колонки
• Общие действия
• Библиотеки скриптов
• Организация навигации
• Использование рамочных структур
• Использование навигационных элементов
Модуль 8. Обзор языка LotusScript
• Язык LotusScript
• Объектная модель языка LotusScript
• Основные классы языка LotusScript
Основы разработки приложений lotus domino расширенный
Lotus Notes / Domino – прекрасная платформа для создания мощных корпоративных информационных систем, ориентированных на групповую работу с электронными документами. В своей работе над комплексной медицинской информационной системой «Кондопога» мы на основе тщательного анализа средств разработки и имеющихся на рынке СУБД выбрали Lotus Notes / Domino в качестве основы всей системы. Разработка осуществляется с 1999 года, за это время мы постепенно перешли с версии 4.6 на версию R 5, а затем – на R 6. В данный момент идет тестирование R 6.5 на совместимость с существующим ПО.
Однако, как и в любой информационной технологии, имеется ряд недостатков, с которыми приходится мириться и искать пути их преодоления. Основной их недостатков Lotus Notes / Domino для применения в медицинской сфере – это слабая поддержка таблиц в электронных документах. На практике даже с точки зрения пользователя встроенные в клиентское программное обеспечение Lotus Notes средства для работы с таблицами значительно уступают аналогичным инструментам в Microsoft Office. А с точки зрения инструментария разработчика средства для управления таблицами тем более являются малоэффективными. Некоторые изменения в этом направлении были сделаны в версии R 6 Domino, однако и они являются недостаточными. Фактически, в Lotus Notes таблица, как средство отображения, управления и хранения информации, отсутствует как класс. Но это и понятно – ведь Lotus Notes – это, прежде всего, объектно-ориентированная СУБД, предназначенная для групповой работы над документами.
Одним из серьезных препятствий на использовании Delphi является задача совместного доступа как к информации в реляционной базе данных, так и для доступа к базам данных Lotus Notes / Domino. Для решения этой задачи имеется несколько подходов:
Первый подход подразумевает использование компонентов для доступа к Lotus Notes. При этом программы могут обращаться к базам данных и документам, используя инкапсулированные в эти компоненты свойства и методы. Мы апробировали имевшиеся в свое время предложения и не нашли решения, полностью удовлетворяющего наши требования. Использование компонентов вносило нестабильность в создаваемые приложения, которые нам не удавалось быстро локализовать и исправить, т.к. либо с разработчиками не возможно было наладить контакт, либо тех.поддержка требовала дополнительных финансовых затрат и времени.
Второй подход также, к сожалению, не отвечал требованиям. При этом Notes SQL фактически эмулирует обращение к базе данных Lotus Notes, как к обычной реляционной таблице. Тестирование различных версий Notes SQL показала нестабильность этого программного обеспечения. Особенно ярко недостатки Notes SQL проявлялись при обработке больших объемов информации – в случайные моменты работы программы возникали неустранимые ошибки, которые приводили к полном прекращению работы программ.
Третий подход является более предпочтительным, однако и от него мы со временем отошли в силу его трудоемкости, большой сложно написания программы, массы низкоуровневого кода и высоких требований к знанию внутренний архитектуры Lotus Notes.
Первое время доступ к Lotus Notes посредством OLE казался нам неприемлемым вариантом с точки зрения скорости работы. Однако наш 5-летний опыт работы доказал высокую устойчивость программ на основе этого подхода и вполне приемлемую скорость обработки информации.
Далее мы на примерах покажем, как написать приложение в среде Borland Delphi для баз данных Lotus Notes.
1. Инициализация сессии.
Основной принцип в написании программ состоит в использовании встроенных классов Lotus Notes в коде программ. Для этого в первую очередь необходимо инициализировать сессию связи с Lotus Notes. Для этого требуется, чтобы клиентское программное обеспечение Lotus Notes было инсталлировано на каждом компьютере, использующим программу и подключено к одному или нескольким серверам Domino.
В разделе public объявим переменные, общие для всего приложения:
Теперь необходимо написать обработчик события OnCreate главной формы приложения, в котором мы должны создать объект NotesSession, чтобы, используя его в дальнейшем, иметь возможность в рамках одного приложения обращаться сразу к нескольким базам данных, серверам, документам, представлениям и т.д. Обработчик должен иметь следующий вид:
Следует иметь в виду, что в рамках одного приложения следует только один раз инициализировать объект Notessession, т.к. каждая последующая инициализация будет закрывать предыдущую сессию, а все объекты, созданные на основе этой сессии, потеряют свою актуальность и их обработка будет невозможна.
2. Доступ к базе данных
После того, как мы инициализировали сессию связи с Lotus Notes, мы можем обращаться к любым серверам Lotus Domino и базам данных на них. Принципиально получить доступ к БД Lotus Notes можно 2 способами – либо обратиться к текущей базе данных, открытой в Lotus Notes, либо вызвать соответствующий метод NotesSession и открыть любую другую БД [3]. Последний случая является наиболее востребованным, поэтому рассмотрим его:
Мы в своей работе используем реестр Windows, в котором храним имя сервера Domino по умолчанию, к которому подключаются приложения. Для упрощения разработки и администрирования программ мы использую функцию GetDefaultServerName, которая работает по следующему алгоритму:
Таким образом, при первом старте приложения оно самостоятельно выполняет настройку реестра Windows на подключение к текущему серверу Domino. Если в дальнейшем требуется перенаправить работу приложения на другой сервер, то либо пользователь при помощи встроенных в приложение визуальных средств, либо администратор сети вручную меняют значение ключа. Т.о. со следующего запуска начинает обращаться к другому серверу – обеспечивает поддержка мультисерверной конфигурации информационной системы.
3. Работа с базой данных
Из программы, написанной в Borland Delphi, доступны практически все свойства и методы, предусмотренные разработчиками Lotus Notes / Domino. В том числе Вы можете осуществлять навигацию по представлениям, осуществлять поиск документов в базе данных, в том числе и гипертекстовый поиск и т.д. Особенностей по работе с базой данных вследствие использования Delphi мы не обнаружили. Поэтому в качестве примера приведем фрагмент кода, осуществляющий последовательный перебор и считывание документов из коллекции документов NotesDocumentCollection базы данных адресной книги сервера.
Отметим, что по нашим наблюдениям, при написании программ в Borland Delphi следует стремиться использовать навигацию по представлениям вместо использования метода search. При этом скорость обработки одной и той же коллекции документов, полученной из представления, примерно на 40% выше, чем при обработке документов, полученных поиском в базе данных.
4. Работа с документами
В отличие от работы с базами данных, обработка документов Lotus Notes имеет массу подводных камней. При этом в программах приходится выполнять много одинаковых операций, которые целесообразно выделять в отдельные функции. Вначале рассмотрим стандартную функцию считывания текстового значения поля из документа.
Эта простая функция позволяет значительно упростить написание программ, особенно в случае, когда документ содержит большое количество полей, значения которых необходимо считать и обработать. Необходимо отметить, что очень часто в полях документов Lotus Notes хранится несколько значений или значения записаны с символами, препятствующими корректной работе со строками в Borland Delphi. Мы в таком случае используем перегруженную версию представленной функции, которая может возвращать «очищенную» строку или определенную подстроку [4].
По аналогии с представленным примером разработаны и версии для числовых полей, а также полей с датой или временем, что представляет особую трудность при написании программ. В таком случае, кроме стандартных проверок на корректность документа, наличия в нем указанного поля, функция может проверить тип возвращаемого значения или выполнить необходимые преобразования. Например, возможна конвертация строкового значения в число или смена символа разделителя разрядов на основании текущих настроек операционной системы.
Несколько усложненный пример – это считывание значения поля в профайле. Как известно, Lotus Notes, кроме стандартных документов, позволяет поддерживать хранение информации в т.н. профайлах – документах, к которым можно обратиться по имени формы и, как дополнение, по имени текущего пользователя. Для чтения текстового значения из профайла рассмотрим следующую функцию:
Как видно из примера, эта функция использует стандартную функцию LNGetFieldStrValue, представленную ранее, но перед этим выполняет ряд дополнительных проверок и операций.
5. Выводы
Мы используем представленную технологию в практической разработке медицинской информационной системы «Кондопога» вот уже в течение 5 лет. За это время многократно убедились в прекрасной устойчивости и приемлемой скорости работы программ, написанных на Borland Delphi для баз данных Lotus Notes / Domino. Фактически мы убедились, что способны создавать программы на Borland Delphi, которые используют весь арсенал встроенных в Lotus Notes классов [3].
Постепенно нами была накоплена целая библиотека класса middleware, которая реализует практически весь необходимый функционал для написания программ в Borland Delphi для среды Lotus Notes. Это позволило разработать нашу информационную систему таким образом, что взаимные недостатки реляционных и объектно-ориентированных баз данных фактически полностью компенсируются взаимными достоинствами. Поэтому пользователи ИС «Кондопога» одинаково комфортно используют и возможности совместной работы над электронными документами Lotus Notes и встроенные в базы данных Domino приложения, предоставляющие расширенные возможности работы с таблицами реляционных баз данных, мгновенное построение диаграмм на основе данных из документов Lotus Notes и т.д.
Литература:
Об авторах:
Гусев Александр Владимирович – к.т.н., ст. инженер-программист вычислительного центра ОАО «Кондопога»
Дмитриев Александр Геннадьевич – инженер-программист вычислительного центра ОАО «Кондопога»
Тихонов Станислав Игоревич – инженер-программист вычислительного центра ОАО
Книга по Lotus. Разработка приложений в среде Domino 7: Глава 3 (электронная книга)
В этой главе мы проанализируем, как улучшается приложение ITSO Electronics благодаря использованию Web-сервисов. Для этого рассмотрим следующие темы:
Сервис-ориентированная архитектура (SOA) является компонентом модели, взаимодействующей с различными функциональными модулями приложения, называемыми сервисами, через строго определенный интерфейс и набор условий между этими сервисами. Интерфейс определен независимым способом, т. е. он должен быть независим от аппаратной платформы, операционной системы и языка программирования, на котором этот сервис реализован. Таким образом, становится возможным взаимодействие друг с другом сервисов, построенных на различных подобных системах унифицированным и универсальным способами. Так как Web-сервисы характеризуются нейтральным, независимым от платформы подходом к разработке приложения, они являются неотъемлемым компонентом архитектуры SOA-приложения.
Эта особенность, заключающаяся в независимом описании интерфейса, который не строго привязан к конкретной реализации, известна как потеря связи между сервисами. Преимущество системы со слабой связью заключается в ее гибкости и способности сохранять работоспособность после эволюционных изменений в структуре и реализации функций каждого сервиса и всей программы в целом. Тем не менее, тесно связанные системы предполагают то, что интерфейс между различными компонентами приложения тесно взаимосвязан с функциями и формами, делая их, более хрупкими, когда необходимо произвести изменения частей или всего приложения.
Необходимость в системах со слабой связью растет из-за того, что с каждым днем возрастает потребность в более гибких бизнес-приложениях, которая, в свою очередь, основывается на том, что бизнес должен адаптироваться к изменчивости внешней среды, например к постоянно меняющимся принципам стратегии, устойчивости коммерческого положения, бизнес-целям, партнерству, состоянию промышленности, а также другим факторам, связанным с бизнесом, которые оказывают влияние на природу бизнеса. При желании вы можете обратиться к бизнесу, быстро реагирующему на изменения окружающей среды, т. е. к бизнесу по требованию (On Demand Business), который меняется в зависимости от того, как реализуются цели. Это необходимо для метода «по первому требованию».
Сервис-ориентированная архитектура не только не является новшеством, но вообще представляет собой альтернативную модель более традиционным, тесно связанным объектно-ориентированным моделям, появившимся в последние десятилетия. В то время как системы, базирующиеся на SOA, не исключают того факта, что отдельные сервисы сами могут быть построены по объектно-ориентированной схеме, схема всей системы сервис-ориентированна. Поскольку данное правило распространяется на объекты, находящиеся в пределах системы, SOA основана на объектах, но в целом не объектно-ориентированная. Различие заключается в самих интерфейсах. Классическим примером одной из самых первых SOA-систем является Common Object Request Broker Architecture (CORBA), оперирующая принципами, схожими с SOA.
В настоящее время SOA использует преимущества языка XML (Extensible Markup Language). В результате описания интерфейсов на языках, основанных на XML, называемых языками описания Web-сервисов (Web Services Definition Language, WSDL)), Web-сервисы обрели более гибкие и динамичные системные интерфейсы по сравнению с разработанным ранее языком описания интерфейса (Interface Definition Language, IDL), использованным в CORBA.
Ограничения в реализации Web-сервисов в Lotus Domino 7 выражаются в следующем:
Документ WSDL определяет Web-сервис и включает в себя приведенные ниже элементы:
есть атрибут «binding», необходимый для присвоения имени связыванию, и атрибут «address location», необходимый для присвоения имени конечной точке сети, связанной с привязкой.
Элемент Web-сервисов Lotus Domino 7 обеспечивает средой для хостинга, основанной на простом протоколе доступа к объектам (SOAP) версии 1.1. SOAP определяет информацию, основанную на XML и используемую для обмена структурированной и классифицированной информацией между равноправными участниками сети в децентрализованной, распределенной среде. Сообщение SOAP, по существу, представляет собой одностороннюю передачу от отправителя к получателю SOAP, однако предполагается, что сообщения SOAP комбинируются с помощью приложений для применения более сложных схем взаимодействия.
Из положения консорциума Всемирной паутины (W3C):
«SOAP представляет собой облегченный протокол, предназначенный для обмена структурированной информацией в децентрализованной и распределенной среде. Он основан на протоколе XML, состоящем из трех частей: оболочки, определяющей структуру для описания сообщения и процесса его обработки, набора правил кодирования, служащего для выражения экземпляров типов данных, определенных приложением, и правила, предназначенного для представления удаленных процедурных запросов и ответов».
В Lotus Domino Designer 7 разработчик приложения может импортировать существующий файл WSDL в приложение и Domino Designer, затем сгенерирует классы на языке LotusScript или Java. Тем не менее, разработчики должны иметь в виду, что не все существующие WSDL-файлы могут быть интерпретированы Lotus Domino Designer 7. Некоторые файлы могут быть отклонены, в зависимости от используемых элементов XML.
Замечание. Web-сервисы могут быть добавлены к любой базе данных Lotus Notes и Domino. Тем не менее, для достижения цели, поставленной в этой книге, все Web-сервисы добавлены к двум отдельным базам данных в приложении ITSO Electronics, которые называются webservices.nsf и wsconsumer.nsf.
Основным нашим требованием по внедрению Web-сервисов к приложению ITSO Electronics стала необходимость позволить покупателям просматривать текущую информацию о наших продуктах. Web-сервисы лучше всех справятся с подобной задачей. В будущем компания ITSO Electronics планирует использовать Web-сервисы для того, чтобы позволить покупателям получать доступ к информации о счетах, вне зависимости от используемой платформы, операционной системы или интерфейса.
Основным пользователем Web-сервисов приложения ITSO Electronics в нашем примере будет клиент фирмы ITSO Electronics. Приложение необходимо для обеспечения доступа пользователя к текущей информации о продукте через программный механизм и пользовательский интерфейс, интуитивный и легкий в использовании.
Позвольте продемонстрировать вам, насколько легко создать Web-сервис с помощью IBM Lotus Domino Designer 7.
Начнем с исключения ошибок, обработки особых ситуаций, регистрации и производительности и сосредоточимся на функциональности ядра.
Необходимо, чтобы приложение ITSO Electronics поддерживало и Java, и LotusScript.
В этом разделе иллюстрируется создание нового Web-сервиса. В качестве примера используетсяприложение ITSO Electronics:
Рис. 3.2. Исходный код для простого Web-сервиса
Пример 3.1. Код для простого Web-сервиса
%INCLUDE «lsxsd.lss» Class ProductInfo Function getProductName(productNumber As String, Fault1 As WS_FAULT) As String Dim session As NotesSession Set session = New NotesSession Dim db As notesdatabase Dim view As notesview Dim doc As notesdocument Set db = session.GetDatabase(«»,»itso/products.nsf») Set view = db.GetView(«vaPNumber») Set doc = view.GetDocumentByKey(productNumber, True) If doc Is Nothing Then Call Fault1.setFault(True) ‘ необходимо для ошибочной активации Call Fault1.setFaultString(«Product » & productnumber & » doesn’t exist») Else getProductName = doc.ProductName(0) End If End Function End Class |
Для того чтобы протестировать новый Web-сервис ProductInfo, откройте браузер и введите следующий URL:
http://servername/databasename.nsf/webservicename?openwebservice (http://имясервера/названиебазыданных.nsf/названиеWeb-сервиса?openwebservice)
Lotus Domino ответит на этот запрос именем порта Web-сервиса и названиями операций для этого порта, а также выведет ссылку на документ WSDL, как показано на рис. 3.5.
Рис. 3.5. Web-сервис, открытый в Web-браузере
http://servername/databasename.nsf/webservicename?WSDL (http://названиесервера/названиебазыданных.nsf/названиеWeb-сервиса?WSDL) |
Например, в нашем сценарии мы использовали следующую команду:
http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductInfo?WSDL |
В примере 3.2 показан получившийся в результате WSDL-документ.
Для получения более подробного описания документа WSDL см. п. 3.2.1, «Документ WSDL».
Существует множество приложений, которые позволяют тестировать и использовать Web-сервисы. Для достижения целей, поставленных в этой книге, мы будем использовать IBM Rational® Application Developer. Чтобы начать тестирование Web-сервисов, используя Rational Application Developer, выполните приведенную ниже последовательность действий.
Пример 3.4. Контекст ответа SOAP, отправленный обратно с сервера
Рис. 3.11. Формат сообщения SOAP установленный на Wrapped
Пример 3.5. Контекст запроса SOAP, в котором использован формат сообщения SOAP Wrapped
Пример3.6. Контекст ответа SOAP, в котором использован формат сообщения SOAP Wrapped
Совет. Браузеру Web-сервисов необходимо получать обновленный документ WSDL от Web-сервиса. Всякий раз, когда документ WSDL изменяется, ваши потребители (включая браузер Web-сервисов) должны использовать самую последнюю версию вашего документа WSDL. В противном случае операции могут быть выполнены не так, как вы ожидаете.
В предыдущем примере было продемонстрировано совместное использование примитивных видов данных, таких как массивы, числа или (как в нашем случае) строки. Требования к приложению ITSO Electronics заключаются в предоставлении покупателям прямого доступа к информации о продуктах. Web-сервисы же позволяют нам раскрыть эти данные. Покупатели и поставщики могут увидеть цену определенного продукта или получить список всех доступных продуктов.
Для предоставления покупателям права доступа к информации о продуктах нам необходимо предоставить на совместное использование следующую информацию о продукте:
В примере 3.7 приведены данные объекта Product. Этот объект будет использован в качестве сложного типа данных в Web-сервисе, над созданием которого мы будем работать в п. 3.5.1. В данном примере использован язык программирования Java.
В п. 3.5.1, «Создание нового Web-сервиса», мы создавали Web-сервис, используя примитивный тип данных. В этом примере мы предпримем те же действия для создания Web-сервиса для объекта Product, который позволит обеспечить партнеров подробной информацией о продуктах. В приведенных ниже действиях обобщается способ создания Web-сервиса.
Мы можем использовать новый Web-сервис, названный ProductService из Rational Application Developer, как показано на рис. 3.12.
Рис. 3.12. Исполнение операции WSDL getProduct
Пример 3.9 выводит контекст ответа SOAP, полученный от сервера Lotus Domino для определенного номера продукта, который мы использовали для активирования операции WSDL getProduct.
У Web-сервиса ProductService, который мы только что создали, есть и другая операция, отправляющая набор объектов продуктов в виде массива, которая называется getAllProducts. Пример 3.10 наглядно иллюстрирует этот процесс. Его сообщения SOAP имеют формат: RPC/encoded.
Документы WSDL экспортируют для того, чтобы предоставить покупателю информацию о том, как использовать созданные нами Web-сервисы. Во многих случаях инструменты, с помощью которых осуществляется создание клиентов Web-сервисов, могут автоматически генерировать код из документа WSDL.
Для того чтобы экспортировать документ WSDL, выполните следующие действия:
Рис. 3.13. Экспортирование документа WSDL
Если вы импортируете документ WSDL, описательный класс генерируется на основе содержания документа WSDL. Общедоступные прототипы методов, функций и подстановок в классе соответствуют операциям Web-сервиса, определенным для первого элемента
первого элемента в документе WSDL. Другие классы или типы ссылаются на прототипы методов, которые, возможно, также будут сгенерированы на основании содержимого документа WSDL вместе с общедоступными элементами данных. Если вы измените прототип интерфейса, соответствующий документ WSDL также изменится, когда Web-сервис будет сохранен. Вы можете отслеживать подобные изменения с помощью свойства «Warn if the WSDL interface is modified» (Предупреждать, если интерфейс WSDL был изменен).
Бизнес-партнеры компании ITSO Electronics, а также возможные покупатели, в свою очередь, могут обеспечивать компанию документом WSDL, который она может использовать для создания Web-сервисов. Вы можете импортировать существующий документ WSDL, чтобы сгенерировать каркас Web-сервиса. Каркасный код соответствует описанию Web-сервиса. Затем вам необходимо добавить код реализации.
Для того чтобы импортировать документ WSDL, выполните следующее:
Рис. 3.15. Импортирование документа WSDL: окно свойств Web Service
Пример3.11. Каркасный код, сгенерированный после импортирования документа WSDL
%INCLUDE «lsxsd.lss» Class ArrayOfProduct_Holder As INOUT_HOLDER Public Value() As Product End Class Class Product Public description As XSD_STRING Public name As XSD_STRING Public number As Long Public price As Double Sub NEW End Sub End Class Class ProductService Sub NEW End Sub Function getAllProducts() As ArrayOfProduct_Holder End Function Function getProduct(productNumber As Double) As Product End Function End Class |
Замечание. Любые ошибки в методе описания сервиса на языке LotusScript (т. е. любой основной класс или подкласс WS_FAULT) должны фигурировать в конце списка параметров метода.
Ошибки для метода описания сервиса на языке Java возникают в стандартных предложениях Java.
Для получения дополнительной информации о том, как работать с ошибками, используя язык LotusScript см. п. 3.12, «Использование Web-сервисов с помощью LS2J».
Угрозы безопасности Web-сервисов, описанные в приложении ITSO Electronics, подразумевают угрозу всей системе, на которой базируется Web-сервис, приложению и инфраструктуре сети в целом. Для обеспечения защиты Web-сервисов необходим целый спектр механизмов защиты, основанных на языке XML, так как только благодаря им становится возможным решение проблем, касающихся аутентификации, ролевого контроля доступа к базам данных, реализации принципов обеспечения безопасности, а также безопасности уровня сообщений, которая выполняет роль посредника.
В настоящий момент не существует широкораспространенных спецификаций безопасности Web-сервисов. Поэтому разработчики могут либо создавать службы, которые не используют подобных возможностей, либо разрабатывать специальные узкопрофильные программы, которые предположительно смогут решать проблемы функциональной совместимости.
В архитектуре приложения ITSO Electronics существует три фундаментальных принципа, относящихся к безопасности: ресурсы, которые должны быть защищены; механизмы, благодаря которым обеспечивается эта защита (т. е. политика защиты); и политики, которые представляют собой обрабатываемые компьютерами документы, которые, описывают ограничения на этих ресурсах. Для продолжения дискуссии о безопасности применения Web-сервисов обратитесь к руководству Web Service Architecture, которое доступно по следующему адресу в Интернете:
http://www.w3.org/TR/2004/NOTE-ws-arch-20040211
Web-сервис Lotus Domino 7 обладает теми же возможностями защиты, что и агент. Уровень защиты Web-сервиса устанавливается в закладке Security (Безопасность) окна свойств Web service. В приведенном ниже списке описываются параметры, доступные в закладке Security.
На момент написания этой книги Lotus Domino 7.0 обеспечивал, хотя и не в полном объеме, использование Web-сервисов. Тем не менее, вспомогательным бизнес-требованием, предъявляемым к приложению ITSO Electronics, является предоставление доступа к ценовым данным, располагающимся за границами Lotus Domino, что, в свою очередь, диктует необходимость применения Web-сервисов в этом приложении. В нашем сценарии компания ITSO Electronics решила применить программный продукт с открытым исходным кодом Apache SOAP, чтобы использовать Web-сервисы с помощью Java. Apache SOAP представляет собой внедрение представления SOAP в W3C. Он базируется и заменяет собой разработку IBM SOAP4J. Последующий, улучшенный проект Apache Axis доступен по следующему адресу в Интернете:
http://ws.apache.org/axis/
Для того чтобы проиллюстрировать использование Web-сервисов, в нашем сценарии мы создали отдельную базу данных в приложении ITSO Electronics, которую назвали WS Consumer. В этой базе данных содержится агент, который будет использовать сложный Web-сервис, созданный нами ранее.
Замечание. Web-сервисы могут быть добавлены к любой базе данных Lotus Notes и Domino. Но для достижения целей, поставленных в этой книге, все Web-сервисы добавлены к отдельным базам данных в приложении ITSO Electronics, которые называются webservices.nsf и wsconsumer.nsf.
Приведенная ниже последовательность действий наглядно иллюстрирует создание агента, использующего Web-сервис.
Рис. 3.18. Окно Java, в котором отображен результат работы Web-сервиса
import lotus.domino.*; import java.io.*; import java.util.*; import java.net.*; import org.w3c.dom.*; import org.apache.soap.util.xml.*; import org.apache.soap.*; import org.apache.soap.encoding.*; import org.apache.soap.encoding.soapenc.*; import org.apache.soap.rpc.*; import javax.swing.*; public class JavaAgent extends AgentBase < public void NotesMain() < try < Session session = getSession(); AgentContext agentContext = session.getAgentContext(); URL url = new URL("http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductService?WSDL"); String soapAction ="http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductService?WSDL"; Call call = new Call(); BeanSerializer beanSerializer = new BeanSerializer(); SOAPMappingRegistry smRegistry = new SOAPMappingRegistry(); smRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName( "urn:DefaultNamespace", "Product"), Product.class, beanSerializer, beanSerializer); String targetNamespace = "urn:DefaultNamespace"; call.setSOAPMappingRegistry(smRegistry); call.setTargetObjectURI(targetNamespace); call.setMethodName("getAllProducts"); call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); Response resp = null; try < resp = call.invoke(url, soapAction); >catch (SOAPException e) < e.printStackTrace(); System.err.println("SOAP Exception code: " + e.getFaultCode() + " message: " + e.ge return; >if (!resp.generatedFault()) < Parameter ret = resp.getReturnValue(); Product[] products = (Product[]) ret.getValue(); buildGUI(products); >else < Fault fault = resp.getFault(); System.err.println("SOAP Fault, " + fault.getFaultCode() + " " + fault.getFaultS >> catch (Exception e) < e.printStackTrace(); >> private void buildGUI(Product[] products) < StringBuffer sb = new StringBuffer(); String newLine = " «; for(int i = 0; i » + sb.toString() + » «))); frame.pack(); frame.setVisible(true); > > |
В этом разделе мы расскажем о следующем:
LS2J представляет собой интерфейс, позволяющий пересылать тип данных Java в тип данных LotusScript, а также позволяет LotusScript выполнять объектные методы Java. Благодаря LS2J LotusScript получает способность создавать объекты Java так, будто они были родными для среды LotusScript.
В этом сценарии мы добавили агент LotusScript к базе данных WS Consumer. Агент использует код Java из библиотеки скриптов, для того чтобы использовать Web-сервис.
Web-сервис, который мы используем, способен выполнять одно из двух действий:
Перечисленные ниже этапы показывают, как создать Web-сервис с помощью LS2J. В этом разделе описывается создание Web-сервиса, а в последующих речь пойдет о создании библиотеки скриптов Java и о том, как она используется в нашем агенте LotusScript через LS2J. Выполните приведенную ниже последовательность действий.
Dim session As NotesSession Class UserInfo Function getUserName ( Fault1 As WS_FAULT) Set session = New NotesSession Dim doc As NotesDocument Set doc = session.DocumentContext If Cint(Rnd() * 10) > 5 Then getUserName = doc.remote_user(0) Else Call Fault1.setFault(True) ‘ необходимо для ошибочной активации Call Fault1.setFaultString(«SUCCESS, We send a FAULT on purpose») End If End Function End Class |
Теперь нам необходимо создать библиотеку скриптов, содержащую класс Java, который будет использовать Web-сервис и сделает его доступным нашему агенту LotusScript через LS2J. Для того чтобы настроить класс Java, необходимо выполнить следующую последовательность действий:
Важно. Приведенные ниже строчки из примера 3.16 должны быть скорректированы и соответствовать URL вашей базы данных:
URL url = new URL(«http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductService?WSDL»);
String soapAction =»http://domino7appdev.cam.itso.ibm.com/itso/webservices.nsf/ProductService?WSDL»;
Наконец нам необходимо создать агент LotusScript и использовать только что созданную библиотеку через LS2J.
Option Public Use «ConsumeWSLibrary» Uselsx «*javacon» |
Пример 3.18. Код Initialize для агента LotusScript LS2J
Sub Initialize Dim mySession As JavaSession Dim myClass As JavaClass Dim myObject As JavaObject Set mySession = New JavaSession () Set myClass = mySession.GetClass(«WSConsumer») Set myObject = myClass.CreateObject Dim value As String value = myObject.getValue(«The UserName», «The Password») Msgbox value End Sub |
Рис. 3.21. Сообщение об ошибке, возникшей при использовании Web-сервиса с помощью LS2J
Если агент смог использовать ваш Web-сервис, вы увидите сообщение, представленное на рис. 3.22.
Рис. 3.22. Web-сервис был успешно использован с помощью LS2J
В Lotus Notes и Domino 7 Web-сервис обладает теми же возможностями защиты, что и агент. В примере 3.19 мы использовали базовую аутентификацию HTTP, для того чтобы защитить наш Web-сервис. Apache SOAP позволяет нам отправлять имена пользователей и пароли в виде SOAP-запросов, добавляя экземпляр класса SOAPHTTPConnection к объекту Call.
В документе WSDL содержится XML-код, который описывает Web-сервис. Привязка WSDL описывает то, как сервис связан с протоколом обмена сообщениями. Привязка WSDL SOAP может быть осуществлена либо при помощи вызова удаленных процедур (RPC), либо при помощи документной привязки. Привязка SOAP также может употребляться как в кодированном виде, так и в литеральном виде. Таким образом, у разработчика приложений Lotus Domino есть четыре типа/использования моделей на выбор:
Терминология «PRC против документального» может сбивать с толку, так как эти термины подразумевают, что тип RPC следует использовать для программируемых моделей RPC и что документальный тип нужно использовать для документальных программируемых моделей или для программируемых моделей обмена сообщениями. Тем не менее, в данном случае все эти заблуждения бессмысленны, так как тип не имеет ничего общего с программируемыми моделями. Типы только лишь диктуют то, как переводить привязку WSDL в сообщение SOAP. Подобно этому, типы кодированный и литеральный имеют значение только в привязке WSDL-к-SOAP.