Содержание


Java EE 5: Мощь и производительность при меньшей сложности

Обзор возможностей Java EE 5 и улучшений, увеличивающих производительность разработчика

Comments

Технология Java EE является расширением языковой платформы Java, которое позволяет создавать масштабируемые, мощные и переносимые корпоративные приложения. В ней определено четыре типа контейнеров для компонентов приложения: Web, Enterprise JavaBean (EJB), клиентские приложения и аплеты. Эти контейнеры и поддерживаемые ими Java API подробно описаны в спецификации сервера приложений, что создает и поддерживает конкуренцию на рынке продуктов Java EE, гарантируя при этом серверную переносимость для приложений, которые придерживаются спецификации (см. врезку Краткая история Java EE).

Последняя версия платформы, Java EE 5, была выпущена в мае 2006 года. Сосредоточенная в первую очередь на производительности разработчика, Java EE 5 предоставляет простую модель программирования без ущерба для мощности и функциональности платформы. Упрощение моделей разработки обеспечивают по большей части два механизма - аннотации Java и разумные значения по умолчанию. Важнейшие функциональные усовершенствования включают расширение поддержки Web-сервисов, а также включение в платформу JavaServer Faces (JSF) и стандартной библиотеки тегов Java (JSTL - Java Standard Tag Library).

В данной статье рассматриваются возможности Java EE 5 и освещаются изменения, произошедшие со времени последнего релиза J2EE. (Здесь не рассматриваются такие нововведения, как StAX API - API для анализа XML с предварительной загрузкой, и некоторые мелкие или средние улучшения во многих API.) В статье приводится комплексный обзор четырех основных категорий: Web-сервисы, Web-приложения, корпоративные приложения, управление и безопасность. Также, кроме теории, в статье рассматривается небольшое приложение, которое использует возможности Java EE 5 и демонстрирует простоту модели разработки Web-приложений, которые используют сервис-ориентированную архитектуру (SOA).

Эта статья предназначена для читателей, знакомых с программными корпоративными системами, которые хотят всесторонне, на высоком уровне рассмотреть Java EE 5. Для обзора возможностей платформы знания языка программирования Java и J2EE будут полезны, но не обязательны. При обсуждении примера приложения мы углубляемся в технические детали, которые, вероятно, будут более актуальными для тех, кто уже знаком с внутренностями J2EE (или по крайней мере с программированием на Java).

Технологии Web-сервисов

С введением аннотаций в Java EE 5 разработчикам стало легче создавать сложные Web-сервисы и клиентские приложения с наименьшими затратами на написание кода и короткой кривой обучения, чем это было возможно с более ранними версиями Java EE. Аннотации - впервые введенные в Java SE 5, - это модификаторы, которые можно добавлять в код как метаданные. Они не влияют на семантику программы напрямую, но компилятор, средства разработки и библиотеки времени выполнения могут использовать их для создания дополнительных исходных файлов на языке Java, XML-документов и других артефактов, а также добавлять новое поведение в код, содержащий аннотации (см. раздел Ресурсы). Ниже в этой статье будет показано, насколько легко можно, просто добавив аннотации, превратить обычный Java-класс в Web-сервис.

Прорыв в поддержке Web-сервисов

Краеугольным камнем в поддержке Web-сервисов в Java EE 5 является JAX-WS 2.0, представляющий собой дополнение к JAX-RPC 1.1. Обе эти технологии позволяют создавать Web-сервисы, основанные на архитектурах REST или SOAP, без непосредственной утомительной обработки XML и привязки данных, необходимых для Web-сервисов. Разработчики могут свободно продолжать использовать JAX-RPC (поддержка которого по-прежнему обязательна для Java EE 5 контейнеров), однако настоятельно рекомендуется перейти на JAX-WS. Новички в Web-сервисах могут не изучать JAX-RPC, а сразу сосредоточиться на JAX-WS. Тем не менее стоит помнить, что оба они поддерживают SOAP 1.1 через HTTP 1.1 и полностью совместимы: клиент Web-сервиса JAX-WS может получить доступ к конечной точке Web-сервиса JAX-RPC, и наоборот.

