Создание порталов JSR 168 для Domino

В данной статье мы рассмотрим создание портала JSR 168, работающего как интерфейс к базе данных Domino.

В данной статье предполагается, что вы являетесь опытным разработчиком приложений для Domino и Web, а также прочитали предыдущую статью по среде DXL.

Портлеты JSR 168

Пользовательский интерфейс для примеров, рассмотренных в этой статье, является набором портлетов JSR 168, предоставляющим внешний интерфейс для доступа к Domino-приложению. Для правильного применения кода в этой статье мы будем использовать передовой опыт создания классов доступа к программам/данным. В этой статье представлены портлеты, основанные на JSR 168, которые будут использовать классы доступа к данным. Классы разработаны таким образом, что они не связаны с дизайном интерфейса или платформой и не зависят от них. Точно так же, одни и те же классы могут быть легко использованы для доступа к любому Domino-приложению.

На рисунке 1 изображены различные компоненты и взаимодействия, рассмотренные в данной статье, на системном уровне.

Рисунок 1. Компоненты и взаимодействия
Компоненты и взаимодействия

Обычный пользователь обращается к приложению через Web-браузер. Приложение представляет собой JSR 168 портлет, размещенный на Tomcat 5.0.30, который выполняет контейнер портлетов Jetspeed 2. В фоновом режиме выполняется сервер Domino версии 6.5.1, на котором работает целевое Domino-приложение (dxlnab.nsf), каталог Domino с пользовательскими DXL-агентами.

Интерфейсная часть

Давайте начнем с рассмотрения интерфейсной части. На следующих рисунках показаны различные состояния конечного работающего приложения, обращающегося к Domino Directory, с тремя дополнительными пользовательскими агентами. Для целей данной статьи мы рассмотрим ключевые поля (First Name, Last Name и Full Name) из серверного документа. Позже мы рассмотрим, как добавить дополнительные поля.

На рисунке 2 показан начальный экран интерфейса приложения.

Рисунок 2. Начальный экран
Начальный экран

Вы можете выбрать документ из списка в портлете DXL Notes View для просмотра детальной информации по нему (см. рисунок 3).

Рисунок 3. Детальная информация о документе
Детальная информация о документе

При нажатии кнопки "create" появится экран, изображенный на рисунке 4.

Рисунок 4. Экран Create Document
Экран Create Document

При нажатии кнопки "edit" отобразится экран, показанный на рисунке 5.

Рисунок 5. Экран Edit
Экран Edit

Основной алгоритм работы программы выглядит следующим образом:

  1. Вы заходите на страницу с двумя портлетами, View и Doc. Портлет View отображает 10 строк представления данных из Domino Directory сервера. Кнопки Previous и Next используются для навигации по представлению.
  2. Затем вы можете нажать ссылку в виде стрелки ( -> ) в каждой записи для просмотра дополнительных подробностей о документе. В нашем примере мы показываем только несколько полей, но ограничений никаких нет.
  3. Затем вы можете выбрать для редактирования текущий документ, либо создать новый.
  4. Если вы выбираете редактирование текущего документа, вам предоставляются области редактирования для данных полей (см. рисунок 5). Здесь вы можете сделать изменения и сохранить их, при этом они немедленно отобразятся в портлете View. Также у вас есть вариант отказаться от изменений.
  5. Если вы выбираете создание нового документа, в портлете Doc появляется экран Create Document (рисунок 4). Здесь вы можете ввести новое имя/фамилию и полное имя и сохранить новую запись. Портлет View будет обновлен для отображения изменений. Опять же, у вас есть вариант отказаться от проведенных изменений.

Несколько слов о разработке портлетов

Для того чтобы охватить как можно более широкую аудиторию, в данной статье мы создаем портлет-приложение, используя чистый Eclipse, а не более изощренные инструментальные средства, например Rational Application Developer. Мы использовали Xdoclet и Maven в качестве средств компоновки и развертывания. Мы также разработали и протестировали приложение на Apache Jetspeed Portal 2.

Проектирование портлетов

