В.В. Кулямин - Технологии программирования. Компонентный подход (1133554), страница 66
Текст из файла (страница 66)
Основнымиэлементами, необходимыми для облегчения работы с XML-документами, являются их разбор ивнутреннее представление XML-данных.Библиотеки для работы с XML-документами находятся в пакетах javax.xml , org.w3c.dom иorg.xml.sax, a также вложенных в них пакетах. В этих пакетах определяются следующиеинтерфейсы.•Общий интерфейс обработчиков XML находится в пакете javax.xml.parsers. Такиеобработчики могут быть основаны на простом интерфейсе работы с XML (Simple API forXML, SAX) [15] или на объектной модели документов (Document Object Model, DOM) [16].Оба этих подхода основаны на стандартах W3C.•Простой интерфейс для работы с XML (SAX) [15] определяется в пакете org.xml.sax. Этоинтерфейс, основанный на событиях, — XML-парсер, реализующий его, последовательноразбирает XML-данные и генерирует очередное событие в зависимости от видаобнаруженной конструкции.
Для работы с XML-документами необходимо написать рядобработчиков таких событий, являющихся реализациями интерфейсаorg.xml.sax.ContentHandler.Объектная модель документов (DOM) [16] представляет собой интерфейс работы с XMLдокументом, представленным в виде дерева его элементов. Java-представление этогоинтерфейса описано в пакете org.w3c.dom.
Одной из его реализаций является JDOM [17], аdom4j [18] предоставляет несколько упрощенную и более удобную с точки зрения Java, ноне вполне соответствующую стандарту DOM реализацию.Обработка XML-документов может быть построена на базе расширяемого языкатрансформаций на основе таблиц стилей (Extensible Stylesheet Language Transformations,XLST) [19]. При этом процесс обработки документов описывается в виде XSLT-программы,которая затем подается на вход интерпретатору XSLT (XSLT-процессору) вместе собрабатываемым XML-документом. Интерфейсы для работы с XSLT определены в пакетеjavax.xml.transform. Широко используемыми XSLT-процессорами являются Saxon [20] иXalan [21].В новую версию J2EE 5.0, ожидаемую в 2006 году, должны войти интерфейсы дляпотоковой обработки XML-документов (Streaming API for XML, StAX). В этом подходеXML-документ рассматривается как поток различных конструкций, которые становятся•••237доступными по запросу (pull-модель), в отличие от работы на основе событий в SAX, когдакаждая конструкция порождает событие, которое нужно обработать (push-модель).Обработка XML-документов в стиле StAX гораздо более гибкая, чем в SAX, и вполнесравнима с ней по удобству.
В настоящее время уже доступны спецификации интерфейсовStAX [22] и несколько их реализаций.Платформа .NETСреда .NET предназначена для более широкого использования, чем платформа J2EE. Однако еефункциональность в части, предназначенной для разработки распределенных Web-приложений,очень похожа на J2EE.В рамках .NET имеются аналоги основных видов компонентов J2EE. Web-компонентамсоответствуют компоненты, построенные по технологии ASP.NET, а компонентам EJB,связывающим приложение с СУБД, — компоненты ADO.NET.
Компонентная среда .NET обычнорассматриваются как однородная. Однако существующие небольшие отличия в правилах,управляющих созданием и работой компонентов ASP.NET и остальных, позволяют предположить,что в рамках .NET присутствует аналог Web-контейнера, отдельная компонентная среда дляASP.NET, и отдельная — для остальных видов компонентов.
Тем не менее, даже если это так, этисреды тесно связаны и, как и контейнеры J2EE, позволяют взаимодействовать компонентам,размещенным в разных средах. Компонентная среда для ASP.NET, в отличие от Web-контейнера вJ2EE, поддерживает автоматические распределенные транзакции.Тем самым, типовая архитектура Web-приложений на основе .NET может быть изображенатак, как это сделано на Рис.
73.Web-сервер(Microsoft InternetInformation Services)Клиент —Web-браузерHTMLстраницыСреда .NETHTTPASP.NETкомпонентыДругие .NETкомпонентыХранилищеданных(СУБД)Схема БДРисунок 73. Типовая архитектура Web-приложения на основе .NET.В целом, Web-приложения на основе .NET используют тот же набор архитектурных стилей,что и аналогичные J2EE-приложения.Обычно .NET-компоненты представляют собой набор .NET-классов и конфигурационныхфайлов, играющих роль дескрипторов развертывания и также представленных в некоторомформате на основе XML. Для приложений в целом тоже пишутся особые конфигурационныефайлы.СвязьСвязь между компонентами в рамках .NET осуществляется при помощи механизма Remoting,реализующего как RMI, так и асинхронную передачу сообщений.Классы и интерфейсы, служащие основой механизма Remoting, находятся в пространстве именSystem.Rutime.Remoting и его подпространствах, в сборках mscorlib и System.Rutime.Remoting.В рамках Remoting объекты, которые могут участвовать в качестве целей удаленного вызова,его параметров и результатов, делятся на передаваемые по значению (marshal-by-value) ипередаваемые по ссылке (marshal-by-reference).238Тип объекта, передаваемого по значению, должен реализовывать интерфейсSystem.Runtime.Serialization.ISerializable или должен быть помечен атрибутомSystem.SerializableAttribute.
В последнем случае .NET автоматически создает код,необходимый для сериализации или десериализации данных объекта. Исключения, которые могутбыть созданы методом, вызываемым удаленно, также должны быть передаваемы по значению.Объекты, передаваемые по ссылке, должны наследовать классу System.MarshalByRefObject.При передаче такого объекта как аргумента или результата в другом процессе (или зонеприложения, см. следующий раздел) создается клиентская заглушка, связанная с этим объектом иназываемая в .NET посредником (proxy).Более тонкую настройку удаленных вызовов можно делать при помощи наследников классаSystem.ContextBoundObject. Наследование этого класса говорит о том, что удаленные вызовы вобъекте этого класса должны происходить в рамках некоторого контекста, являющегося частьюего зоны приложения.
Примером такого контекста служит контекст транзакции. При вызовахтаких объектов .NET проводит дополнительные проверки, связанные с разницей контекстовмежду вызывающим объектом и вызывающим.Ниже находится пример взаимодействующих по механизму Remoting классов, имеющий ту жефункциональность, что и пример, приведенный для Java RMI.Код класса, реализующего метод для удаленных обращений.using System;namespace Examples.Remoting{public class Hello : MarshalByRefObject{public String HelloMethod() { return "Hello!"; }}}Код сервера, ожидающего обращения клиентов.using System;using System.Runtime.Remoting;namespace Examples.Remoting{public class HelloImpl{public static void Main(){RemotingConfiguration.Configure("RemotingServer.exe.config");Console.ReadLine();}}}Код клиентского класса.using System;using System.Runtime.Remoting;namespace Examples.Remoting{public class HelloClient{public static void Main(){RemotingConfiguration.Configure("RemotingClient.exe.config");Hello stub = new Hello();Console.WriteLine("response: " + stub.HelloMethod());}}}239Кроме классов, должны быть написаны конфигурационные файлы серверного и клиентскогоприложений.
Конфигурационный файл сервера выглядит так.<?xml version="1.0" encoding="utf-8" ?><configuration><system.runtime.remoting><application><service><wellknownmode = "Singleton"type = "Examples.Remoting.Hello, Hello"objectUri = "MessageServer"/></service><channels><channel ref = "http" port = "8989" /></channels></application></system.runtime.remoting></configuration>Конфигурационный файл клиента.<?xml version="1.0" encoding="utf-8" ?><configuration><system.runtime.remoting><application><client><wellknowntype = "Examples.Remoting.Hello, Hello"url = "http://hostname:8989/MessageServer"/></client></application></system.runtime.remoting></configuration>Чтобы запустить этот пример, нужно выполнить следующие шаги.• Скомпилировать все классы (предполагается, что классы находятся в файлах с именамиHello.cs, Server.cs и Client.cs).csc.exe /noconfig /t:library Hello.cscsc.exe /noconfig /r:Hello.dll Server.cscsc.exe /noconfig /r:Hello.dll Client.cs•В результате первой команды будет получена динамическая библиотека, содержащаяопределение класса Hello.
В двух других она используется, чтобы предоставить ссылку наэтот тип.Запустить серверный компонентServer.exe•Перенести на другую машину или в отдельную директорию на той же машине файлыClient.exe, Hello.dll, RemotingClient.exe.config, заменив hostname в URL вконфигурационном файле клиента на имя машины, где работает сервер, и запуститьклиентский компонентClient.exeЕсли никаких ошибок не сделано, и порт 8989 на серверной машине доступен, клиентвыдаст сообщение.response: Hello!С помощью конфигурационных файлов можно определить политику активации серверногообъекта (использовать один объект для всех вызовов, создавать для каждого вызова свой объект,создавать объект при его создании клиентом), транспортный протокол для передачи сообщений(HTTP или TCP), и пр.240Асинхронное взаимодействие в рамках .NET может быть реализовано с помощью имеющихсяв библиотеке .NET асинхронных делегатов, на основе асинхронных удаленных вызовов поRemoting или с помощью обмена сообщениями на базе библиотек System.Messaging.Взаимодействие между компонентами ASP.NET использует похожие, но скрытые отразработчика компонентов механизмы.ИменованиеВ примере на взаимодействие по Remoting использовалась локальная служба именования,встроенная в среду .NET — поэтому никаких специальных действий по регистрации и поискукомпонентов не производилось.
Эта служба позволяет не заботиться об этих вопросах в томслучае, если физическое положение компонентов, с которыми необходимо установить связь,известно и постоянно.Если же это не так, необходимо иметь полноценную службу именования и/или службукаталогов. В этом качестве в .NET используется Active Directory. Поскольку эта технологияпоявилась раньше, чем среда .NET, в рамках .NET была создана библиотека адаптеров,позволяющих использовать функции Active Directory.