JAX-WS обладает убедительным преимуществами перед JAX-RPC, а именно:

  • Поддерживает стандарт SOAP 1.2 (в дополнение к SOAP 1.1).
  • Поддерживает XML поверх HTTP. При желании можно обойтись вообще без SOAP (более подробно см. статью "Use XML directly over HTTP for Web services (where appropriate)").
  • Использует архитектуру Java Architecture for XML Binding (JAXB) для привязки данных к модели. JAXB полностью поддерживает XML Schema и имеет высокую производительность (об этом будет рассказано далее).
  • Вводит модель динамического программирования для сервера и клиента. Модель клиента поддерживает подход, использующий сообщения, и асинхронный подход.
  • Поддерживает механизм оптимизации передачи сообщений (MTOM - Message Transmission Optimization Mechanism). MTOM рекомендован W3C для оптимизации передачи и формата SOAP-сообщений.
  • Предоставляет усовершенствованную поддержку кросс-платформенного взаимодействия Web-сервисов (WS-I - Web services interoperability). (Поддерживается Basic Profile 1.1; JAX-WS поддерживает только Basic Profile 1.0.).
  • Предоставляет усовершенствованную поддержку вложений SOAP. (Используется SOAP with Attachments API for Java [SAAJ] 1.3; JAX-WS поддерживает только SAAJ 1.2.).

Узнать больше о различиях можно из статьи "JAX-RPC versus JAX-WS".

Инструмент wsimport в JAX-WS автоматически берет на себя многие детали разработки Web-сервиса и легко встраивается в процесс сборки на любой платформе, позволяя разработчику сосредоточиться на реализации логики приложения, которое реализует или использует службу. Он генерирует такие артефакты, как сервисы, интерфейсы конечной точки сервисов (SEI), код для асинхронного ответа, исключительные ситуации, основанные на ошибках WSDL, а также классы Java, привязанные к типам схемы с помощью JAXB.

JAX-WS также позволяет создавать высокопроизводительные Web-сервисы. См. статью "Implementing High Performance Web Services Using JAX-WS 2.0" в разделе Ресурсы, которая представляет сравнительное исследование эквивалентных реализаций Web-сервисов, основанных на новом стеке JAX-WS (который использует две другие возможности Java EE 5 для Web-сервисов- JAXB и StAX) и стеке JAX-RPC, включенном в J2EE 1.4. В ходе исследования было установлено, что с JAX-WS увеличение производительности составляет от 40% до 1000% в зависимости от функциональной области и нагрузки.

Технологии Web-приложений

В Java EE 5 к технологиям для разработки внешнего интерфейса Web-приложений вдобавок к существующим спецификациям JavaServer Pages и Servlet были добавлены два важных фрагмента - JSF и JSTL. JSF представляет собой набор программных интерфейсов (API), которые позволяют применять компонентно-ориентированный подход при разработке пользовательских интерфейсов. JSTL - это набор библиотек тегов, которые поддерживают встраивание процедурной логики, доступ к JavaBeans и командам SQL, локализованные инструкции форматирования, а также обработку XML в JSP. Самые последние версии JSF, JSTL и JSP поддерживают единый язык выражений (EL), что позволяет легко интегрировать эти технологии (см. раздел "Ресурсы").

JSF 1.2

JSF имеет встроенную поддержку для решения общих проблем построения пользовательского интерфейса, таких как управление состоянием компонента, обработка событий, навигация, валидация пользовательского ввода, интернационализация. Опытные разработчики могут создавать собственные мощные и многократно используемые компоненты и правила отображения для клиентских устройств, отличающихся от Web-браузера. Менее технически подкованные пользователи могут повторно использовать пользовательские компоненты, включенные по умолчанию в библиотеку тегов JSF для интерфейсов HTML, в визуальных средах программирования, таких как Sun Java Studio Creator. Это позволяет начинающим программистам создавать современные Web-интерфейсы.

