Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ajax_v_deystvii.pdf
Скачиваний:
34
Добавлен:
05.03.2016
Размер:
5.83 Mб
Скачать

132 Часть I. Новый взгляд на Web-приложение

aBeans, поддерживаемые в J2EE, реализуют модель и контроллер и даже позволяют помещать их на различные серверы. Классы .NET делегируют функции контроллера объектам, специфическим для конкретных страниц. Базовые средства из библиотек типа Struts определяют контроллер переднего плана (front controller), который перехватывает все запросы к приложению и перенаправляет их. При использовании Apache Struts возможно решение, при котором контроллер будет переадресовывать пользователя от одной страницы к другой. Но в любом случае общие принципы архитектуры остаются неизменными. Это одна из причин популярности MVC среди разработчиков Web-приложений.

Архитектура "модель—представление-контроллер" упрощает работу над программами для Web и вполне применима не только для классических, но и для Ajax-приложений. Однако в Ajax архитектура MVC используется не единственным способом. В главе 4 мы рассмотрим разновидности данного образа, обеспечивающие преимущества структурированной разработки для всех компонентов приложения. Однако сначала рассмотрим еще один способ упорядочения Ajax-приложений.

Помимо реструктуризации кода, мы можем упростить работу над ним, используя базовые средства и библиотеки независимых разработчиков. По мере возрастания интереса к Ajax появляются новые средства разработки, j Рассмотрением наиболее популярных из них мы завершим данную главу.

3.5. Библиотеки независимых производителей

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

На протяжении этой книги мы время от времени будем создавать простые, но универсальные средства разработки. Вы можете использовать их при работе над своими проектами. В главах 4 и 5 мы разработаем объект ObjectViewer, в главе 5 — объект CommandQueue, в главе 6 — средства оповещения, в главе 9 — элемент профилирования Stopwatch, а в приложении А — отладочную консоль. В конце глав 9 и 13 будут рассмотрены несложные примеры. Там же мы реструктуризируем созданные программы, превратив их в компоненты, пригодные для повторного применения.

Очевидно, что не мы одни интересуемся Ajax и JavaScript, поэтому многие средства для работы с ними, многократно проверенные разработчиками, сейчас доступны в Интернете.

В этом разделе мы рассмотрим некоторые библиотеки и наборы базовых средств, которые были созданы независимыми производителями и доступны для использования в Ajax-приложениях. На сегодняшний день популяр-

Глава 3. Управление кодом Ajax 133

ность Ajax высока, поэтому мы не можем детально описать все приложения и постараемся дать вам лишь общее представление о том, какие продукты существуют и как они помогут вам навести порядок в коде ваших проектов.

3.5.1. Библиотеки, обеспечивающие работу с различными браузерами

Как было сказано в разделе 3.2.1, несоответствие браузеров не исчезло с появлением Ajax-приложений. Ряд библиотек предлагает функции, позволяющие скрыть несоответствие браузеров, рекомендуя единую точку обращения к соответствующим средствам (другими словами, они реализуют образ разработки Fagade). Одни из них ориентированы на конкретные функции, другие пытаются предоставить среду программирования с более развитыми возможностями.

Библиотека х

Библиотека х предназначена для решения задач, возникающих при написании DHTML-приложений. Она была впервые представлена в 2001 году и является развитием более ранней библиотеки СВЕ (Cross-Browser Extensions). Эта библиотека предоставляет функции, позволяющие обрабатывать в различных браузерах элементы DOM и стили, работать с моделями событий, а также поддерживает анимацию и перетаскивание объектов с помощью мыши. Библиотека х допускает работу с Internet Explorer, начиная с версии 4, и с последними версиями браузеров Opera и Mozilla.

Стиль кодирования библиотеки х основан на использовании функций; причем переменное количество параметров и отсутствие поддержки типов позволяют извлечь дополнительные преимущества. Например, для метода document.getElementById(), обрабатывающего только строковые данные, создана оболочка, которая принимает как строки, так и элементы DOM. Если передана строка, осуществляется преобразование идентификатора, а элемент DOM возвращается в неизменном виде. В результате вызов xGetElementByld() гарантирует, что параметр будет преобразован в узел DOM; при этом отпадает необходимость выполнять проверку и использовать условный оператор. Возможность замены элемента DOM текстовым идентификатором полезна при динамической генерации кода, например, при передаче строки методу setTimeout () либо при организации обратного вызова.

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

xWidth(myElement)

В результате выполнения функции возвращается значение ширины для элемента DOM (где myElement — либо элемент, либо его идентификатор). Добавляя дополнительный параметр, можно использовать ту же функцию Для установки значения ширины.

xWidth(myElement,420)

134 Часть I. Новый взгляд на Web-приложение

 

Следовательно, чтобы задать ширину элемента равной ширине другого

элемента, надо использовать выражение.

 

xWidth(secondElement,xWidth(firstElement))

 

Библиотека х не содержит кода для передачи запросов по сети, но

она

может быть полезна при создании пользовательских интерфейсов

для

Ajax-приложений.

Библиотека Sarissa

Библиотека Sarissa в основном ориентирована на работу JavaScript-сценариев с XML-данными. Она поддерживает MSXML ActiveX-компоненты Internet Explorer (начиная с версии 3) и базовые функции Mozilla, Opera, Konqueror и Safari. Расширенные средства, такие как XPath и XSLT, поддерживаются не для всех указанных браузеров.