Два JSR 168 портлета используют метод doView для отображения различных JSP-документов на основе текущего состояния и действия, выполненного пользователем. Действия захватываются методом processAction соответствующих портлетов. Далее выполняется визуализация (как часть doView) для отображения JSP-документа на основе действия, установленного/обрабатываемого в processAction. На рисунке 6 изображена блок-схема JSP/состояние работы нашего приложения.

Рисунок 6. Блок схема JSP/состояние
Блок схема JSP/состояние

Два портлета взаимодействуют между собой с использованием PortletSession. Портлет View устанавливает объект документа в виде переменной в PortletSession с областью действия - приложение (PortletSession.APPLICATION_SCOPE). Портлет Doc ищет эту переменную перед визуализацией и, если она существует, визуализирует документ. Если переменная не существует, портлет отображает общее сообщение.

Сами портлеты разработаны по шаблонам Facade и Value Object. Класс portlet в обоих портлетах выступает как контроллер, делегирующий всю служебную работу фасаду (facade). Фасад, в свою очередь, возвращает или использует соответствующий значимый объект (value object) на основе выполняемого действия. Все виды для портлетов созданы с использованием JSP. Такой дизайн изолирует нас от будущих изменений на серверах - мы только должны будем переписать наш фасад. На рисунке 7 показана диаграмма классов, иллюстрирующая различные классы и их взаимодействия.

Рисунок 7. Классы и взаимодействия
Классы и взаимодействия

Пакеты dxlobj и dxldao являются общими классами доступа к данным, разработанными для данной статьи. Мы спроектировали эти два пакета таким образом, чтобы вы могли использовать их для доступа к Team Room или пользовательскому NSF-приложению. Эти Data Access Objects (DAO) спроектированы в общей форме и независимы от серверного приложения.

Вся работа по доступу к серверному Domino-приложению в двух портлетах, View (raj.portlets.DXLView) и Doc (raj.portlets.DXLDoc), зависит от фасада (raj.facade.NABFront). Их дизайн зависит от приложения, поскольку вид - это интегрированная часть данных, которые отображает приложение. Фасад, в свою очередь, возвращает значимый объект people (raj.vo.People) для портлета View или значимый объект person (raj.vo.Person) для портлета Doc. Фасад также принимает значимый объект person для обновления или создания записи person на сервере. Два значимых объекта содержат атрибуты, связанные с полями в серверном Domino-документе. Например, атрибут fname в raj.vo.Person соответствует полю FirstName формы Person в серверной базе данных Domino. Как мы утверждали ранее, для данной статьи мы используем только три поля из серверного приложения. Мы покажем, как отобразить Company Name в портлете как в режиме создания, так и в режиме редактирования, еще глубже погружаясь в дизайн портлета и класса.

Как вы можете заметить, дизайн портлетов очень зависит от приложения. Следовательно, если у вас есть база данных Teamroom, и вы хотите иметь два портлета для доступа к Domino Teamroom, вы могли бы иметь портлеты Teamroom View и Teamroom Doc с соответствующими значимыми объектами, отображающими поля (данные) интересующей вас серверной базы данных Domino.

Дизайн DAO

Давайте кратко рассмотрим дизайн средства доступа к данным. Основной причиной, по которой мы решили иметь служебный класс для доступа к данным, была уверенность в том, что эти же самые классы могли бы использоваться для подключения к базам данных Domino любого типа. Дизайн был независим от базы данных. Имелась также возможность поддержки различных типов аутентификации. Реализованные в настоящее время классы являются базовыми и основаны на сессиях (LTPA). Если вам нужна поддержка SSL, вы можете изменить служебные классы и добавить ее, в то время как ваш вид (как в MVC) останется неизменным.

Объединение всего вместе

Набор портлетов JSR 168 (raj.portlets.DXLDoc и raj.portlets.DXLView) делегирует загрузку и обновление данных классу raj.facade.NABFront, который, в свою очередь, делегирует эту работу DAO-инструменту. Сами портлеты используют контекст портлетов для получения параметров времени исполнения для подключения к базе данных Domino (имя, вид, тип аутентификации, полномочия, сервер Domino, порт и т.д.). Ничто не мешает нам хранить эти параметры времени исполнения в контексте приложения, используя их, таким образом, совместно в обоих портлетах.

Портлет View