Появляется все больше компонентов JSF, написанных сторонними разработчиками, как сообществами Open Source, так и представителями индустрии лицензионного программного обеспечения. В Интернете можно найти множество библиотек, поискав по запросам "JSF components" или "JSF component libraries". Многие из этих компонентов работают с технологией Asynchronous JavaScript + XML (AJAX), которая является движущей силой Web 2.0-подхода. Web-программисты могут использовать их для создания приложений с более широкими возможностями, чем у традиционных Web-приложений, избегая при этом лишней работы по написанию Ajax-компонентов с нуля.

JSP 2.1

Технология JSP входит в состав J2EE с версии 1.2. Она расширяет спецификацию Java Servlet возможностями декларативного программирования пользовательских интерфейсов. JSP предоставляет поддержку программирования пользовательских интерфейсов как документов, которые транслируются в Java-сервлеты, компилируются и вызываются контейнером Web-приложения для обработки запросов. Эти документы, как правило, сочетают в себе директивы JSP и скриптлеты с языком разметки, таким как HTML. В JSP-документах можно использовать старый синтаксис, который основан на специальных тегах, начинающихся с <% и заканчивающихся %>, или новый синтаксис - корректно сформированный XML. Они, как правило, выступают как часть "Вид" в UI-каркасах, основанных на шаблоне "модель-вид-контроллер" (MVC).

JSP 2.1 и JSF 1.2 более совместимы между собой, чем предыдущие версии, в первую очередь благодаря интеграции синтаксиса их языков выражений в унифицированный EL. Этот EL позволяет выполнять такие операции, как:

  • Доступ к свойствам JavaBeans в контекстах запроса, пользовательской сессии и всего приложения.
  • Проверка логических условий, которые определяют, скрыть или показать конкретный элемент.
  • Выполнение расчетов, влияющих на числа и строки, которые отображаются в пользовательском интерфейсе.

В прошлом существовали различия между в синтаксисе EL в JSP и JSF и в том, как контейнеры обрабатывали их. Унифицированный EL устраняет эти различия, а также добавляет такие функции, как:

  • Модифицируемый каркас для настройки интерпретации EL.
  • Поддержка отложенных выражений, которые могут выполняться по мере необходимости обработчиком JSP-тегов.
  • Поддержка операций присваивания, которые могут, например, использовать выражения EL для установки значения свойства JavaBean-компонента из кода JSP.

Большим подарком для разработчиков библиотек JSP-тегов является поддержка подключения ресурсов в обработчики тегов с помощью аннотаций. Это позволяет значительно упростить теги, которые раньше требовали конфигурирования ресурсов и кода для выполнения поиска в JNDI.

JSTL 1.2

Технология JSTL существует уже давно, но до Java EE 5, она располагалась вне "зонта" Java EE. Теги JSTL предоставляют поддержку встраивания в JSP элементов следующих типов:

  • Процедурная логика, такая как циклы и переключатели if/else.
  • Доступ к JavaBean-компонентам, которые могут предоставлять динамические данные пользовательскому интерфейсу или изменять код пользовательского интерфейса.
  • Команды SQL для доступа к базам данных.
  • Инструкции форматирования, которые форматируют вывод пользовательского интерфейса в соответствии с конкретными локалями.
  • Обработка XML, например, анализ согласно DOM (Document Object Model - объектная модель документа) или XSL-преобразования (Extensible Stylesheet Language - расширяемый язык таблиц стилей).

Версия JSTL 1.2 поддерживает унифицированный EL, что решает проблемы, возникавшие при попытках смешать теги JSF и теги JSTL для выполнения итераций на одной JSP-странице.

Java Servlet 2.5

Спецификация Java Servlet - основа технологий Web-уровня в Java - стара как сама технология Java EE. Ее задача - предоставить высокопроизводительный компонентный подход к созданию Web-приложений, которые можно перенести на любой сервер, реализующий спецификацию.

Спецификация Servlet 2.5, обязательно поддерживаемая в Java EE 5, включает незначительные улучшения по сравнению с версией 2.4. Она вводит зависимость от платформы Java 5, а также ряд аннотаций, которые уменьшают необходимость в конфигурировании через конфигурационный файл дескриптора развертывания Web-приложений (web.xml). Также внесены дополнительные улучшения в конфигурирование, например, более гибкое конфигурирование сервлетов с помощью шаблонов и множественных элементов url-pattern.