Для разработчиков Ajax-приложений наиболее важными функциями являются поддержка объекта XMLHttpRequest в различных браузерах. Вместо того чтобы создавать объект типа Facade, Sarissa использует образ разработки Adapter для создания объекта XMLHttpRequest в тех браузерах, в которых отсутствует встроенный объект с таким именем (в частности, Internet Explorer). Код, реализующий описанные средства, конечно же, обращается к объектам ActiveX так, как было описано в главе 2, но эти действия остаются невидимыми для разработчика. Например, после импортирования библиотеки Sarissa следующий фрагмент кода будет выполняться независимо от используемого браузера:

var xhr = new XMLHttpRequest(); xhr.open("GET", "myData.xml"); xhr.onreadystatechange = function(){ if(xhr.readyState == 4){ alert(xhr.responseXML);

}

}

xhr.send(null);

Сравните этот фрагмент с кодом, представленным в листинге 2.11, и заметьте, что вызовы функций API осуществляются так же, как и в браузерах Mozilla и Safari, содержащих встроенный объект XMLHttpRequest.

Как было сказано ранее, Sarissa также представляет универсальные средства для работы с XML-документами, в частности, позволяет выполнять сериализацию произвольных объектов JavaScript и представлять их в формате XML. Данный механизм может быть использован для обработки XMLцанных, полученных с сервера в ответ на запрос. (Эту задачу и возможные ее решения мы рассмотрим в главе 5.)

Библиотека Prototype

Библиотека Prototype содержит функции общего назначения для программ аа JavaScript. Основное внимание разработчики библиотеки уделили расширению возможностей самого языка и поддержке объектов. Дополнительные

Глава 3. Управление кодом Ajax 135

возможности языка формируют специфический стиль программирования. Несмотря на то что сам код Prototype сложен для восприятия, так как он далек от стиля Java/C#, пользоваться самой библиотекой и другими библиотеками, созданными на ее основе, очень просто. Prototype молено рассматривать как библиотеку для разработчиков библиотек. При работе над Ajax-приложениями целесообразнее использовать библиотеки, созданные на основе Prototype, чем сами базовые средства. Некоторые из этих библиотек мы рассмотрим в следующем разделе. Здесь же ограничимся кратким обсуждением основных средств Prototype. Это нужно для того, чтобы понять стиль кодирования и лучше разобраться в продуктах Scriptaculous, Rico и Ruby on Rails.

Prototype обеспечивает "расширение" одного объекта другим путем копирования всех свойств и методов родительского объекта в дочерний объект. Эту особенность лучше рассмотреть на конкретном примере. Предположим, что мы определили родительский класс Vehicle.

function Vehicle(numWheels,maxSpeed){ this.numWheels=numWheels; this.maxSpeed=maxSpeed;

}

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

var passTrain=new Vehicle(24,100); passTrain.carriageCount=12; passTrain.addCarriage=function(){

this.carriageCount++;

}

passTrain.removeCarriage=function(){

this.carriageCount—;

}

Итак, мы реализовали функциональные возможности, необходимые для объекта passTrain. Анализируя код с точки зрения специалиста по проектированию программ, можно сказать, что в нем практически ничего не сделано для формирования привычного всем объекта. Prototype может помочь в решении подобных задач, определяя функции и расширяя с их помощью базовый объект. Определим расширенные возможности и оформим их в виде объекта.

function CarriagePuller(carriageCount){ this.carriageCount=carriageCount; this.addCarriage=function(){ this.carriageCount++;

)

this.removeCarriage=function(){

this.carriageCount—;

}

}

136 Часть I. Новый взгляд на Web-приложение

Затем объединим созданные средства с базовым объектом, обеспечив требуемое поведение.

var parent=new Vehicle(24,100) ;

var extension=new CarriagePuller(12);

var passTrain=Object.extend(parent,extension);

Заметьте, что родительский объект и объект расширения были определены независимо друг от друга, а лишь затем мы объединили их. Отношение "родительский-дочерний" имеет место между экземплярами, а не между классами Vehicle и CarriagePuller. Несмотря на то что данное решение не соответствует строго объектному подходу, весь код для конкретного действия, в нашем случае это движение вагонов, содержится в одном месте, а это упрощает его повторное использование. Если для небольших примеров подобные приемы могут показаться излишними, то для масштабных приложений они оказываются очень полезными.

Библиотека Prototype также предоставляет средства поддержки Ajax — объект, позволяющий извлекать объект XMLHttpRequest при работе на различных браузерах. Тип Ajax.Request используется для передачи запросов серверу посредством объекта XMLHttpRequest.

var req=new Ajax.Request('myData.xml');

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

var req=new Ajax.Request( 'myData.xml1,

{method: 'get1 ,

parameters: { name:'dave',likes:'chocolate,rhubarb' }, onLoaded: function(){ alert('loaded!'); }, onComplete: function(){

alert (' done! \n\n' +req. transport. responseText) ;

}

}

);

Здесь посредством массива задаются четыре параметра. Поскольку в библиотеке Prototype по умолчанию используется метод post, то метод get приходится указывать явно. При использовании метода get строка параметров присоединяется к URL в первой строке запроса. Если бы мы использовали метод post, параметры помещались бы в тело запроса. Обработчики onLoaded и onComplete представляют собой функции обратного вызова, которые получают управление тогда, когда свойство readyState объекта XMLHttpRequest изменяется. Переменная req. transport в функции onComplete содержит ссылку на объект XMLHttpRequest.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]