В демонстрационных целях мы рассмотрим работу портлета View (raj.portlets.DXLView).

  1. Портлет инициализируется во время его загрузки в контейнер портлетов. Частью инициализации является загрузка параметров времени исполнения из контекста портлета. Как часть этого метода, из контекста портлета инициализируется и заполняется объект DAOConfig.
  2. Когда пользователь обращается к странице, содержащей портлет, контейнер портлетов вызывает метод doView портлета, который инициализирует рабочий класс NABFront, передавая ему объект DAOConfig. Метод doView портлета View вызывает метод getPeople класса NABFront.
  3. NABFront инициализирует DXLDAOFactory и получает описатель (handle) для DXLViewObject.
  4. DXLDAOFactory инициализирует ViewXML и вызывает метод ViewXML process.
  5. Метод process в ViewXML использует метод getData HttpConnect для получения XML из целевого сервера Domino. Объект DAOConfig имеет детальную информацию о сервере, порте, базе данных, представлении и т.д., которые будет использовать.
  6. ViewXML обрабатывает XML, используя SAX-анализатор, создает DXLViewObject и передает его в DXLDAOFactory.
  7. DXLDAOFactory передает DXLViewObject в NABFront.
  8. NABFront извлекает специфические данные из DXLViewObject и передает локализованный объект People обратно в портлет.
  9. Метод doView портлета помещает объект People в атрибут запроса и передает запрос в представление jsp (page/view.jsp).
  10. Пользователь видит отображение представления в портлете.

Детальная информация о документе

Теперь мы рассмотрим, как портлет DXLDoc отображает детальную информацию о документе.

  1. Портлет инициализируется во время его загрузки в контейнер портлетов. Частью инициализации является загрузка параметров времени исполнения из контекста портлета. Как часть этого метода, из контекста портлета инициализируется и заполняется объект DAOConfig.
  2. Когда пользователь просматривает список документов в портлете View и выбирает документ для просмотра детальной информации, активизируется метод processAction, который вызывает метод getPerson инициализированного NABFront, передавая UNID выбранного документа.
  3. NABFront вызывает getDocObject.
  4. DXLDAOFactory инициализирует DocDXL и вызывает метод parseXML.
  5. Метод parseXML в DocDXL использует метод getData HttpConnect для получения XML (DXL документа) из целевого сервера Domino. Объект DAOConfig имеет детальную информацию о сервере, порте, базе данных, представлении и т.д., которые будет использовать.
  6. DocDXL обрабатывает XML, используя DOM-анализатор, создает DXLViewNoteObject и передает его в DXLDAOFactory.
  7. DXLDAOFactory передает DXLViewNoteObject в NABFront.
  8. NABFront извлекает специфические данные из DXLViewNoteObject и передает локализованный объект Person обратно в портлет.
  9. Метод processAction портлета View помещает объект Person как параметр запроса dxlperson. Область видимости этого атрибута установлена в APPLICATION_SCOPE.
  10. Метод doView портлета Doc помещает объект People в атрибут запроса и передает его в представление jsp (page/view.jsp), которое отображает представление people. Пользователь видит отображение представления в портлете.
  11. Метод doView получает объект Person из атрибута запроса dxlperson и передает запрос в представление jsp (page/viewdoc.jsp).
  12. Пользователь видит детальную информацию о выбранном в портлете Doc документе.

Процесс редактирования документа аналогичен по работе. Просто используется другой URL и метод POST HttpConnect для сохранения данных из портлета Doc. Операция создания документа аналогична редактированию, но для нее не требуется какая-либо информация из портлета View. Также для этой функции используется другой URL.

Если вы хотите отобразить другое поле (например, в портлете Doc) для просмотра, вот алгоритм действий:

  1. Обновите значимый объект Person в raj.vo.Person, добавив другое поле и соответствующие методы getter/setter.
  2. Измените фасад NABFront для заполнения корректными значениями поля из сервера, увязывая его с соответствующим именем элемента в DXL.
  3. Измените viewdoc.jsp в портале для отображения соответствующего значения из объекта Person на JSP-странице.

Резюме

В этой статье мы рассмотрели использование пользовательской интегрированной среды DXL при создании JSR 168 портала для доступа к Domino Directory. Основой метода доступа из Java-платформ является использование Data Access Objects (DAO), представленных в данной статье.


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