Технологии корпоративных приложений

Под категорию корпоративных приложений подпадают многие технологии, которые не претерпели никаких изменений с выходом версии Java EE 5 или являются слишком прикладными для того, чтобы рассматривать их в этой статье. Здесь мы сосредоточим внимание на двух основных усовершенствованиях: простоте разработки EJB и новых возможностях хранения данных.

EJB 3.0

Спецификация EJB - это основа платформы Java EE. Она определяет способ инкапсуляции бизнес-логики приложений и позволяет распределить ее способом, учитывающим масштабируемость, безопасность и поддержку транзакций так, что одновременный доступ к данным не приводит к нарушению целостности данных.

EJB делятся на 3 основных типа:

  • Session Beans (сеансовые компоненты) - эти компоненты бывают двух видов: не запоминающие свое состояние (stateless) и запоминающие свое состояние (stateful). Stateless EJB-компоненты используются для решения задач бизнес-логики и обслуживают одиночные запросы из клиентского кода. Stateful EJB-компоненты помнят о состоянии "диалога" с клиентом и удобны для решения наборов взаимосвязанных задач, которые охватывают множество клиентских запросов. Сеансовые EJB-компоненты не могут использоваться клиентами совместно. Они, как правило, управляют одним или несколькими Entity-компонентами.
  • Entity Beans (компоненты, представляющие сущности) представляют собой данные длительного хранения, которые обычно загружаются из базы данных. Entity-компоненты могут использоваться пользователями совместно, а спецификация EJB предусматривает транзакционно-безопасный механизм, который обеспечивает обработку множества одновременных клиентских запросов без опасности повреждения данных. Entity-компонент может сам управлять своей синхронизацией с базой данных или позволить управлять ею контейнеру (управляемая контейнером синхронизация - container managed persistence, CMP).
  • Message-driven Beans (компоненты, управляемые сообщениями) обрабатывают клиентские запросы, не заставляя клиента ждать ответа. Они, как правило, взаимодействуют с очередями Java Message Service (JMS) - еще одна технология корпоративных приложений в Java EE 5, - но также обслуживают асинхронных клиентов, даже тех, которые не написаны на Java.

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

EJB 3.0 предоставляет значительные улучшения в модели программирования EJB и является одним из крупнейших потенциальных источников повышения производительности для разработчиков Java EE 5. Теперь EJB-компонент может быть аннотированным простым Java-объектом (POJO - Plain Old Java Object), который не обязан наследовать определенным классам. Он только должен реализовать удаленный (remote) интерфейс, который можно определить самостоятельно или поручить его автоматическое создание IDE-среде. Дескрипторы развертывания больше не требуются, поскольку EJB-контейнер может извлечь все, что ему необходимо знать, из аннотаций.

В этой статье в разделе "Пример приложения: The RideSynergy" представлен пример кода, в котором содержатся конкретные примеры таких усовершенствований. Читатели, жаждущие более глубоких подробностей, смогут найти в разделе "Ресурсы" ссылки на две статьи, которые дают убедительные примеры того, насколько улучшились EJB в последней версии.

Java Persistence API (JPA 1.0)

JPA - это каркас для объектно-реляционного преобразования (ORM - object-relational mapping) для сохранения Java-объектов в реляционных СУБД. Он был разработан специально для использования с EJB, но может использоваться и для любых других объектов Java. Используя аннотации, можно указать, какие объекты и поля будут сохраняться и к каким таблицам и столбцам базы данных их необходимо прикрепить. JPA поддерживает богатый язык запросов, похожий на SQL. Язык запросов позволяет:

  • Определять параметры запросов в виде списков: упорядоченного (обращение к элементам по индексу) или именованного (обращение по именам параметров).
  • Определять запросы для установления отношений между постоянными сущностями без использования конструкции JOIN (хотя при желании можно использовать и такую конструкцию).
  • Применять обычные SQL-подобные средства в критериях поиска (операторы сравнения, операция LIKE, операция BETWEEN и т.д.) и определять, каким образом обрабатывать результирующее множество (с помощью таких операторов, как DISTINCT, ORDER BY, GROUP BY и т.д.)

