Программисты, которые долгое время работают с технологиями разработки Web-приложений, представленными в последних двух лекциях, отмечают ряд неудобств, связанных с разработкой отдельных компонентов, построением приложения в целом и настройкой отдельных аспектов его работы. В данной лекции рассказывается о развитии
В ряде аспектов разработка отдельных компонентов в рамках .NET несколько проще, чем разработка компонентов с той же функциональностью в рамках J2EE версии 1.4. В то же время, разработка приложений в целом в рамках J2EE проще для начинающих разработчиков, поскольку имеющаяся по этой платформе документация четче определяет общую структуру приложений и распределение ответственности между разными типами компонентов в нем.
Большим достоинством J2EE является прозрачность и предсказуемость ее развития, поскольку все его шаги открыты в рамках четко определенного процесса компании Sun для внесения изменений в спецификации платформы и на каждом из этих шагов учитываются интересы множества участников. Развитие платформы J2EE определяется большим количеством открытых проектов отдельных разработчиков и организаций, предлагающих свои решения по построению сред функционирования Web-приложений (Web
Развитие же платформы .NET находится целиком в руках компании Microsoft и пока не является прозрачным для тех, кто не работает в ней или в одной из близких к ней компаний-партнеров. На основании выступлений отдельных представителей компании можно делать выводы, касающиеся лишь общих планов развития платформы, без каких-либо технических деталей. Поэтому в данной лекции рассматриваются, в основном, направления развития технологий J2EE.
Ряд разработчиков выделяет следующие проблемы удобства разработки и поддержки приложений J2EE версии 1.4.
Для разработки такого простейшего компонента необходимо определить два интерфейса, класс компонента и написать
Полученные классы и интерфейсы достаточно сильно отличаются от обычных классов Java, с помощью которых разработчики описывали бы предметную область в рамках обычного приложения на платформе
Данные класса-предка и класса-наследника могут храниться в одной таблице, в разных и несвязанных таблицах, или общая часть данных может храниться в одной таблице, а специфические данные класса-наследника — в другой. Однако для обеспечения правильной синхронизации данных в каждом из этих случаев достаточно много кода надо написать вручную. Поскольку во многих приложениях объектные модели данных содержат классы, связанные отношением наследования, отсутствие вспомогательных механизмов, автоматически обеспечивающих отображение таких классов на структуру базы данных, приносит много неудобств.
Часто такая возможность оказывается удобной при программировании различных методов обработки данных внутри приложений.
При этом необходимо полностью проанализировать запрос, часто — найти в содержащемся в нем документе HTML поля формы, заполненной пользователем, и указанную им операцию их обработки. Только после этого можно переходить к собственно выполнению этого запроса, что, казалось бы, является основной функцией сервлета. Таким образом, большое количество усилий тратится только на то, чтобы выделить из запроса операцию, которую пользователь хочет произвести, а также ее аргументы.
Для решения этих проблем используются различные библиотеки, инструменты и компонентные среды, созданные в сообществе Java-разработчиков. Некоторые такие библиотеки и техники станут стандартными средствами в рамках платформы J2EE новой версии 5.0 [1].
Среда Jakarta
Основные решаемые такими компонентами задачи можно сформулировать следующим образом:
Как и в рамках базовой платформы J2EE, в
(рис 15.1) Общая схема архитектуры Web-приложений на основе StrutsВ рамках приложения на основе org.apache. из библиотеки ActionForward execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) — именно он и вызывается для выполнения этого действия.
Один из параметров метода execute() в классе действия имеет тип формы действия org.apache.. Для каждого действия определяется свой класс формы действия, наследующий классу ActionForm. Объекты этого класса используются для передачи параметров действия — наиболее существенных данных запросов, описывающих данное действие.
В методе execute() класса действия обычно строятся или находятся компоненты бизнес-логики приложения, которые реализуют операции, соответствующие данному действию, а затем эти операции выполняются со значениями полей объекта формы действия в качестве аргументов.
Привязка action-mappings. Одно действие описывается с помощью вложенного тега action, который имеет следующие атрибуты:
pathОпределяет шаблон URI, обращения к которым будут интерпретироваться как выполнение данного действия.
typeОпределяет имя класса данного действия.
nameЗадает уникальное имя для данного действия.
Привязка действий к определенным для них формам происходит с помощью тегов form-, вложенных в тег form-. Каждый тег form- имеет атрибут name, указывающий имя действия для данной формы, и type, указывающий имя класса формы действия. Кроме того, такой тег может содержать вложенные теги form-property, описывающие свойства формы (в смысле name (имя свойства) и type (тип свойства).
Помимо описанного механизма декомпозиции обработки запросов, среда
Java Server Faces ( javax.faces и две библиотеки пользовательских тегов, предназначенных для использования этих элементов управления в рамках элементы управления размещаются на странице, а с помощью тегов из описывается обработка событий, связанных с этими элементами, и проверка корректности действий пользователя.
В аспекте построения WebUI на основе
В дополнение к библиотекам элементов WebUI
Технология Java Server Face версии 1.2 войдет в состав будущей версии 5.0 платформы J2EE [6].
Технологии обеспечения синхронизации внутренних данных приложения и его базы данных развиваются в настоящий момент достаточно активно. Технология
Возможным решением этой задачи являются
Одним из наиболее широко применяемых и развитых в технологическом плане
Базовая парадигма, лежащая в основе избранного
Большое достоинство подобного подхода — возможность использовать один раз созданные наборы классов, представляющих понятия предметной области, в качестве модели данных любых приложений на основе Java, независимо от того, являются ли они распределенными или локальными, требуется ли в них синхронизация с базой данных и сохранение данных объектов или нет.
(рис 15.2) Реляционное представление данных о книгах и авторахНапример, для представления в объектном виде данных о книгах и их авторах, соответствующих показанной на рис. 15.2 группе таблиц, могут быть использованы представленные ниже классы:
import java.util.Set;
import java.util.HashSet;
public class Author
{
private int id;
private String firstName;
private String surname;
private Set books = new HashSet();
public int getId () { return this.id; }
private void setId (int id) { this.id = id; }
public String getFirstName () { return this.firstName; }
public void setFirstName (String firstName) { this.firstName = firstName; }
public String getSurname () { return this.surname; }
public void setSurname (String surname) { this.surname = surname; }
public Set getBooks () { return this.books; }
public void setBooks (Set books) { this.books = books; }
}
public class Book
{
private int id;
private String title;
private String isbn;
private Set authors = new HashSet();
public int getId () { return this.id; }
private void setId (int id) { this.id = id; }
public String getIsbn () { return this.isbn; }
public void setIsbn (String isbn) { this.isbn = isbn; }
public String getTitle () { return this.title; }
public void setTitle (String title) { this.title = title; }
public Set getAuthors () { return this.authors; }
public void setAuthors (Set authors) { this.authors = authors; }
}
Для определения отображения объектов этих классов в записи соответствующих таблиц используются конфигурационные файлы со следующим содержанием. Первый фрагмент представляет собой описание отображения объектов класса Author на записи таблицы Authors, которое обычно помещается в файл Author.
<hibernate-mapping>
<class name="Author" table="Authors">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="firstName" column="FirstName"/>
<property name="surname"/ column="Surname">
<set name="books" table="BookAuthors" inverse="true">
<key column="AuthorID"/>
<many-to-many column="BookID" class="Book"/>
</set>
</class>
</hibernate-mapping>
Второй фрагмент представляет собой содержание аналогичного файла Book.Book на записи таблицы Books.
<hibernate-mapping>
<class name="Book" table="Books">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="title" column="Title"/>
<property name="isbn"/ column="ISBN">
<set name="authors" table="BookAuthors" inverse="true">
<key column="BookID"/>
<many-to-many column="AuthorID" class="Author"/>
</set>
</class>
</hibernate-mapping>
При использовании объектов указанных классов в рамках приложения на основе
Кроме того,
В приложениях на основе
C помощью дополнительной службы NHibernate [7] возможности среды
Еще более упростить разработку объектно-ориентированных приложений, данные которых могут храниться в базах данных, призвана технология Java Data Objects (
В ее основе тоже лежит использование для работы с хранимыми данными обычных классов на Java, но в качестве хранилища данных может выступать не только реляционная СУБД, но вообще любое хранилище данных, имеющее соответствующий специализированный адаптер (в рамках javax. ). Основная функция этого адаптера — прозрачная для разработчиков синхронизация хранилища данных и набора хранимых объектов в памяти приложения. Он должен также обеспечивать достаточно высокую производительность приложения, несмотря на наличие нескольких промежуточных слоев между классами самого приложения и хранилищем данных, представляемых ими.
Использование
В дополнение
В целом, подход
Enterprise
В рамках следующей, пятой версии платформы J2EE [6] будет использоваться новый набор техник для построения компонентов
Стандарт
В рамках нового стандарта для создания компонента требуется описать только один класс, который не должен наследовать какому-то библиотечному классу или реализовывать какой бы то ни было интерфейс. Объекты этого класса могут быть как хранимыми, так и временными.
Различные описатели свойств компонента и его методов можно оформлять в виде аннотаций, стандартной конструкции для описания метаданных в Java 5. Примерами таких описателей являются: указание вида компонента — компонент данных или сеансовый; отображение свойств класса в поля таблиц и ссылки между ними; отметки нехранимых свойств и полей; отметки специальных методов, вызываемых при переходе между этапами жизненного цикла компонента; транзакционные атрибуты методов и пр. Заметим, что в .NET использование для этого аналогов аннотаций, атрибутов, уже реализовано. Остается и возможность использовать для этих целей XML-дескрипторы, аналогичные используемым в
Среда
Основная задача, на решение которой нацелена среда
Обращением управления называют отсутствие обращений из кода компонентов приложения к какому-либо API, предоставляемому средой и ее библиотеками. Вместо этого компоненты приложения реализуют только функции, необходимые для работы в рамках предметной области и решения тех задач, с которыми приложению придется иметь дело. Построение из этих компонентов готового приложения, конфигурация отдельных его элементов и связей между ними — это дело среды, которая сама в определенные моменты обращается к нужным операциям компонентов. Конфигурация компонентов приложения в среде
Другое название механизма обращения управления — встраивание зависимостей (dependency injection) — связано с возможностью указывать в коде приложения только интерфейсы некоторых объектов, а их точный класс, как и способ их получения (создание нового объекта, поиск при помощи службы каталогов, обращение к фабрике объектов и пр.) — описывать только в конфигурационном файле. Такой механизм позволяет разделить использование объектов и их конфигурацию и менять их независимо друг от друга.
Аналогичный механизм предполагается использовать и в рамках @Resource Type object; некоторый объект может быть объявлен в коде как подлежащий отдельной конфигурации, а в конфигурационном файле для объекта с именем object указывается его точный тип и способ инициализации.
Аспектно-ориентированный подход к программированию основан на выделении аспектов — отдельных задач, решаемых приложением — таким образом, чтобы их решение можно было организовать в виде выполнения определенных действий каждый раз, когда выполняется определенный элемент кода в ходе работы программы. При этом действия в рамках данного аспекта не должны зависеть от других аспектов и остальных действий, выполняемых программой. Не все задачи могут быть представлены как аспекты. Поэтому
Примером указаний могут служить трассировка параметров вызова метода или проверка корректности инициализации полей объекта. В качестве примеров точек вставки можно привести момент перед вызовом определенного метода или сразу после такого вызова, момент после инициализации определенного объекта или перед его уничтожением. Сечения могут описываться условиями типа "перед вызовом в данном объекте метода, чье имя начинается на "get" " или "перед уничтожением объекта класса A со значением поля value, превышающим 0 ".
При помощи
Похожим образом поддерживается интеграция с различными реализациями служб поддержки транзакций и декларативное управление транзакциями. Методам обычного класса Java в конфигурационном файле (или с помощью аннотаций Java 5) можно приписать определенные транзакционные атрибуты, а также набор типов исключительных ситуаций, вызывающих откат транзакции. Для сравнения — в java.lang.RuntimeException, java.lang.Error или javax., вызывают автоматический откат транзакции. Адаптер конкретной реализации службы транзакций также указывается в конфигурации приложения.
Использование обращения управления позволяет также упростить описание конфигурации
Рассказывая о развитии технологий разработки Web-приложений, невозможно обойти вниманием набор техник, известный под названием Ajax [16,17] и используемый для снижения времени реакции Web-интерфейсов на действия пользователя.
Вообще говоря, Web-технологии не очень хорошо приспособлены для построения пользовательского интерфейса интерактивных приложений, т.е. таких, где пользователь достаточно часто выполняет какие-то действия, на которые приложение должно реагировать. Они изначально разрабатывались для предоставления доступа к статической информации, которая меняется редко и представлена в виде набора HTML-страниц. Обычно при обмене данными между Web-клиентом и Web-сервером клиент изредка посылает серверу простые и небольшие по объему запросы, а тот в ответ может присылать достаточно объемные документы.
В интерактивных приложениях обмен данными между интерфейсными элементами приложения и обработчиками запросов несколько иной. Обработчик достаточно часто получает запросы и небольшие наборы их параметров, а изменения, которые происходят в интерфейсе после получения ответа на запрос, обычно тоже невелики. Часто нужно изменить содержание лишь части показываемой браузером страницы, в то время как остальные ее элементы представляют более стабильную информацию, являющуюся элементом дизайна сайта или набором пунктов его меню. Для отражения этих изменений не обязательно пересылать с сервера весь HTML-документ, что предполагается в рамках традиционного обмена информацией с помощью Web. Точно так же, если бы корректность вводимых пользователем данных можно было бы проверить на стороне клиента, обработка некорректного ввода происходила бы гораздо быстрее и не требовала бы вообще никакого обмена данными с сервером.
Ajax пытается решить эти задачи при помощи комбинации кода на JavaScript, выполняющегося в браузере, и передаваемых время от времени между клиентом и сервером специальных XML-сообщений, содержащих только существенную информацию о запросе или изменениях HTML-страницы, которые должны быть показаны. В рамках браузера в отдельном потоке работает ядро Ajax, которое получает сообщения JavaScript-кода о выполнении пользователем определенных действий, выполняет проверку их корректности, преобразует их в посылку соответствующего запроса на сервер, преобразует ответ сервера в новую страницу или же выдает уже имеющийся в специальном кэше ответ. Запросы на сервер и их обработка осуществляются часто асинхронно с действиями пользователя, позволяя заметно снизить ощущаемое время реакции системы на них.
На настоящий момент Ajax еще не является полноценным элементом
В настоящее время совместно с компонентными технологиями на базе J2EE и .NET широкое распространение получают
Контракт службы не должен зависеть от истории обращений к ней или к другим службам. Но он может зависеть, например, от состояния каких-либо хранилищ данных.
Архитектура приложений, построенных из компонентов, являющихся такими службами, называется архитектурой, основанной на службах (service oriented architecture,
Практически единственным широко используемым видом служб являются
(рис 15.3) Схема архитектуры приложений на основе Web-службОсновное назначение
Таким образом,
Схема архитектуры приложений на основе
После создания новой службы ее поставщик — организация или частное лицо, которое предоставляет ее, — регистрирует службу у брокера
Клиент, которому понадобилась некоторая услуга, обращается к брокеру
Использование на всех этапах описанного процесса стандартных описаний в форматах, основанных на XML, позволяет полностью автоматизировать его.
Языком описания интерфейса
Описание интерфейса работы с
<types>. Они могут основываться на встроенных XML-типах и использовать <message> описываются типы сообщений, которыми стороны могут обмениваться в ходе работы службы. Для сообщения указывается, является ли оно входящим или исходящим, а его структура описывается в терминах определенных ранее типов данных.<binding> определяется привязка интерфейсов к их реализациям. Она задает конкретные форматы сообщений и протоколы их посылки/получения для некоторого интерфейса. Один интерфейс может иметь несколько привязок.<port> определяет порт, задающий конкретные адрес и порт некоторой привязки, а также, возможно, транспортный протокол для передачи сообщений на этот адрес.<service> описывает службу целиком, указывая набор портов для доступа к различным ее интерфейсам.Связь между
Формат сообщений
Простой пример
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
<t:Transaction
xmlns:t="http://company.com/soap-headers/attrs"
SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="http://company.com/web-services/trading">
<symbol>DEF</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Кроме определения формата сообщений, протокол
Роль служб именования и каталогов в приложениях на основе
Существует всего лишь несколько универсальных реестров, регистрирующих любые доступные в Интернет
businessEntity. Такой документ описывает организацию (или лицо), предоставляющую набор businessService. Это список bindingTemplate. Описывает технические аспекты предоставляемых служб, в частности, адреса, к которым нужно обращаться, списки дополнительных описаний (tModels).tModel (technical model). Содержит дополнительную информацию о службе, в частности, предоставляемые ею услуги, условия и ограничения ее использования, предоставляемые гарантии и пр.Помимо структуры реестра,
Поскольку
Базовые и общепризнанные стандарты построения
Одной из попыток стандартизации протоколов совместной работы
Для обеспечения целостности при совместной работе нескольких служб могут использоваться технологии на основе стандартов WS-Transactions и WS-BusinessActivity [18,26], построенных на базе WS-Coordination.
Задачи синхронизации могут решаться с помощью средств, помогающих строить приложения на основе композиции
Возможность обеспечения отказоустойчивости
Для обеспечения отказоустойчивости при передаче сообщений разрабатывается дополнительный стандарт WS-Reliability [28], расширяющий
Наиболее вероятным кандидатом на место широко используемого стандарта защиты информации, передаваемой в сообщениях при работе с
Он расширяет
Программисты, которые долгое время работают с технологиями разработки Web-приложений, представленными в последних двух лекциях, отмечают ряд неудобств, связанных с разработкой отдельных компонентов, построением приложения в целом и настройкой отдельных аспектов его работы. В данной лекции рассказывается о развитии
В ряде аспектов разработка отдельных компонентов в рамках .NET несколько проще, чем разработка компонентов с той же функциональностью в рамках J2EE версии 1.4. В то же время, разработка приложений в целом в рамках J2EE проще для начинающих разработчиков, поскольку имеющаяся по этой платформе документация четче определяет общую структуру приложений и распределение ответственности между разными типами компонентов в нем.
Большим достоинством J2EE является прозрачность и предсказуемость ее развития, поскольку все его шаги открыты в рамках четко определенного процесса компании Sun для внесения изменений в спецификации платформы и на каждом из этих шагов учитываются интересы множества участников. Развитие платформы J2EE определяется большим количеством открытых проектов отдельных разработчиков и организаций, предлагающих свои решения по построению сред функционирования Web-приложений (Web
Развитие же платформы .NET находится целиком в руках компании Microsoft и пока не является прозрачным для тех, кто не работает в ней или в одной из близких к ней компаний-партнеров. На основании выступлений отдельных представителей компании можно делать выводы, касающиеся лишь общих планов развития платформы, без каких-либо технических деталей. Поэтому в данной лекции рассматриваются, в основном, направления развития технологий J2EE.
Ряд разработчиков выделяет следующие проблемы удобства разработки и поддержки приложений J2EE версии 1.4.
Для разработки такого простейшего компонента необходимо определить два интерфейса, класс компонента и написать
Полученные классы и интерфейсы достаточно сильно отличаются от обычных классов Java, с помощью которых разработчики описывали бы предметную область в рамках обычного приложения на платформе
Данные класса-предка и класса-наследника могут храниться в одной таблице, в разных и несвязанных таблицах, или общая часть данных может храниться в одной таблице, а специфические данные класса-наследника — в другой. Однако для обеспечения правильной синхронизации данных в каждом из этих случаев достаточно много кода надо написать вручную. Поскольку во многих приложениях объектные модели данных содержат классы, связанные отношением наследования, отсутствие вспомогательных механизмов, автоматически обеспечивающих отображение таких классов на структуру базы данных, приносит много неудобств.
Часто такая возможность оказывается удобной при программировании различных методов обработки данных внутри приложений.
При этом необходимо полностью проанализировать запрос, часто — найти в содержащемся в нем документе HTML поля формы, заполненной пользователем, и указанную им операцию их обработки. Только после этого можно переходить к собственно выполнению этого запроса, что, казалось бы, является основной функцией сервлета. Таким образом, большое количество усилий тратится только на то, чтобы выделить из запроса операцию, которую пользователь хочет произвести, а также ее аргументы.
Для решения этих проблем используются различные библиотеки, инструменты и компонентные среды, созданные в сообществе Java-разработчиков. Некоторые такие библиотеки и техники станут стандартными средствами в рамках платформы J2EE новой версии 5.0 [1].
Среда Jakarta
Основные решаемые такими компонентами задачи можно сформулировать следующим образом:
Как и в рамках базовой платформы J2EE, в
(рис 15.1) Общая схема архитектуры Web-приложений на основе StrutsВ рамках приложения на основе org.apache. из библиотеки ActionForward execute(ActionMapping, ActionForm, HttpServletRequest, HttpServletResponse) — именно он и вызывается для выполнения этого действия.
Один из параметров метода execute() в классе действия имеет тип формы действия org.apache.. Для каждого действия определяется свой класс формы действия, наследующий классу ActionForm. Объекты этого класса используются для передачи параметров действия — наиболее существенных данных запросов, описывающих данное действие.
В методе execute() класса действия обычно строятся или находятся компоненты бизнес-логики приложения, которые реализуют операции, соответствующие данному действию, а затем эти операции выполняются со значениями полей объекта формы действия в качестве аргументов.
Привязка action-mappings. Одно действие описывается с помощью вложенного тега action, который имеет следующие атрибуты:
pathОпределяет шаблон URI, обращения к которым будут интерпретироваться как выполнение данного действия.
typeОпределяет имя класса данного действия.
nameЗадает уникальное имя для данного действия.
Привязка действий к определенным для них формам происходит с помощью тегов form-, вложенных в тег form-. Каждый тег form- имеет атрибут name, указывающий имя действия для данной формы, и type, указывающий имя класса формы действия. Кроме того, такой тег может содержать вложенные теги form-property, описывающие свойства формы (в смысле name (имя свойства) и type (тип свойства).
Помимо описанного механизма декомпозиции обработки запросов, среда
Java Server Faces ( javax.faces и две библиотеки пользовательских тегов, предназначенных для использования этих элементов управления в рамках элементы управления размещаются на странице, а с помощью тегов из описывается обработка событий, связанных с этими элементами, и проверка корректности действий пользователя.
В аспекте построения WebUI на основе
В дополнение к библиотекам элементов WebUI
Технология Java Server Face версии 1.2 войдет в состав будущей версии 5.0 платформы J2EE [6].
Технологии обеспечения синхронизации внутренних данных приложения и его базы данных развиваются в настоящий момент достаточно активно. Технология
Возможным решением этой задачи являются
Одним из наиболее широко применяемых и развитых в технологическом плане
Базовая парадигма, лежащая в основе избранного
Большое достоинство подобного подхода — возможность использовать один раз созданные наборы классов, представляющих понятия предметной области, в качестве модели данных любых приложений на основе Java, независимо от того, являются ли они распределенными или локальными, требуется ли в них синхронизация с базой данных и сохранение данных объектов или нет.
(рис 15.2) Реляционное представление данных о книгах и авторахНапример, для представления в объектном виде данных о книгах и их авторах, соответствующих показанной на рис. 15.2 группе таблиц, могут быть использованы представленные ниже классы:
import java.util.Set;
import java.util.HashSet;
public class Author
{
private int id;
private String firstName;
private String surname;
private Set books = new HashSet();
public int getId () { return this.id; }
private void setId (int id) { this.id = id; }
public String getFirstName () { return this.firstName; }
public void setFirstName (String firstName) { this.firstName = firstName; }
public String getSurname () { return this.surname; }
public void setSurname (String surname) { this.surname = surname; }
public Set getBooks () { return this.books; }
public void setBooks (Set books) { this.books = books; }
}
public class Book
{
private int id;
private String title;
private String isbn;
private Set authors = new HashSet();
public int getId () { return this.id; }
private void setId (int id) { this.id = id; }
public String getIsbn () { return this.isbn; }
public void setIsbn (String isbn) { this.isbn = isbn; }
public String getTitle () { return this.title; }
public void setTitle (String title) { this.title = title; }
public Set getAuthors () { return this.authors; }
public void setAuthors (Set authors) { this.authors = authors; }
}
Для определения отображения объектов этих классов в записи соответствующих таблиц используются конфигурационные файлы со следующим содержанием. Первый фрагмент представляет собой описание отображения объектов класса Author на записи таблицы Authors, которое обычно помещается в файл Author.
<hibernate-mapping>
<class name="Author" table="Authors">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="firstName" column="FirstName"/>
<property name="surname"/ column="Surname">
<set name="books" table="BookAuthors" inverse="true">
<key column="AuthorID"/>
<many-to-many column="BookID" class="Book"/>
</set>
</class>
</hibernate-mapping>
Второй фрагмент представляет собой содержание аналогичного файла Book.Book на записи таблицы Books.
<hibernate-mapping>
<class name="Book" table="Books">
<id name="id" column="ID">
<generator class="increment"/>
</id>
<property name="title" column="Title"/>
<property name="isbn"/ column="ISBN">
<set name="authors" table="BookAuthors" inverse="true">
<key column="BookID"/>
<many-to-many column="AuthorID" class="Author"/>
</set>
</class>
</hibernate-mapping>
При использовании объектов указанных классов в рамках приложения на основе
Кроме того,
В приложениях на основе
C помощью дополнительной службы NHibernate [7] возможности среды
Еще более упростить разработку объектно-ориентированных приложений, данные которых могут храниться в базах данных, призвана технология Java Data Objects (
В ее основе тоже лежит использование для работы с хранимыми данными обычных классов на Java, но в качестве хранилища данных может выступать не только реляционная СУБД, но вообще любое хранилище данных, имеющее соответствующий специализированный адаптер (в рамках javax. ). Основная функция этого адаптера — прозрачная для разработчиков синхронизация хранилища данных и набора хранимых объектов в памяти приложения. Он должен также обеспечивать достаточно высокую производительность приложения, несмотря на наличие нескольких промежуточных слоев между классами самого приложения и хранилищем данных, представляемых ими.
Использование
В дополнение
В целом, подход
Enterprise
В рамках следующей, пятой версии платформы J2EE [6] будет использоваться новый набор техник для построения компонентов
Стандарт
В рамках нового стандарта для создания компонента требуется описать только один класс, который не должен наследовать какому-то библиотечному классу или реализовывать какой бы то ни было интерфейс. Объекты этого класса могут быть как хранимыми, так и временными.
Различные описатели свойств компонента и его методов можно оформлять в виде аннотаций, стандартной конструкции для описания метаданных в Java 5. Примерами таких описателей являются: указание вида компонента — компонент данных или сеансовый; отображение свойств класса в поля таблиц и ссылки между ними; отметки нехранимых свойств и полей; отметки специальных методов, вызываемых при переходе между этапами жизненного цикла компонента; транзакционные атрибуты методов и пр. Заметим, что в .NET использование для этого аналогов аннотаций, атрибутов, уже реализовано. Остается и возможность использовать для этих целей XML-дескрипторы, аналогичные используемым в
Среда
Основная задача, на решение которой нацелена среда
Обращением управления называют отсутствие обращений из кода компонентов приложения к какому-либо API, предоставляемому средой и ее библиотеками. Вместо этого компоненты приложения реализуют только функции, необходимые для работы в рамках предметной области и решения тех задач, с которыми приложению придется иметь дело. Построение из этих компонентов готового приложения, конфигурация отдельных его элементов и связей между ними — это дело среды, которая сама в определенные моменты обращается к нужным операциям компонентов. Конфигурация компонентов приложения в среде
Другое название механизма обращения управления — встраивание зависимостей (dependency injection) — связано с возможностью указывать в коде приложения только интерфейсы некоторых объектов, а их точный класс, как и способ их получения (создание нового объекта, поиск при помощи службы каталогов, обращение к фабрике объектов и пр.) — описывать только в конфигурационном файле. Такой механизм позволяет разделить использование объектов и их конфигурацию и менять их независимо друг от друга.
Аналогичный механизм предполагается использовать и в рамках @Resource Type object; некоторый объект может быть объявлен в коде как подлежащий отдельной конфигурации, а в конфигурационном файле для объекта с именем object указывается его точный тип и способ инициализации.
Аспектно-ориентированный подход к программированию основан на выделении аспектов — отдельных задач, решаемых приложением — таким образом, чтобы их решение можно было организовать в виде выполнения определенных действий каждый раз, когда выполняется определенный элемент кода в ходе работы программы. При этом действия в рамках данного аспекта не должны зависеть от других аспектов и остальных действий, выполняемых программой. Не все задачи могут быть представлены как аспекты. Поэтому
Примером указаний могут служить трассировка параметров вызова метода или проверка корректности инициализации полей объекта. В качестве примеров точек вставки можно привести момент перед вызовом определенного метода или сразу после такого вызова, момент после инициализации определенного объекта или перед его уничтожением. Сечения могут описываться условиями типа "перед вызовом в данном объекте метода, чье имя начинается на "get" " или "перед уничтожением объекта класса A со значением поля value, превышающим 0 ".
При помощи
Похожим образом поддерживается интеграция с различными реализациями служб поддержки транзакций и декларативное управление транзакциями. Методам обычного класса Java в конфигурационном файле (или с помощью аннотаций Java 5) можно приписать определенные транзакционные атрибуты, а также набор типов исключительных ситуаций, вызывающих откат транзакции. Для сравнения — в java.lang.RuntimeException, java.lang.Error или javax., вызывают автоматический откат транзакции. Адаптер конкретной реализации службы транзакций также указывается в конфигурации приложения.
Использование обращения управления позволяет также упростить описание конфигурации
Рассказывая о развитии технологий разработки Web-приложений, невозможно обойти вниманием набор техник, известный под названием Ajax [16,17] и используемый для снижения времени реакции Web-интерфейсов на действия пользователя.
Вообще говоря, Web-технологии не очень хорошо приспособлены для построения пользовательского интерфейса интерактивных приложений, т.е. таких, где пользователь достаточно часто выполняет какие-то действия, на которые приложение должно реагировать. Они изначально разрабатывались для предоставления доступа к статической информации, которая меняется редко и представлена в виде набора HTML-страниц. Обычно при обмене данными между Web-клиентом и Web-сервером клиент изредка посылает серверу простые и небольшие по объему запросы, а тот в ответ может присылать достаточно объемные документы.
В интерактивных приложениях обмен данными между интерфейсными элементами приложения и обработчиками запросов несколько иной. Обработчик достаточно часто получает запросы и небольшие наборы их параметров, а изменения, которые происходят в интерфейсе после получения ответа на запрос, обычно тоже невелики. Часто нужно изменить содержание лишь части показываемой браузером страницы, в то время как остальные ее элементы представляют более стабильную информацию, являющуюся элементом дизайна сайта или набором пунктов его меню. Для отражения этих изменений не обязательно пересылать с сервера весь HTML-документ, что предполагается в рамках традиционного обмена информацией с помощью Web. Точно так же, если бы корректность вводимых пользователем данных можно было бы проверить на стороне клиента, обработка некорректного ввода происходила бы гораздо быстрее и не требовала бы вообще никакого обмена данными с сервером.
Ajax пытается решить эти задачи при помощи комбинации кода на JavaScript, выполняющегося в браузере, и передаваемых время от времени между клиентом и сервером специальных XML-сообщений, содержащих только существенную информацию о запросе или изменениях HTML-страницы, которые должны быть показаны. В рамках браузера в отдельном потоке работает ядро Ajax, которое получает сообщения JavaScript-кода о выполнении пользователем определенных действий, выполняет проверку их корректности, преобразует их в посылку соответствующего запроса на сервер, преобразует ответ сервера в новую страницу или же выдает уже имеющийся в специальном кэше ответ. Запросы на сервер и их обработка осуществляются часто асинхронно с действиями пользователя, позволяя заметно снизить ощущаемое время реакции системы на них.
На настоящий момент Ajax еще не является полноценным элементом
В настоящее время совместно с компонентными технологиями на базе J2EE и .NET широкое распространение получают
Контракт службы не должен зависеть от истории обращений к ней или к другим службам. Но он может зависеть, например, от состояния каких-либо хранилищ данных.
Архитектура приложений, построенных из компонентов, являющихся такими службами, называется архитектурой, основанной на службах (service oriented architecture,
Практически единственным широко используемым видом служб являются
(рис 15.3) Схема архитектуры приложений на основе Web-службОсновное назначение
Таким образом,
Схема архитектуры приложений на основе
После создания новой службы ее поставщик — организация или частное лицо, которое предоставляет ее, — регистрирует службу у брокера
Клиент, которому понадобилась некоторая услуга, обращается к брокеру
Использование на всех этапах описанного процесса стандартных описаний в форматах, основанных на XML, позволяет полностью автоматизировать его.
Языком описания интерфейса
Описание интерфейса работы с
<types>. Они могут основываться на встроенных XML-типах и использовать <message> описываются типы сообщений, которыми стороны могут обмениваться в ходе работы службы. Для сообщения указывается, является ли оно входящим или исходящим, а его структура описывается в терминах определенных ранее типов данных.<binding> определяется привязка интерфейсов к их реализациям. Она задает конкретные форматы сообщений и протоколы их посылки/получения для некоторого интерфейса. Один интерфейс может иметь несколько привязок.<port> определяет порт, задающий конкретные адрес и порт некоторой привязки, а также, возможно, транспортный протокол для передачи сообщений на этот адрес.<service> описывает службу целиком, указывая набор портов для доступа к различным ее интерфейсам.Связь между
Формат сообщений
Простой пример
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Header>
<t:Transaction
xmlns:t="http://company.com/soap-headers/attrs"
SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="http://company.com/web-services/trading">
<symbol>DEF</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Кроме определения формата сообщений, протокол
Роль служб именования и каталогов в приложениях на основе
Существует всего лишь несколько универсальных реестров, регистрирующих любые доступные в Интернет
businessEntity. Такой документ описывает организацию (или лицо), предоставляющую набор businessService. Это список bindingTemplate. Описывает технические аспекты предоставляемых служб, в частности, адреса, к которым нужно обращаться, списки дополнительных описаний (tModels).tModel (technical model). Содержит дополнительную информацию о службе, в частности, предоставляемые ею услуги, условия и ограничения ее использования, предоставляемые гарантии и пр.Помимо структуры реестра,
Поскольку
Базовые и общепризнанные стандарты построения
Одной из попыток стандартизации протоколов совместной работы
Для обеспечения целостности при совместной работе нескольких служб могут использоваться технологии на основе стандартов WS-Transactions и WS-BusinessActivity [18,26], построенных на базе WS-Coordination.
Задачи синхронизации могут решаться с помощью средств, помогающих строить приложения на основе композиции
Возможность обеспечения отказоустойчивости
Для обеспечения отказоустойчивости при передаче сообщений разрабатывается дополнительный стандарт WS-Reliability [28], расширяющий
Наиболее вероятным кандидатом на место широко используемого стандарта защиты информации, передаваемой в сообщениях при работе с
Он расширяет
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.