JPA вносит новые функциональные возможности в платформу Java EE, избавляя разработчиков от головной боли, которая возникала при работе с самодельными средствами сохранения объектов или применении подходов, зависимых от контейнера. Статья "Design enterprise applications with the EJB 3.0 Java Persistence API" является хорошей отправной точкой для более глубокого изучения этой темы.

Управление и безопасность

Java EE 5 требует все тех же трех спецификаций безопасности и управления, которые были доступны в предыдущих версиях:

  • Развертывание приложения (Application Deployment) предоставляет API для развертывания компонентов и приложений в контейнер Java EE. Инструменты могут получить доступ к этому API при развертывании кода в контейнер Java EE 5 без перезагрузки контейнера. Интегрированные среды разработки часто используют этот API, который позволяет быстро выполнять цикл кодирование/тестирование/исправление в процессе разработки.
  • Управление приложением (Application Management) определяет необходимые атрибуты и операции объектов, управляемых контейнером. Этот API совместим с различными стандартными отраслевыми протоколами управления.
  • Соглашение об авторизации для контейнеров (Java ACC, Authorization Contract for Containers) определяет семантику провайдеров безопасности и то, как авторизовать доступ к операциям управления с учетом этого соглашения. Это соглашение требует, чтобы контейнеры реализовывали интерфейсы, позволяющие использовать инструменты развертывания для управления ролями, использующимися для авторизации.

Каждая из этих спецификаций в Java EE 5 представляет собой обновления (с версии 1.0, введенной в J2EE 1.4, до версии 1.1) с минимальными изменениями, которые слишком подробны для этой статьи. В разделе Ресурсы приведены ссылки для получения более подробной информации о технологиях управления и безопасности в Java EE.

Пример приложения: The RideSynergy

В этом разделе приводится несколько примеров упрощенных моделей программирования в Java EE 5, помогающих повысить производительность разработчика. Из примеров можно увидеть, как эти модели позволяют быстро разработать приложение, содержащее конечную точку для Web-сервиса и клиент, используя EJB для бизнес-логики и JSF для разработки Web-интерфейса.

Ниже будет продемонстрировано применение технологий Java EE 5 на примере разработки простого Web-приложения для воображаемой службы RideSynergy (примеры кода см. в разделе Материалы для скачивания). RideSynergy помогает людям встречаться в сети и договариваться о совместном использовании автомобилей. (Концепция совместного использования автомобилей (carpooling) широко распространена в странах, где принято добираться на работу на личном автомобиле. Люди, живущие неподалёку, договариваются поочерёдно по пути на работу заезжать друг за другом, и, соответственно, по пути с работы развозить коллег по домам.) Приложение разработано с использованием NetBeans 5.5 и проверено на Sun Application Server 9.0_01 и WebSphere Application Server (Community Edition) 2.0.

RideSynergy работает следующим образом:

  • Принимает заявки на поездки и предложения через Web-страницу.
  • Если пользователь делает предложение о поездке, приложение отображает список заявок.
  • Если пользователь запрашивает поездку, то приложение отображает список подходящих предложений подвезти.
  • Для удобства пользователя приложение дает возможность посмотреть погоду на маршруте следования, так как погодные условия могут повлиять на решение пользователя о планируемой поездке.
  • Приложение предоставляет статистику заявок и предложений в виде Web-сервиса для использования в приложениях сторонних разработчиков.

Посетитель RideSynergy использует страницу, показанную на рисунке 1, для ввода предложения или запроса поездки, определения ZIP-кода (почтового индекса) места отправления и места назначения и ввода адреса электронной почты. Эта страница также дает возможность увидеть отчет о погоде в указанной местности.

Рисунок 1. Страница для запроса и предложения поездки RideSynergy
Рисунок 1. Страница для запроса и предложения поездки RideSynergy
Рисунок 1. Страница для запроса и предложения поездки RideSynergy

Если пользователь ввел предложение о поездке, то на странице результатов (см. рисунок 2) отобразится список соответствующих ему запросов на поездку. Если введен запрос на поездку, то в списке будут соответствующие предложения. Прогноз погоды появляется только в том случае, если установлен флажок Check Weather (Проверять погоду) на странице заявок и предложений. (Заметьте, что в реальном приложении отображается прогноз погоды на пять дней, а рисунок 2 для краткости обрезан.) Данные для отчета о погоде извлекаются из общедоступных Web-сервисов, таких как http://www.webservicex.net.

Рисунок 2. Страница результатов RideSynergy
Рисунок 2. Страница результатов RideSynergy
Рисунок 2. Страница результатов RideSynergy

Код, используемый в RideSynergy, демонстрирует простоту модели программирования Web-сервисов в Java EE 5: для определения конечной точки Web-сервиса используется JAX-WS с аннотацией, а клиент Web-сервиса создается с помощью утилиты wsimport. Также этот код демонстрирует основы JSF и то, насколько проста модель программирования EJB в Java EE 5.

Аннотации: больше работы с помощью меньшего количества кода

Функция RideSynergy, которая предоставляет статистику поездок в виде Web-сервиса, является убедительным примером того, как Java EE 5 позволяет делать больше работы с помощью меньшего количества кода. Эта функция реализована в классе RideStatistics, который демонстрирует аннотации Java EE 5 в их простейшем виде. Не стоит думать, что простота здесь достигается за счет потери мощности: этот пример показывает, насколько менее сложным является подход Java EE 5 к реализации этих возможностей по сравнению с J2EE 1.4.

Класс RideStatistics в листинге 1 реализует Web-сервис, который использует Stateless EJB-компонент RideManagerBean для просмотра количества предложений поездок, сделанных пользователями RideSynergy между пунктами с ZIP-кодами, определенными клиентом Web-сервиса. Интерфейс RideManagerRemote определяет методы RideManagerBean, которые доступны из клиентского кода вне зависимости от того, выполняется он на той же самой JVM или нет.

Листинг 1. Web-сервис RideStatistics
package com.ridesynergy;

import java.util.Set;
import javax.ejb.EJB;
import javax.jws.WebService;

/**
 * Web-сервис, который выдает количество предложений поездок из конкретного 
 * ZIP-кода
 *
 * @author smoore
 */
@WebService
public class RideStatistics {

   @EJB
   RideManagerRemote rideManager;

  /** Создание нового экземпляра RideStatistics */
  public RideStatistics() {
  }

   public Integer rideOffersFromZipCode(Integer zipCode) {
      Set<Ride< results = rideManager.findCloseOfferMatches(zipCode, 0);
      return new Integer(results.size());
}

   public Integer rideOffersToZipCode(Integer zipCode) {
      Set<Ride< results = rideManager.findCloseOfferMatches(0, zipCode);
      return new Integer(results.size());
   }
}

Листинг 1 содержит две аннотации: @WebService и @EJB. Сначала рассмотрим, каким образом аннотация @EJB реализует прием dependency injection (подключение компонентов, от которых зависит наш компонент) для доступа к EJB-компонентам. Далее будет показано, как аннотация @WebService позволяет сделать POJO полноправной конечной точкой Web-сервиса.

Подключение необходимых компонентов

Читатель, знакомый с программированием EJB в J2EE 1.4, может посмотреть на листинг 1 и спросить: "действительно ли так просто получить ссылку на EJB?". Дело в том, что аннотация @EJB позволяет упростить модель программирования, основанную на подключении (инъекции) компонентов, необходимых для функционирования Web-сервисы.

Аннотация @EJB устраняет необходимость писать код, который в J2EE 1.4 выглядел бы похоже на приведенный в листинге 2:

Листинг 2: Клиент RideManagerBean в версии до Java EE 5
. . .
   Context initial = new InitialContext();
   Context myEnv = (Context) initial.lookup("java:comp/env");
   Object obj = myEnv.lookup("ejb/RideManager");
   RideManagerHome home = (RideManagerHome) PortableRemoteObject.narrow(
         obj, RideManagerRemote.class);
   RideManager manager = home.create();
. . .

В модели программирования EJB 3.0, поддерживаемой Java EE 5, аннотация @EJB означает, что нужно подключить зависимость RideStatistics от RideManagerRemote, а не требовать, чтобы RideStatistics нашел ссылку, используя JNDI.

Это также устраняет необходимость прямой зависимости от пакета, в котором находится RideManagerRemote. Обратите внимание на выражения import; здесь не импортируется RideManagerRemote (и да, это компилируется!). В результате можно выполнить рефакторинг с переносом RideManagerRemote в другой пакет, и это не приведет к необходимости обновлять и перекомпилировать RideStatistics.

Аннотации также дают множество преимуществ с другой стороны рассматриваемой зависимости: со стороны EJB-компонента, который представляет реализацию RideManagerRemote и указывает контейнеру Java EE 5, что с ним делать. Это будет рассмотрено ниже.

Сложное поведение во время выполнения

При развертывании в контейнере Java EE 5 аннотация @WebService в листинге 1 обрабатывается с помощью JAX-WS и превращает класс RideStatistics в полноценную конечную точку Web-сервиса с двумя операциями: rideOffersFromZipCode и rideOffersFromToZipCode. JAX-WS обрабатывает все технические детали, необходимые для предоставления Web-сервиса, в том числе генерацию WSDL-документа (Web Services Description Language - язык описания Web-сервисов), что позволяет другим приложениям в Web находить и использовать этот Web-сервис, а также обрабатывает механику ответов на запросы клиента к Web-сервису.

По умолчанию WSDL, который определяет JAX-WS для службы RideStatistics, располагается по адресу: http://server:port/ridesynergy2-war/RideStatisticsService?WSDL. Для просмотра этого WSDL-документа нужно:

  1. Скачать enterprise-архив приложения RideSynergy, ridesynergy2.ear (см. раздел "Материалы для скачивания") и развернуть его в контейнере Java EE 5.
  2. Заменить значения server и port в расположении по умолчанию на имя хоста и порт используемого контейнера.
  3. Открыть полученный URL-адрес в браузере.

Более сложные аннотации

Аннотации в листинге 1 представляют собой простые аннотации. Аннотации также могут принимать именованные параметры (named elements), которые схожи с параметрами метода, за исключением того, что порядок и количество параметров не имеют никакого значения, поскольку каждый из них именован. Использование именованных параметров похоже на передачу в аннотацию таблицы с ключами (map), которая содержит пары ключ/значение, влияющие на обработку аннотации.

Интерфейс WeatherForecastSoap (показанный в листинге 3), который был создан инструментом wsimport в JAX-WS, содержит аннотации, принимающие именованные параметры. В листинге 3 приведен код интерфейса WeatherForecastSoap:

Listing 3: Интерфейс WeatherForecastSoap
. . .  
   @WebMethod(operationName = "GetWeatherByZipCode", 
       action = "http://www.webservicex.net/GetWeatherByZipCode")
   public WeatherForecasts getWeatherByZipCode(
      @WebParam(name = "ZipCode", 
     targetNamespace = "http://www.webservicex.net")
     String zipCode);
. . .

В листинге 3 указана аннотация @WebMethod для метода getWeatherByZipCode(), которая состоит из двух именованных элементов: operationName и action. Этот пример также содержит аннотацию @WebParam для параметра zipCode метода getWeatherByZipCode() с именованными элементами name и targetNamespace. (Заметьте, что в реальном приложении метод getWeatherByZipCode() имеет и другие аннотации, но здесь они опущены для краткости.)

Получить более подробную информацию об аннотациях можно по ссылке Annotations в разделе "Ресурсы".

Объявление stateless сеансового EJB-компонента

В листинге 4 показано объявление класса RideManagerBean - stateless сеансового EJB-компонента, который реализует интерфейс RideManagerRemote, используемый в листинге 1:

Листинг 4: Объявление stateless session EJB-компонента
. . .
@Stateless
public class RideManagerBean implements RideManagerRemote {
. . .

В J2EE 1.4 этому EJB пришлось бы реализовать интерфейс SessionBean, требующий реализации шести методов. Во многих случаях реализация этих методов остается пустой и существует лишь для соответствия интерфейсу и возможности компиляции кода, что засоряет код. В EJB 3.0 с этой проблемой покончено путем предоставления аннотаций жизненного цикла @PostConstruct, @PreDestroy, @PostActivate и @PrePassivate. Эти аннотации можно добавлять по мере необходимости к любому public-методу без параметров и с возвращаемым типом void для реагирования на события жизненного цикла.

Аннотации как замена дескрипторов развертывания

Аннотации в Java EE 5 также устраняют большой объем конфигурационного кода, который был необходим в ранних версиях Java EE. Например, аннотация @Stateless в листинге 4 устраняет необходимость в дескрипторе развертывания EJB, который представляет собой конфигурационный XML-файл, предоставляющий контейнеру подробную информацию о EJB-компоненте. В предыдущих платформах Java EE такой дескриптор представлял собой XML-файл, соответствующий схеме EJB 2.1. Часть конфигурации RideManagerBean и необходимых для него интерфейсов выглядела бы так, как показано в Листинге 5:

Листинг 5: Дескриптор развертывания в версиях до Java EE 5
<display-name>RideManagerJAR</display-name>
<enterprise-beans>
   <session>
      <ejb-name>RideManagerBean</ejb-name>
      <home>com.ridesynergy.RideManagerHome</home>
      <remote>com.ridesynergy.RideManager</remote>
      <ejb-class>com.ridesynergy.RideManagerBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Bean</transaction-type>
      <security-identity>
          <use-caller-identity/>
      </security-identity>
   </session>
</enterprise-beans>

Java EE 5 имеет обратную совместимость с дескрипторами развертывания EJB. Можно даже сочетать подходы, продолжая в унаследованном коде использовать дескрипторы развертывания EJB, а новые EJB-компоненты объявлять с аннотациями.

Помимо сокращения количества кода, аннотации позволяют воспользоваться тем, что архитектор Sun Грэм Гамильтон называет "truth-in-source-code" (см. раздел "Ресурсы"): в надлежащем образом аннотированном классе не нужно одновременно смотреть на исходный код и конфигурационные файлы, чтобы понять, что происходит, потому что аннотации, определяющие поведение, находятся прямо в коде.

Для изучения других примеров того, как аннотации облегчают разработку приложений на Java EE 5, рекомендуется статья Роланда Барсии "Get to know Java EE 5".

Разумные значения по умолчанию

Тот факт, что RideStatistics можно сделать Web-сервисом, просто добавив одну аннотацию, также иллюстрирует другой принцип проектирования Java EE 5: упрощение модели программирования за счет разумных умолчаний.

В данном случае JAX-WS предполагает, что любой общедоступный метод в классе с аннотацией @WebService должен быть превращен в операцию Web-сервиса с тем же самым именем. Аналогичные предположения делаются при обработке входных и выходных параметров этих методов. Если поведение по умолчанию не подходит, его всегда можно изменить, создав аннотации для методов. Но во многих случаях вам, вероятно, потребуется, чтобы термины, использующиеся в Web-сервисе, соответствовали терминам в классе, который реализует Web-сервис, и JAX-WS легко позволяет это сделать за счет разумных умолчаний.

Заключение

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

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

Команды разработчиков, которые раньше избегали технологии Java EE в своих разработках, следует оценить ее свежим взглядом, а тем, кто сопровождает существующие J2EE приложения, следует изучить возможности Java EE 5, которые могут сделать их жизнь намного легче.


Ресурсы для скачивания


Похожие темы


Комментарии

Войдите или зарегистрируйтесь для того чтобы оставлять комментарии или подписаться на них.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Технология Java
ArticleID=416499
ArticleTitle=Java EE 5: Мощь и производительность при меньшей сложности
publish-date=07242009