Pervyiurok.ru


Видеокурсы, видео уроки, аудио, книги...

К учебнику по HTML

"Все Технические Моменты Сайтостроения в Видеоформате". Коллекция видеокурсов, которая за 36 часов и 45 минут сделает из Вас профессионала во всех технических моментах создания сайта.



Реклама:


 

Глава 11

Встраиваемые компоненты

Современные тенденции в области разработки программных продуктов характеризуются широким использованием самостоятельных программных компонентов как строительных единиц создаваемых приложений.

Не так давно разработанный (1995), но получивший достаточно быстрое распространение язык Java позволяет создавать специальные программные компоненты — апплеты, которые предназначены для встраивания в HTML-страницы и передаче их на компьютер пользователя, где они и выполняются в режиме интерпретации специальным модулем браузера.

Элементы управления ActiveX (ранее называвшиеся элементы управления OLE) давно применяются в разработках программных продуктов. Они создаются на основе технологии СОМ и представляют собой самостоятельные программные единицы, выполняющиеся в определенной среде — среде программы-контейнера. Их возможность встраивания в HTML-страницы обеспечивается либо самим браузером (Internet Explorer), либо специальными дополнительными модулями к нему (Netscape Navigator).

Данная глава посвящена вопросам встраивания апплетов и элементов управления ActiveX в HTML-страницы и взаимодействия с ними из сценария JavaScript или VBScript.

Элементы управления ActiveX

Элементы управления ActiveX— это самостоятельные программные компоненты, которые можно использовать в разрабатываемых приложениях для реализации необходимых функциональных возможностей. Обратим внимание читателя на слова "программные компоненты" в приведенном определении. Дело в том, что элементы управления ActiveX создаются с использованием технологии Component Object Model (COM — Компонентная объектная модель), разработанной фирмой Microsoft, и не являются самостоятельным приложением — они выполняются только в приложении, которое позволяет встраивать элементы управления ActiveX, являясь, тем самым, для них неким контейнером. Вне приложения-контейнера ни один элемент управления ActiveX невозможно запустить на выполнение и требовать от него каких-нибудь результатов.

Не всякое приложение может быть контейнером для элементов управления ActiveX. Оно должно поддерживать технологию СОМ и предоставлять возможность манипулирования встраиваемыми компонентами. Многие приложения фирмы Microsoft позволяют широко использовать элементы управления ActiveX либо для расширения функциональных возможностей самого приложения, либо для быстрого создания новых приложений, использующих элементы управления ActiveX в качестве строительных блоков. К подобным приложениям можно отнести Microsoft Visual Basic, Microsoft Access, Microsoft Internet Explorer и некоторые другие.

Технология COM — это дальнейшее развитие идеи объектно-ориентированного программирования. Она позволяет использовать объекты со своими свойствами, методами и событиями, которые создаются не во время выполнения программы, написанной на каком-либо объектно-ориентированном языке программирования, а существуют в виде отдельных программных единиц, называемых компонентами. При включении подобного объекта-компонента в тело разрабатываемой программы он раскрывает свои свойства и методы, которые можно использовать в присущей объектно-ориентированным технологиям манере: получать или устанавливать значения его свойств, а также выполнять доступные методы.

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

Преимущества использования компонентной объектной модели и элементов управления ActiveX для разработки новых приложений очевидны: не надо тратить времени и усилий для программирования функциональных возможностей приложения. А какие преимущества дает использование элементов управления ActiveX в Web-документах? Прежде всего, они расширяют возможности Web-документов, приближая их к полноценным приложениям. Помните, как легко была реализована возможность работы с содержимым базы данных прямо с HTML-страницы простым включением в ее состав элемента управления TDC (см. главу 2 раздел "Связывание данных с документом"), который, естественно, является элементом управления ActiveX! Далее, они могут добавить привлекательности к разрабатываемым страницам,

если реализуют мультимедийные эффекты, позволить отобразить данные способом, не возможным в рамках языка HTML или даже динамического HTML, например, вывести текст, расположенный под углом, и многое другое. И все это практически без программирования! Простое использование тэга <OBJECT> совместно с тэгом <PARAM>, в котором задаются значения свойств элемента управления ActiveX, — и вы читаете данные из базы данных.

Встраивание в HTML-страницу

Для встраивания в HTML-страницу внешних объектов предназначен тэг <OBJECT>, который является контейнером для тэгов <PARAM>, определяющих значения свойств включаемого объекта. Тэг <OBJECT> имеет несколько параметров, два из которых непосредственно связаны с элементами управления ActiveX.

Параметр CLSID задает уникальный идентификационный номер встраиваемого на страницу элемента управления ActiveX, а значение параметра CODEBASE определяет URL-адрес расположения исходных файлов этого элемента.

Но прежде, чем начинать описание тэга <OBJECT> и его параметров, остановимся немного на вопросах установки элементов управления ActiveX на компьютере пользователя, так как они тесно переплетаются с использованием элементов ActiveX на HTML-страницах и в Web-приложениях, реализованных с помощью встраиваемых сценариев.

Любой устанавливаемый на компьютере элемент управления ActiveX регистрируется в системном реестре, куда заносится и там же хранится соответствующая информация. В дальнейшем эта информация используется браузером Internet Explorer для обработки HTML-страниц, содержащих встроенные элементы управления ActiveX.

В разделе HKEY_CLASSES_ROOT/CLSID/ реестра хранятся уникальные идентификационные номера всех установленных на компьютере элементов управления ActiveX. Запись в этом разделе для элемента управления RDS, знакомого читателю по главе 10, можно увидеть на рис. 11.1.

Для рассматриваемого элемента управления ActiveX создан раздел, названием для которого и служит уникальный идентификационный номер элемента управления {ВD96С556-65А3-11DO-983А-00С04FC29Е33}, присваиваемый ему при создании. Для целей применения элементов управления ActiveX на HTML-страницах достаточно знать, что именно СОМ ответственна за присваивание уникального идентификационного номера. Интересующийся читатель может обратиться к документации по разработке элементов управления ActiveX для более подробного ознакомления с механизмом назначения идентификационных номеров.

Каждый раздел — это параметр реестра. Если выделить интересующий раздел в левой панели окна программы работы с реестром Regedit.exe, то на правой панели отобразится значение этого параметра. На рис. 11.1 значением выделенного раздела является RDS.DataControl.

Рис. 11.1. Запись в системном реестре Windows для элемента управления RDS

Кроме записи в разделе HKEY_CLASSES_ROOT/CLSID/ для элемента управления создается собственный раздел в каталоге HKEY_CLASSES_ROOT, в котором параметр Clsid также имеет значение, равное идентификационному номеру элемента управления. На рис. 11.2 показан раздел элемента управления RDS.DataControl.

Значением параметра Clsid является уникальный идентификационный номер элемента управления RDS.DataControl.

Рис. 11.2. Запись в системном реестре Windows для элемента управления RDS

Как отмечалось выше, элементы управления ActiveX встраиваются в страницу HTML тэгом-контейнером <OBJECT>. Он имеет большое число параметров, и его полный синтаксис представлен ниже:

<OBJECT

ACCESSKEY=клавиша

ALIGN=ABSBOTTOM | ABSMI

DDLE | BASELINE | BOTTOM | LEFT |

MIDDLE | RIGHT | TEXTTOP | TOP

CLASS=имя_класса

CLASSID=идентификатор_объекта

СОDЕ=имя_файла

CODEBASE=url-адрес[#version=a,b,c,d]

CODETYPE=media-тип

ОАТА=url-адрес

DATAFLD=имя_столбца

DATASRC=#идентификатор_источника

HEIGHT=целое_число

ID=идентификатор

LANG=Язык

LANGUAGE=JAVASCRIPT | JSCRIPT | VBSCRIPT | VBS

NAME=имя

STYLE=пpaвилa_CSS

TABINDEX=целое_число

TITLE=текст

ТУРЕ=MIME-тип

WIDTH=цeлoe_чиcлo

>

Элемент HTML <OBJECT> является блоковым, поэтому для его правильной интерпретации необходимо предусмотреть на странице закрывающий тэг </OBJECT>. Задание всех параметров, естественно, не обязательно, но некоторые необходимы для правильной работы внедряемого объекта и включения его самого на HTML-страницу.

Для элементов управления ActiveX обязательно задание параметра CLASSIC. Значением его является уникальный идентификационный номер встраиваемого элемента управления ActiveX. При загрузке страницы браузер проверяет, установлен ли элемент управления на компьютере пользователя, осуществляя его поиск в системном реестре по заданному идентификационному номеру. В случае отсутствия записи в реестре браузер автоматически начинает процедуру загрузки элемента управления ActiveX с сервера, URL-адрес которого указан в параметре CODEBASE тэга <OBJECT>.

Значение параметра CLASSID представляет строку, определяющую встраиваемый объект, и для зарегистрированных элементов управления ActiveX задается в форме:

"clsid:ХХХХХХХХ-ХХХХ-ХХХХ-ХХХХ-ХХХХХХХХХХХХ"

Первая часть Clsid: сообщает анализатору браузера, что вставляется элемент управления ActiveX. Вторая часть представляет собой уникальный идентификационный номер этого элемента. Например, кнопка управления из набора элементов управления, используемых при создании форм в приложениях Office 97 фирмы Microsoft, встраивается на HTML-страницу при помощи следующего тэга:

<OBJECT ID=cmd1 CLASSID="CLSID:D7053240-CE69-11CD-A777-00DD01143C57">

</OBJECT>

В параметре CODEBASE задается адрес компонента, по которому браузер может загрузить его на компьютере пользователя в случае отсутствия:

<OBJECT ID="myActX" WIDTH=32 HEIGHT=32

CLASSID="CLSID:12D3959D-5048-11D3-A272-8C0305C10000"

CODEBASE="http://bhv.spb.ru/ActiveX/advert32.cab

#Version=1,0,0,0">

</OBJECT>

В этом примере определен полный адрес элемента управления, причем обратим внимание читателя на расширение CAB загружаемого файла. Очень часто для ускорения загрузки разнообразных компонентов они пересылаются по сети в упакованном виде. В данном случае элемент управления упакован программой Cabarc.exe, используемой фирмой Microsoft для упаковки и распространения своих продуктов.

После адреса элемента управления задается его версия в виде: #version=a,b,c,d, где а и b представляют, соответственно, старшее и младшее слово максимально доступной на сервере версии элемента управления, а с и d — соответственно старшее и младшее слово минимально доступной на сервере версии элемента управления. Эти значения используются браузером в процессе принятия решения о загрузке элемента управления с сервера. Если на компьютере пользователя установлена более новая версия элемента управления, то загрузка не производится. В приведенном примере, если на компьютере пользователя будет установлена версия элемента управления выше, чем 1.0, то загрузки не будет.

Значения, определяющие интервал доступных версий компонента могут быть все установлены равными "-1". В этом случае элемент управления загружается, если дата выпуска его версии на сервере позже даты его установки на компьютере пользователя.

Параметры WIDTH и HEIGHT задают в пикселах размеры визуального интерфейса элемента управления ActiveX, если он у него существует. Например, кнопка управления или метка, реализованные в виде элементов управления ActiveX, имеют визуальные интерфейсы, а элементы управления RDS или TDC, позволяющие работать с данными, не имеют.

Значение параметра ACCESSKEY определяет клавишу быстрого доступа к элементу управления. Это означает, что при одновременном нажатии комбинации клавиш <АН> и заданной, элемент управления получает фокус.

Примечание

При получении фокуса некоторыми элементами управления выполняются предписанные им по умолчанию действия. Например, если фокус получает кнопка управления, то генерируется событие Click этой кнопки и выполняются предусмотренные в процедуре обработки этого события действия. Если фокус получает элемент управления OptionButton (Переключатель), то также генерируется событие Click, и свойство checked (выбран) переключателя принимает противоположное значение, отображая новое состояние переключателя: если он был выбран, то устанавливается в положение "не выбран", и наоборот.

Каждый элемент управления ActiveX, являясь компонентом, раскрывает свои свойства и методы программе-контейнеру. При включении элемента управления на HTML-страницу можно задать значения его свойств в тэгах <PARAM>, содержащихся в теле тэга <OBJECT>. Тэг <PARAM> не является тэгом-контейнером и ему не требуется закрывающий тэг </PARAM>. Название свойства и его значение определяются параметрами NAME и VALUE тэга <PARAM>:

<OBJECT ID="myActX" WIDTH=32 HEIGHT=32

CLASSID="CLSID:12D3959D-5048-11D3-A272-8C0305C10000"

CODEBASE="http://bhv.spb.ru/ActiveX/advert32.cab

#Version=1,0,0,0">

<PARAM NAME="Value" VALUE="Текст">

<PARAM NAME="TextColor" VALUE="red">

</OBJECT>

В этом примере задаются значения двух свойств элемента управления. Если значения свойств не заданы при внедрении элемента управления, то он инициализируется со значениями свойств по умолчанию.

Примечание

Все свойства и методы элемента управления ActiveX можно найти в документации, поставляемой продавцом элемента управления.

Элементы управления ActiveX и сценарии

Каждый встроенный на HTML-страницу элемент управления ActiveX в объектной модели документа браузера Internet Explorer представляется в виде объекта object. Свойства, методы и события этого объекта соответствуют свойствам, методам и событиям соответствующего элемента управления ActiveX.

В объектной модели документа реализованы свойства, соответствующие параметрам тэга <OBJECT>. Например, свойство ciassName соответствует параметру CLASS тэга. Может оказаться, что реализация внедренного объекта поддерживает какое-либо свойство или метод с таким же названием, определенным в реализации объектной модели. Во избежание конфликтов в таких случаях следует использовать свойство object объекта для доступа к соответствующему свойству или методу, реализованному внедренным объектом. Например, если в объектной модели и в самом элементе управления ActiveX реализован метод itemo, то следующие операторы обеспечивают, соответственно, доступ к методу объектной модели и самого объекта:

document.all.nameOfObject.item() // метод объектной модели

document.all.nameOfObject.object.item() // метод элемента управления

В этих операторах nameOf object — имя объекта, определенное в параметре ID тэга <OBJECT>.

События, поддерживаемые элементом управления ActiveX, посылаются непосредственно объекту object, представляющему в объектной модели элемент управления. В сценарии можно определить обработчик событий — процедуру, выполняющуюся при генерировании определенного события элемента управления.

Определение обработчика событий для элементов управления ActiveX в Internet Explorer 4.0 несколько не укладывается в общепринятые нормы назначения процедуры обработки события какого-либо HTML-элемента. Задание обработчика события опсобытие в качестве параметра тэга <OBJECT> не приводит к желаемым результатам. Чтобы определить процедуру обработки события элемента управления ActiveX, следует воспользоваться тэгом <SCRIPT> с параметрами FOR и EVENT (см. главу 9 "Выполняемые сценарии"):

<SCRIPT FOR=имяЭлемента EVENT=Событие LANGUAGE=[JavaScript[VBScript]>

исходный текст процедуры обработки события

</SCRIPT>

С помощью такого синтаксиса тэга <SCRIPT> можно определять обработчики событий как в языке JavaScript, так и в языке VBScript, не забывая указывать последний явно в параметре LANGUAGE. По умолчанию любой браузер использует JavaScript в качестве языка сценария.

В VBScript обработчик события для элемента управления ActiveX можно определить, также используя специальные правила именования процедур, вызываемых в ответ на возникновение определенного события для определенного объекта. Имя такой процедуры составляется из имени объекта и названия события, соединенных знаком подчеркивания "_". Например, если элемент управления определен с именем TreeView1 и необходимо создать процедуру обработки события click, то достаточно определить процедуру с именем TreeView1_click. Внимательный читатель тотчас же заметит, что это несколько отличается от подобного же правила для процедур обработки событий обычных HTML-элементов, для которых во второй части имени процедуры задается не имя самого события, а обработчик события с префиксом on перед именем события. Если бы объект TreeView1 был обычным объектом, соответствующим HTML-элементу, то имя процедуры обработки его события click было бы TreeView1_onclick. Такое задание имени процедуры обработки событий элементов управления ActtiveX является исключением и его следует помнить, так как если для элемента управления ActiveX задать процедуру по правилам VBScript, то интерпретатор не сгенерирует никакой ошибки, но и никакого действия не будет выполняться при возникновении соответствующего события.

В примере 11.1 показано, как правильно обрабатывать щелчок кнопкой мыши на элементе управления Label (Метка), поставляемого вместе с Internet Explorer 4.0.

Пример 11.1. Обработка событий элементов управления ActiveX

<HTML>

<SCRIPT LANGUAGE-"VBScript">

<!--

Sub lblActive1_Click

lblActive1.Angle = (lblActivel .Angle + 45) Mod 360

End Sub

-->

</SCRIPT>

</HEAD>

<BODY>

<H2 STYLE="color: blue; background-color: lightgrey">

Пример 11.1 Обработка щелчка на элементе управления ActiveX

</Н2>

Щелчок кнопкой мыши на слове "Текст" поворачивает его

на 45 градусов!<P>

<DIV>

<OBJECT CLASSID="clsid:99B42120-6EC7-11CF-A6C7-00AA00A47DD2"

ID=lblActive1

WIDTH=150

HEIGHT=150 >

<PARAM NAME="Angle" VALUE="0">

<PARAM NAME="Aligment" VALUE="4">

<PARAM NAME="BackStyle" VALUE="0">

<PARAM NAME="Caption" VALUE="TЕКСТ">

<PARAM NAME="FontName" VALUE="Verdana, Arial, Helvetica">

<PARAM NAME="FontSize" VALUE="20">

<PARAM NAME="FontBold" VALUE="1">

<PARAM NAME="FrColor" VALUE="0">

</OBJECT>

</DIV>

</BODY>

Используемый в этом примере элемент управления имеет свойство Angle, определяющее наклон текста, задаваемого в свойстве caption, относительно горизонтали. Первоначальное значение этого свойства равно 0°. Когда пользователь щелкает кнопкой мыши на содержимом этого элемента управления, генерируется событие click, которое перехватывается и обрабатывается процедурой lblActive1_click, имя которой определено в соответствии с изложенными выше правилами. Эта процедура добавляет 45° к значению свойства Angle элемента управления и приводит его к диапазону от 0° до 360°, если новое значение угла поворота выходит за указанный диапазон. Изменение значения свойства приводит к тому, что надпись "ТЕКСТ" поворачивается на 45° относительно своего предыдущего положения.

Следует заметить, что событие, генерируемое для элемента управления ActiveX, как и любое событие в объектной модели документа, "всплывает" вверх по иерархии объектов документа и обрабатывается соответствующими обработчиками событий объектов-контейнеров верхних уровней.

Обратим внимание на то, что в примере 11.1 элемент управления Label содержится в тэге раздела <DIV>. Если задать обработчик события onclick для этого раздела, например, в виде вызова окна предупреждения

<DIV onclick="alert('Я всплыл из тэга DIV!')>

то при щелчке кнопкой мыши на метке кроме поворота текста будет отображаться диалоговое окно с надписью "Я всплыл из тэга DIV".

Вставка на HTML-страницу элементов управления ActiveX связано со знанием его уникального идентификационного номера, а также всех доступных свойств, методов и событий элемента управления. Существуют средства разработки Web-документов, автоматизирующие процесс встраивания элементов управления ActiveX на HTML-страницы.

Одним из первых подобных средств была программа Microsoft ActiveX Control Pad, которая послужила основой для редактора FrontPage, входящего в целый комплекс программного обеспечения FrontPage 98 фирмы Microsoft, предназначенный для разработки и поддержки простого "домашнего" Web-сервера.

Примечание

Программа Microsoft ActiveX Control Pad свободно распространяется в Интернете и доступна на сервере разработчика фирмы Microsoft по адресу http:// msdn.microsoft.com/workshop/.

Программа FrontPage 98 получила дальнейшее развитие и в настоящее время ее новая модификация под названием FrontPage 2000 интегрирована в Microsoft Office 2000.

В следующем разделе будет описана технология включения элементов управления ActiveX на HTML-страницу в редакторе FrontPage 98, так как FrontPage 2000 еще не получил большого распространения, а основные приемы работы остаются такими же, как и в редакторе FrontPage 98.

Редактор FrontPage 98

Редактор FrontPage предназначен для создания, разработки и редактирования Web-документов. При добавлении текста, изображений, таблиц и других элементов на страницу редактор FrontPage отображает их в том виде, какой они будут иметь в окне браузера. Знание языка HTML не обязательно, так как FrontPage в конечном итоге сам создает HTML-страницу, содержащую все включенные разработчиком элементы. Этот редактор может генерировать все известные тэги HTML, включая свойства каскадных таблиц стилей, фреймы и элементы управления ActiveX.

Его рабочая область состоит из трех вкладок, переход между которыми осуществляется с помощью расположенных в нижней части рабочей области ярлычков. На каждой вкладке разрабатываемый или редактируемый HTML-документ имеет разное представление.

Примечание

Описание работы с элементами управления ActiveX в редакторе FrontPage будет производиться на примере английской версии редактора, поэтому указанные в скобках русские названия меню, команд, полей, списков и т. д. могут не соответствовать русской версии редактора.

Вкладка Normal (Нормальная) является рабочей. Именно здесь осуществляется создание и разработка HTML-страницы. Большинство вставляемых элементов имеют такой же внешний вид, что и в окне браузера, но их расположение не отражает окончательную компоновку страницы.

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

На вкладке Preview (Просмотр) можно посмотреть Web-документ так, как он будет отображаться в окне браузера. Здесь нельзя вносить никакие изменения в разрабатываемую страницу.

Встроенный на страницу элемент управления ActiveX (а читатель помнит, что в примере 11.1 использовался элемент управления Label) на основной, рабочей вкладке представляется специальным графическим изображением — пиктограммой ActiveX. Причем ширина и высота этой пиктограммы соответствуют ширине и высоте элемента управления, определенными, соответственно, в параметрах WIDTH и HEIGHT тэга <OBJECT>, задающего элемент управления ActiveX.

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

В редакторе FrontPage любой элемент добавляется на страницу посредством команд меню Insert (Вставить). Вставка элемента управления ActiveX осуществляется вызовом команды ActiveX Control (Элемент управления ActiveX) подменю Advanced (Дополнительно) этого меню. Дополнительная информация относительно встраиваемого элемента управления ActiveX задается в отображаемом этой командой диалоговом окне ActiveX Control Properties (Свойства элемента управления ActiveX).

В раскрывающемся списке Pick a Control (Выберите элемент управления) следует выбрать элемент управления ActiveX. Этот список содержит все, установленные на компьютере элементы управления ActiveX.

В полях этого диалогового окна вводятся значения параметров тэга <OBJECT>, который встраивает выбранный элемент управления ActiveX на HTML-страницу. Каждое поле соответствует определенному параметру тэга, название которого ясно из названия самого поля. Например, поле Code Source соответствует параметру CODEBASE, поле Data Source — параметру DATA и т. д.

Для заполненного диалогового окна редактор FrontPage вставит в исходный текст HTML-страницы следующий тэг <OBJECT> с заданными значениями параметров:

<object align="top" codebase="http://bhv.spb.ru/"

id="lbl2" border="5" hspace="20"

vspace="30" width="200" height="100"

data="file:///D:/Интерактивные/Примеры/Label.ocx"

classid="clsid:99B42120-6EC7-11CF-A6C7-00AA00A47DD2">

Следует установить ЭУ Label</object>

Совет

Сопоставление параметров и их значений в приведенном примере со значениями полей диалогового окна на рис. 11.5 поможет найти соответствие между полями формы и параметрами тэга <OBJECT>, если оно не достаточно ясно из названий полей.

Обратим внимание только на параметр CLASSID, в котором задается уникальный идентификационный номер элемента управления. Редактор автоматически определяет его в реестре системы и вставляет в качестве значения параметра CLASSID, избавляя разработчика от самостоятельного поиска идентификационного номера в реестре.

Однако пока остаются не определенными значения свойств элемента управления, задаваемые в тэгах <PARAM>, содержащихся в теле тэга <OBJECT>. Установка значений доступных свойств элемента управления осуществляется в диалоговом окне редактора свойств, если элемент управления установлен и поддерживает локальное редактирование свойств, или в диалоговом окне Object Parameters (Параметры объекта) в противном случае. Окно Object Parameters отображается нажатием кнопки Properties (Свойства) диалогового окна ActiveX Control Properties.

Элемент Label Control, используемый в нашем примере, не поддерживает локальное редактирование свойств, поэтому установку его свойств приходится осуществлять в диалоговом окне Object Parameters, которое требует знания всех свойств элемента управления и их допустимых значений. В нередактируемом списке этого диалогового окна отображаются названия и значения установленных свойств. В поле Attribute name (Имя параметра) отображается имя свойства, которое задается в параметре NAME тэга <PARAM>, а поле Value (Значение) содержит его значение, задаваемое параметром VALUE. Добавление или изменение значения свойства осуществляется нажатием кнопок Add (Добавить) или Modify (Изменить). При этом отображается диалоговое окно Edit Object Properties (Редактирование свойств объекта), в полях которого задается название свойства и его значение.

Совет

Для элемента управления Label Control программа MS ActiveX Control Pad отобразит все устанавливаемые свойства элемента в редакторе свойств. Если FrontPage по какой-либо причине не отображает для элемента управления редактор свойств, а вы забыли названия некоторых свойств и нет под рукой документации, можно попробовать использовать упомянутую программу, которая свободно распространяется в Интернете.

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

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

По завершении редактирования свойств элемента управления ActiveX и закрытия диалогового окна ActiveX Control Properties, в исходном тексте HTML-страницы в тэг <OBJECT> вставляются все необходимые тэги <PARAM>, определяющие значения свойств элемента управления. Для нашего примера после добавления значения свойства Angle тэг <OBJECT> будет выглядеть следующим образом:

<object align="top" codebase="http://bhv.spb.ru/"

id="lbl2" border="5" hspace="20"

vspace="30" width="200" height="100"

data="file:///D:/Интерактивные/Примеры/Label.ocx"

classid="clsid:99B42120-6EC7-11CF-A6C7-00AA00A47DD2">

<param name="Size" value="3563;3598">

<param name="Angle" value="10">

Следует установить ЭУ Label</object>

Добавление обработчиков событий элементов управления ActiveX на страницу HTML в программе FrontPage 98 так же просто, как и встраивание и изменение свойств элементов управления ActiveX. Для этого предназначена команда Script Wizard (Мастер сценария) контекстного меню элемента управления ActiveX, которое отображается щелчком правой кнопки мыши на элементе управления при работе на вкладке Normal. Эта команда отображает диалоговое окно Мастера сценария, в котором задаются все необходимые параметры и действия для процедуры обработки события.

В заголовке диалогового окна в скобках после имени файла отображается используемый язык сценария: VBScript или JavaScript. Установка языка сценария осуществляется командой Insert, Advanced, Script (Вставка, Дополнительно, Сценарий), в диалоговом окне которой в группе переключателей Language (Язык) следует выбрать используемый язык сценария.

Примечание

При разработке HTML-страницы в программе FrontPage можно использовать только один язык сценария для процедур обработки событий: VBScript или JavaScript. Если редактируется страница со смешанными сценариями, то программа выдаст предупреждение о том, что смешанные сценарии не поддерживаются полностью и могут возникнуть проблемы при отображении страницы.

Диалоговое окно Мастера сценария состоит из трех панелей. В панели Select an Event (Выбрать событие) отображаются в алфавитном порядке все элементы редактируемой HTML-страницы, которые могут генерировать события. Двойной щелчок на любом из элементов раскрывает список доступных для программирования событий этого элемента. При выборе какого-либо события элемента, для которого необходимо написать процедуру его обработки, над нижней панелью появляется заголовок, представляющий собой тэг <SCRIPT> с соответствующими параметрами FOR и EVENT. Теперь в рабочем поле этой панели можно вводить операторы процедуры.

Сделаем небольшое замечание, что подобное поведение редактора сценария происходит только тогда, когда в нижней части его диалогового окна выбран переключатель Code View (Просмотр кода). Выбор этого режима работы редактора сценария позволяет пользователю в рабочей области нижней панели набирать исходный текст сценария.

При выборе переключателя List View (Просмотр списка) включается режим создания сценария простым указанием необходимых действий из соответствующего списка. Более подробно об этом режиме можно прочитать в любой книге по FrontPage 98.

В панели Insert Actions (Ввод действий) можно найти значки, соответствующие доступным в сценарии объектам, например, встроенный нами на страницу HTML под именем lbl2 элемент управления Label. Двойной щелчок на элементе раскрывает список его доступных свойств, который можно использовать при ссылке на свойства элемента управления в процессе написания сценария: двойной щелчок на свойстве в этом списке помещает ссылку на свойство элемента управления в рабочее поле панели написания сценария.

Теперь можно просто продолжить оператор, присвоив этому свойству, например, значение 10. Там, где в сценарии необходимо сослаться на значение какого-либо свойства элемента, следует применять подобную технику во избежание ошибок в синтаксисе свойств.

Примечание

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

Редактор сценария позволяет создавать отдельные процедуры, которые можно использовать в других процедурах обработки событий, определять глобальные переменные, доступные всем процедурам страницы. Их можно создать, установив курсор на элементе Global Variables (Глобальные переменные) или Procedures (Процедуры) панели Insert Actions, и, щелкнув правой кнопкой мыши, в контекстном меню выбрать команду New Global Variable (Новая глобальная переменная) для создания новой переменной или New Procedure (Новая процедура) для создания отдельной процедуры.

Мы кратко остановились на возможностях FrontPage 98, имея в виду его использование для внедрения элементов управления ActiveX на HTML-страницы, а также написания процедур обработки их событий, хотя возможности этого редактора достаточно велики и позволяют быстро и эффективно создавать великолепные Web-документы.

Безопасность и элементы управления ActiveX

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

Пользователь "путешествует" по сети Интернет и получает информацию с помощью специальных программ — браузеров (от английского browse — читать, просматривать). Каждый браузер поддерживает определенную стратегию безопасности, предупреждая пользователя о потенциально опасных загружаемых компонентах.

Internet Explorer 4.0 позволяет пользователю установить три уровня безопасности: высокий, средний и низкий. Каждый уровень характеризуется своими ограничениями на загрузку из сети программ, файлов, изображений и другого ее содержимого. Это может быть полный отказ от загрузки потенциально опасных программ (как в случае высокого уровня безопасности) или разрешение, даже без дополнительного информирования пользователя, загружать на компьютер все, что встретится на HTML-странице (как в случае низкого уровня безопасности).

Широко используемые на HTML-страницах объекты — Java-апплеты и элементы управления ActiveX — также разрабатываются с учетом их безопасного применения. Стратегии безопасности для этих двух типов объектов различны. Если средства разработки Java-апплетов вообще не позволяют им обращаться к информации, расположенной на компьютере, то с элементами управления ActiveX дело обстоит немного сложнее. Последние используются не только в Web-приложениях, но и как строительные единицы при разработке обычных приложений. Поэтому, естественно, ни одна среда разработки элементов управления ActiveX не накладывает ограничений на доступ к информации, хранящейся на компьютере, где используется этот элемент. Каким же образом можно ограничить доступ к "закрытой" информации элементу управления ActiveX? Это достигается совместным использованием системы безопасности браузера и мероприятиями, связанными с регистрацией и установкой элементов управления ActiveX на компьютере пользователя при загрузке HTML-страницы.

Цифровая подпись

Если используемый на странице элемент управления ActiveX не установлен на компьютере пользователя, то браузер начнет процедуру загрузки и установки элемента управления на этом компьютере. Но, прежде чем загружать необходимые файлы, браузер проверит, снабжен ли элемент управления цифровой подписью, и если да, то в диалоговом окне отобразит содержимое цифровой подписи, если нет — предупредит пользователя о том, что будет загружаться элемент управления без цифровой подписи. Пользователь сам решает, стоит ли ему загружать такой элемент управления, который создан не известно кем и может быть потенциально опасен. На рис. 11.3 показано диалоговое окно безопасности браузера Internet Explorer 4.0 при загрузке элемента управления ActiveX, снабженного цифровой подписью.

В диалоговом окне на рис. 11.3 сообщается, что будет установлен элемент управления Microsoft Windows Media Player, подписанный 07.07.98 и распространяемый фирмой Microsoft Corporation. Подлинность распространителя установлена организацией VeriSign.

Выделенная полужирным шрифтом информация в предыдущем абзаце взята из цифровой подписи, которой снабжен элемент управления Microsoft Windows Media Player. Пользователь по отображенной информации решает, можно ли разрешить загрузку элемента управления или нет.

Рис. 11.3. Диалоговое окно безопасности браузера Internet Explorer 4.0

Примечание

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

Предупреждение

Подумайте, стоит ли загружать элемент управления ActiveX от непроверенного поставщика и, в особенности, без цифровой подписи, так как следующие версии устанавливаются без предупреждающего сообщения и потенциально могут нанести вред компьютеру.

Каким образом разработчик элемента управления ActiveX снабжает свой элемент цифровой подписью? Для этого он, прежде всего, получает соответствующий сертификат подлинности от организации, уполномоченной на это. Одной из таких организаций является VeriSign, сервер которой можно найти по адресу http://digital.verisign.com/.

Основная функция организации типа VeriSign — проверить подлинность и правильность информации о фирме или индивидуальном программисте, желающих подписывать свои продукты. Сертификат, по существу, является цифровой идентификационной карточкой производителя программного обеспечения и аналогичен товарному знаку на рынке обычных продуктов. Приходя в магазин и покупая товар, мы обращаем внимание на фирму-производителя, которую идентифицируем по зарегистрированной торговой марке. Точно так же мы можем теперь делать и в сети Интернет с загружаемым программным обеспечением.

Существует два типа сертификатов, выдаваемых для создания цифровой подписи: сертификат класса 2 и сертификат класса 3.

Сертификат класса 2 выдается индивидуальному программисту, публикующему в Интернете свои программы. Для его получения он должен представить в организацию, выдающую сертификаты, информацию о себе: имя, адрес, адрес электронной почты, дату рождения и номер карточки социального страхования (Social Security Number). После проверки предоставленной информации ему выдается сертификат сроком на один год. Заметим, что при получении сертификата он обязан оплатить его стоимость в размере 20 долларов США.

Сертификат класса 3 выдается фирмам-производителям программного обеспечения, и его стоимость составляет 400 долларов США в год. Для его получения необходимо представить название фирмы, место регистрации, контактные адреса и телефоны, а также рейтинг фирмы в соответствии с методикой Dun-and-Bradstreet.

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

После получения сертификата с помощью специального программного обеспечения, поставляемого разными фирмами, производитель программного продукта вставляет цифровую подпись в двоичный код распространяемого им программного обеспечения, например элемента управления ActiveX.

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

Безопасное использование элементов управления ActiveX

Безопасность — понятие достаточно субъективное. То, что для одного пользователя может казаться потенциально опасным, другому пользователю покажется совершенно безобидным. Но существует ряд общепризнанных действий, которые не должен выполнять безопасный элемент управления ActiveX. К ним относятся:

Чтобы пользователь элемента управления ActiveX был уверен в том, что все перечисленные действия не выполняются приобретенным элементом управления, разработчик обычно включает в процедуру установки элемента его регистрацию в реестре как безопасного.

Существует два типа безопасности, применимых не только к элементам управления ActiveX, но и любым выполняемым программным объектам: безопасность при инициализации и безопасность использования во встроенных сценариях.

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

Наибольший эффект от элемента управления ActiveX достигается его совместным использованием со встроенным на HTML-страницу сценарием. Может оказаться, что специально написанный сценарий для безопасного и полученного из надежного источника элемента управления ActiveX вызовет его методы и назначит такие значения его свойствам, что элемент управления опять начнет "ломать" систему безопасности компьютера или разрушать системные данные. Элемент управления, который гарантирует надежность применения его методов при любой последовательности их вызовов и при любых значениях параметров, а также при любых значениях его свойств, считается надежным при использовании во встроенных сценариях.

При установке на компьютере пользователя элемента управления ActiveX, помеченного разработчиком безопасным при инициализации и использовании в сценариях, в разделе системного реестра этого элемента управления создается ключ Implemented Categories (Реализованные категории), содержащий два подключа, отмечающие соответствующие категории безопасности элемента управления. ПОДКЛЮЧ {7DD95801-9882-11CF-9FA9-00AA006C42C4} соответствует безопасности при инициализации, а подключ (7DD95802-9882-11CF-9FA9-00AA006C42C4} — безопасности при использовании в сценарии.

На рис. 11.4 показано окно программы работы с реестром regedit.exe, в котором отображен раздел для элемента управления TDC. Видно, что этот элемент управления является безопасным во всех отношениях: ключ Implemented Categories содержит два подключа безопасности: {7DD95801-9882-11CF-9FA9-00AA006C42C4} И {7DD95802-9882-11CF-9FA9-00AA006C42C4}.

Рис. 11.4. Раздел реестра для элемента управления TDC

В разделе Component Categories реестра перечислены ключи для каждого вида выполняемых функций, которые реализованы или требуются компонентам и приложениям, установленным на компьютере. Этот раздел можно использовать для определения значения подключен, перечисленных в ключе Implemented Categories приложения или компонента. На рис. 11.5 показан раздел Component Categories с подключами в окне программы regedit.exe.

Рис. 11.5. Раздел Component Categories реестра

При использовании элемента управления на странице HTML браузер проверяет, отмечен ли он в системном реестре как безопасный для инициализации и использования в сценариях. Если да, то элемент управления используется для выполнения предусмотренных на странице действий, если нет— браузер отображает диалоговое окно (рис. 11.6) с предупреждением пользователю о небезопасности элемента управления ActiveX, и пользователь принимает решение о его использовании.

Рис. 11.6. Окно предупреждений браузера Internet Explorer 4.0 при загрузке небезопасного элемента управления ActiveX

Примечание

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

Примечание

Если в процедуре установки элемента управления предусмотрена его регистрация как безопасного элемента управления, то он будет отмечаться таким во всех операционных системах. Автору элемента управления следует всегда проверять его безопасность во всех возможных операционных системах, используемых на компьютерах пользователей сети Интернет.

Лицензирование элементов управления ActiveX

Лицензирование программных продуктов, в том числе и элементов управления ActiveX, связано с их легальным, законным использованием. Применение "пиратских" версий элементов управления ActiveX на HTML-страницах может привести к осложнениям с фирмами-разработчиками, вплоть до судебного разбирательства. Каждая фирма, распространяющая свои программные продукты, разрабатывает и поддерживает собственные стратегии лицензирования. В этом разделе мы кратко остановимся на стратегии фирмы Microsoft, как одной из первых зачинательниц легального использования программных продуктов.

Большинство предлагаемых этой фирмой элементов управления ActiveX, если только они не распространятся бесплатно, должны поддерживать лицензирование во время разработки и во время выполнения. Лицензирование во время разработки гарантирует, что автор Web-документа или программного обеспечения использует легально приобретенные элементы управления. Лицензирование во время выполнения гарантирует, что пользователь просматривает Web-документ или применяет программное обеспечение с легально приобретенными элементами управления.

Лицензия элемента управления во время разработки проверяется программой-контейнером, которая встраивает элемент управления в разрабатываемый продукт. Визуальные средства разработки фирмы Microsoft, например Visual Basic и Visual InterDev, прежде чем поместить элемент управления в программу или Web-документ, проверяют наличие ключа лицензии. Если такового не обнаружится, то соответствующий элемент управления не может быть использован в разработке, при этом отображается диалоговое окно с описанием причины отказа в использовании этого элемента управления. На рис. 11.7 показано диалоговое окно, отображаемое Visual Basic 6.0 (русская редакция) при попытке использовать нелицензированный элемент управления.

Рис. 11.7. Окно предупреждений Visual Basic при встраивании нелицензированного элемента управления ActiveX

За проверку лицензии во время выполнения также отвечают упомянутые выше средства разработки. Они встраивают лицензию на использование элемента управления во время разработки в программу или Web-документ, создаваемый этими средствами.

MS Internet Explorer — это другой тип программы-контейнера, использующего элементы управления ActiveX. В отличие от программных средств разработки, которые встраивают двоичный код элемента управления в выполняемый файл разрабатываемого приложения, Internet Explorer сначала загружает элемент управления на компьютер пользователя, а потом проверяет его лицензию на использование перед отображением на странице. Чтобы предупредить пиратское использование элемента управления, так как пользователь в любой момент может увидеть исходный текст HTML-страницы, механизм проверки легальности прибегает к "сокрытию" от пользователя лицензии на использование элемента управления ActiveX. Это достигается использованием файла упаковки лицензии (license package file) с расширением LPK, который встраивается в HTML-страницу с помощью тэга <OBJECT>. Параметр CLSID идентифицирует этот объект как файл упаковки лицензии, а тэг PARAM определяет его адрес относительно адреса HTML-страницы:

<OBJECT CLASSID="clsid:5220CB21-C88D-11CF-B347-00AA00A28331">

<PARAM NAME="LPKPath" VALUE="time.lpk">

</OBJECT>

Уникальный идентификационный номер, заданный в этом примере, определяет объект как файл упаковки лицензии, а значение параметра LPKPath в тэге <PARAM> указывает, что этот файл имеет имя time.lpk и расположен в том же каталоге и на том же сервере, что и просматриваемая страница.

Файл упаковки лицензии создается специальной программой Lpk_Tool.exe из средств разработки приложений клиента Интернета и содержит пары CLSID элемента управления — лицензионный ключ. Браузер Internet Explorer специальной программой ActiveX License Manager выделяет для элемента управления лицензионный ключ и сравнивает его с ключом загруженного элемента управления. Если они совпадают, то элемент управления ActiveX отображается на странице, если не совпадают, то элемент управления не отображается и страница теряет свою функциональность, связанную с использованием этого элемента управления.

Совет

Разработчикам HTML-страниц рекомендуется использовать файл упаковки лицензии для элементов управления, приобретенных ими у третьих лиц.

Элементы управления на HTML-страницах

В этом разделе мы приведем примеры использования элементов управления ActiveX для расширения функциональных возможностей HTML-страниц. Вероятно, читатель заметит, что некоторые "трюки" можно было бы сделать и с помощью средств динамического HTML, но следует заметить, что элементы управления ActiveX продолжают оставаться мощным средством реализации функциональности, и практика их использования расширит кругозор разработчиков Web-приложений. Если читатель знаком с Visual Basic, то он уже работал с элементами управления ActiveX, и этот опыт он может использовать, привлекая известные ему элементы управления для разработки Web-приложений на языке VBScript.

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

сценариях, привязываемых к допустимым событиям элементов управления ActiveX. В этом разделе в качестве языка сценария используется язык VBScript, хотя все то же самое можно осуществить и с помощью языка JavaScript.

Элемент управления TabStrip

Элемент управления TabStrip напоминает закладки в записной книжке или разделители в библиотечной картотеке. Он состоит из нескольких ярлычков и области клиента, в которой отображается связанная с каждым ярлычком информация, размещаемая в расположенных там элементах управления ActiveX (отсюда и название этой области). На стандартном виде элемента управления TabStrip черными линиями обозначена граница области клиента. При щелчке на каком-либо ярлычке он как бы располагается перед оставшимися ярлычками, и в области клиента отображается связанная с этим ярлычком информация.

Примечание

Элемент управления TabStrip используется для создания диалоговых окон со вкладками. Каждая вкладка — это ярлычок с соответствующим ему содержимым области клиента.

Использование элемента управления TabStrip экономит место на странице Web-документа. Множественная информация отображается поочередно в одном месте на странице — области клиента элемента управления.

Свойство style этого элемента управления позволяет ярлычки-закладки (значение свойства равно 0) заменить кнопками управления (значение свойства равно 1).

У этого элемента управления есть очень полезное свойство: MuitiRow. Если оно равно True, то отображаются все ярлычки или кнопки, в случае необходимости, в несколько рядов. Дополнительные ряды создаются за счет области клиента, уменьшая ее высоту. Установка значения этого свойства равным False отображает все ярлычки или кнопки в один ряд. Если их общая ширина превышает ширину самого элемента управления, то в правом верхнем углу добавляются две кнопки, позволяющие перемещаться по ярлычкам или кнопкам.

Элемент управления TabStrip в таком виде удобен для использования в визуальных системах программирования, в которых необходимые элементы управления ActiveX перетаскиваются мышью в область клиента.

В Web-приложениях программирование этого элемента управления требует определенных усилий, однако можно использовать только ярлычки этого элемента управления, установив высоту всего элемента управления равной высоте ярлычка, и отображая их в один ряд (Style=1), для отображения в одной области страницы разнообразной информации. Например, таким способом можно создать галерею картин какого-либо художника, образцов товаров и т. п.

В качестве примера такого использования элемента управления TabStrip создадим страницу интерактивного учебного пособия, содержащую галерею элементов управления ActiveX.

На этой странице ярлычки элемента управления TabStrip будут использоваться для отображения в плавающем фрейме информации об элементе управления ActiveX, имя которого будет написано на выбранном пользователем ярлычке.

Прежде всего, встроим на страницу сам элемент и создадим плавающий фрейм. Для лучшего восприятия "связанности" этих объектов разместим их в одной таблице в двух соседних строках. Исходный текст HTML, размещаемый в тэге <BODY>, показан ниже:

<body bgcolor="lightgrey">

<Н2 STYLE="color:red; backgrounr-color:lightgrey">

ГАЛЕРЕЯ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ ActiveX</H2>

<table border="1">

<tr><td>

<object ID="TabStrip1"

WIDTH="720" HEIGHT="33"

CLASSID="clsid:1EFB6596-857C-llDl-Bl6A-00COF0283628">

</object>

</td>

</tr>

<tr><td>

<IFRAME ID="FloatingFrame" HEIGHT="400" WIDTH="720">

</IFRAME>

</td>

</tr>

</table>

</body>

Обратите внимание на уникальный идентификационный номер элемента управления ActiveX в параметре CLASSID тэга <OBJECT>. Это идентификационный номер элемента управления TabStrip (Microsoft 6.0), под которым он зарегистрирован в системном реестре.

Виден без надписи один ярлычок элемента управления TabStrip (его высота определена в параметре HEIGHT), ниже которого расположен плавающий фрейм. Если бы высота элемента управления TabStrip была определена равной 400 пикселов, и он точно так же, как и в нашем примере, был бы встроен в страницу без задания каких-либо своих параметров.

Определим вид элемента управления TabStrip, задавая значения его свойств в процедуре обработки события OnLoad загрузки содержимого окна браузера.

Каждый элемент управления TabStrip состоит из одного или нескольких объектов Tab (Вкладка), которые хранятся в наборе Tabs элемента управления. Объект Tab представляет собой ярлычок и соответствующую ему область клиента. Его свойство Caption определяет надпись на ярлычке этого объекта. Например, если в программе необходимо задать надпись "Ярлычок 1" на первом ярлычке элемента управления TabStrip, то это можно сделать следующим оператором:

TabStrip1.Tabs(1).Caption="Ярлычок 1"

Здесь TabStrip1 — имя объекта, соответствующего элементу управления TabStrip.

Но прежде чем работать с объектами Tab, их нужно создать. При инициализации элемента управления TabStrip по умолчанию создается только одна вкладка. Метод Add о набора Tabs служит для создания новой вкладки (объект Tab) элемента управления TabStrip. Следующий оператор создает еще одну вкладку элемента управления TabStrip 1:

TabStrip1.Tabs.Add()

Теперь, если предположить, что в массиве Name размерности N хранятся имена ярлычков, то создание N вкладок элемента управления TabStrip с именем Tabstripi в процедуре обработки события onLoad окна браузера будет выглядеть следующим образом:

Sub Window_OnLoad()

' Создание вкладок элемента управления TabStrip1

For I=1 То N

TabStrip1.Tabs.Add()

TabStrip1.Tabs(I).Caption=Name(I)

Next

TabStrip1.object.Style=0 ' Стиль отображения ярлычков

TabStrip1.MultiRow=False ' He отображать ярлычки в несколько рядов

TabStrip1.Font.Size="10" ' Размер шрифта текста ярлычков

TabStrip1.Font.Name="Arial" ' Тип шрифта текста ярлычков

End Sub

В этой же процедуре определяется стиль и параметры шрифта элемента управления TabStrip1. Свойство Font элемента управления хранит ссылку на объект Font (Шрифт), который определяет параметры шрифта надписей ярлычков.

Примечание

Так как объект TabStrip1, как элемент объектной модели документа, имеет свойство Style, определяющее свойства каскадных таблиц стилей этого элемента, то ссылка на свойство style элемента управления TabStrip, представленного объектом TabStrip1, осуществляется через свойство object (см. выше раздел "Элементы управления ActiveX и сценарии").

Если эту процедуру добавить в разрабатываемую нами HTML-страницу, а также определить значение переменной N, представляющей число элементов управления ActiveX в нашей галерее, и названия этих элементов управления в элементах массива Name, то при загрузке страницы будут отображаться ярлычки с названиями элементов управления ActiveX и плавающий фрейм.

Теперь следует связать выбор каждого ярлычка с загрузкой в плавающий фрейм HTML-страницы, описывающей соответствующий названию ярлычка элемент управления ActiveX. Это осуществляется в процедуре обработки события click элемента управления TabStrip, которое генерируется при щелчке кнопкой мыши на каком-нибудь ярлычке элемента управления:

Function TabStrip1_Click()

Window.FloatingFrame.Location.Href = "actx-" & _

TabStrip1.SelectedItem.Index & ".html"

End Function

Чтобы загрузить HTML-страницу в плавающий фрейм, необходимо присвоить адрес этой страницы свойству Href объекта Location этого фрейма. Если страница расположена на том же сервере и в том же каталоге, что и исходная HTML-страница, то достаточно задать только имя загружаемой страницы. В нашем примере при щелчке на первом ярлычке будет загружаться файл actx-1.html, При щелчке на втором— actx-2.html и т.д. Свойство SelectedItem элемента управления TabStrip содержит объект Tab, соответствующий выбранной вкладке, а свойство index хранит его индекс в наборе Tabs.

Предупреждение

При именовании процедуры обработки событий элемента управления ActiveX имя события задается без префикса on (в соответствии с правилами именования VBScript).

Суммируя все вместе на одной HTML-странице, получаем окончательный исходный текст нашего приложения.

Пример 11.2. Галерея элементов управления ActiveX

<head>

<script LANGUAGE="VBScript" TYPE="text/vbscript">

<!--

Dim Name()

N=12

ReDim Name(N)

Name(1)="TabStrip"

Name(2)="Label"

Name(3)="TDC"

Name(4}="RDS.Control"

Name(5)="FlexGrid"

Name(6)="Button"

Name(7)="TreeView"

Name (8)="OptionButton"

Name(9)="CheckList"

Name(10)="Slider"

Name(ll)="Image"

Name(12)="Picture"

Sub Window_OnLoad()

For I=1 To N

TabStrip1.Tabs.Add()

TabStrip1.Tabs(I).Caption=Name (I)

Next

TabStrip1.obj ect.Style=0

TabStrip1.MultiRow=False

TabStrip1.Font.Size="10"

TabStrip1.Font.Name="Arial"

End Sub

Function TabStrip1_Click()

Window.FloatingFrame.Location.Href = "actx-" &

TabStrip1.Selectedltern.Index & ".html"

End Function

'-->

</script>

</head>

<body bgcolor="lightgrey">

<H2 STYLE="color:red; backgrounr-color:lightgrey">

ГАЛЕРЕЯ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ ActiveX</H2>

<table border="1">

<tr>

<td>

<object ID="TabStrip1"

WIDTH="720" HEIGHT="33"

CLASSID="clsid:lEFB6596-857C-llDl-Bl6A-OOCOF0283628">

</object>

</td>

</tr>

<tr>

<td>

<IFRAME ID="FloatingFrame" HEIGHT="400" WIDTH="720">

</IFRAME>

</td>

</tr>

</table>

</body>

Обратим внимание, что массив Name задается как динамический. Это сделано для того, чтобы легче можно было добавлять описание дополнительных элементов управления ActiveX.

Аналогично можно сделать галерею картин любимого художника, образцов производимой продукции и т. д.

Элемент управления TreeView

Элемент управления TreeView предназначен для отображения в компактном виде данных древовидной структуры. Этот элемент управления часто используется для представления оглавления книг, иерархической структуры базы данных, каталогов данных на жестком диске компьютера и т. д. Например, он может отражать оглавление книги "Справочник Web-мастера" издательства BHV.

Основной единицей этого элемента управления ActiveX является узел, который в самом общем случае состоит из изображения и метки. Изображения для узлов поставляются элементом управления ImageList, ассоциированным с элементом управления TreeView. Например, самый первый узел нсостоит из изображения раскрытой книги и метки, задающей отображаемый текст этого узла ("Справочник Web-мастера").

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

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

Каждый узел реализован в виде программируемого объекта Node (Узел). Эти объекты хранятся в наборе Nodes элемента управления TreeView. Свойство index узла позволяет определить его индекс в наборе Nodes. Узлы помещаются в этот набор в соответствии с порядком их задания в программе.

Каждый узел может быть либо только родителем других узлов (тогда он является началом дерева и называется корневым узлом), либо только порожденным узлом (тогда он завершает ветвь дерева), либо и родителем, и порожденным узлом одновременно (тогда он расположен в точке ветвления дерева). Корневых узлов может быть несколько. Они не связаны между собой никакими "родственными" связями, и порождают, каждый в отдельности, самостоятельные деревья иерархической структуры. Любое дерево может иметь только один корневой элемент.

Для определения "родства" узлов объект Node имеет набор свойств, позволяющих определить родителя (свойство Parent), первый порожденный узел (свойство child), количество порожденных узлов (свойство children) и корневой узел (свойство Root).

Узлы, непосредственно порождаемые каким-либо узлом, являются узлами-"братьями", или узлами одного уровня. Ряд свойств позволяет обрабатывать подобные "родственные" связи: Firstsibiing возвращает ссылку на первый узел из множества узлов одного уровня, Lastsibiing — на последний узел из этого множества, Next определяет следующего брата, a Previous — предыдущего.

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

Но как создать узлы, как определить, какой узел порождает другой, как задать корневой узел дерева? Для этого предназначен метод Add набора Nodes, имеющий следующий синтаксис:

объектТгееView.Nodes.Add узел, отнош, ключ, текст, изобр, выбр_изобр

Первый параметр узел этого метода определяет объект Node, относительно которого создается новый узел элемента управления TreeView с заданным параметром отнош "родственным" отношением. Параметр узел задает либо индекс, либо уникальный ключ существующего объекта Node (см. ниже). Параметр отнош может быть целым числом от 0 до 4. Описание всех значений этого параметра и определяемых ими отношений представлено в табл. 11.1.

Таблица 11.1. Родственные отношения узлов в методе Add

Значение параметра отнош

Описание

0

Новый узел создается перед всеми узлами того же уровня, что и узел, определяемый параметром узел

1

Новый узел создается после всех узлов того же уровня, что и узел, определяемый параметром узел

2

Новый узел создается непосредственно после узла, определяемого параметром узел

3

Новый узел создается непосредственно перед узлом, определяемым параметром узел

4

Новый узел создается как узел, порождаемый узлом, который определен параметром узел

Примечание

Если отсутствует параметр узел, то метод Add создает корневой узел дерева.

Параметр ключ задает уникальный идентификатор, или уникальный ключ узла, по которому можно ссылаться на создаваемый узел. Его значением является символьная строка.

Параметр текст определяет строку текста, появляющуюся в метке узла при отображении в браузере элемента управления.

Последние два параметра изобр и выбр_изобр определяют, соответственно, графическое изображение в узле и графическое изображение, когда узел выбран щелчком кнопки или с помощью клавиш со стрелками. Их значениями являются ссылки на графические изображения, хранящиеся в элементе управления ImageList, присоединенном к элементу управления TreeView (см. ниже).

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

Пусть структура содержания книги, отображаемая в элементе управления TreeView, создана с помощью следующих операторов:

imgList1.ListImages.Add,"open", LoadPicture("D:/Picture/open.jpg")

imgList1.List1mages.Add, "close", LoadPicture("D:/Picture/close.jpg")

imgList1.ListImages.Add,"leaf", LoadPicture("D:/Picture/leaf.jpg")

TreeView1.ImageList=imgList1

TreeView1.Nodes.Add ,,"R","Справочник Web-мастера" ',"close"

TreeView1.Nodes.Add "R", 4,"Intr","Предисловие" ',"leaf"

TreeView1.Nodes.Add "R", 4,"Ch1","Глава 1. Введение" ', "close"

TreeView1.Nodes.Add "Ch1", 4,"Par1","0 Web в двух словах" f,"leaf"

TreeView1.Nodes.Add "Ch1", 4,"Par2","Кто такие Web-мастера?" ', "leaf"

TreeView1.Nodes.Add "Ch1", 4,"Par3","Рекомендуемая литература" ',"leaf"

TreeView1.Nodes.Add "R", 4,"Part1","Часть 1. HTML","close"

TreeView1.Nodes.Add "Part1", 4,"Ch2","Глава 2. Обзор HTML","close"

TreeView1.Nodes.Add "Ch2", 4,"Par1-2","Структура HTML-документа", "leaf"

TreeView1.Nodes.Add "Ch2", 4,"Par2-2","Синтаксис HTML-тэгов","leaf"

TreeView1.Nodes.Add "Part1", 4,"Ch3","Глава 11. Тэги HTML", "close"

TreeView1.Nodes.Add "Ch3", 4,"Par1-3", _

"Описание тэгов HTML и их параметров","leaf"

TreeView1.Nodes.Add "Part1", 4, "Ch4", "Глава 4. Фреймы","close"

TreeView1.Nodes.Add "Ch4", 4,"Par1-4","Компоновка фреймов","leaf"

TreeView1.Nodes.Add "Ch4", 4,"Par2-4","Вложенные наборы фреймов","leaf"

TreeView1.Nodes.Add "Ch4", 4,"РагЗ-4","Тэг <FRAME>","leaf"

TreeView1.Nodes.Add "Ch4", 4, "Par4-4","Целевые фреймы","leaf"

TreeView1.Nodes.Add "Ch4", 4, "Par5-4", "Параметры обрамления фреймов", "leaf"

TreeView1.Nodes.Add "R", 4,"Part2","Часть 2. CGI","close"

Первые три оператора этого фрагмента определяют список графических изображений, хранящихся в элементе управления ImageList, который определен переменной ImageList1. Для добавления ссылок на графические изображения предназначен метод Add набора List1mages элемента управления. Именно этот набор содержит ссылки на все графические изображения, хранящиеся в элементе управления ImageList. Для работы метода Add необходимо задание трех параметров. Первый параметр, не обязательный, определяет индекс в наборе List1mages включаемого изображения. Второй параметр задает уникальный ключ изображения, который используется в качестве значений параметров изобр и выбр_изобр метода Add набора Nodes элемента управления TreeView. Последний параметр определяет файл включаемого изображения, причем он определяется с помощью функции LoadPicture(имя файла).

Четвертым оператором осуществляется привязка элемента управления ImageList 1 к элементу управления TreeView, определяемому переменной TreeView1. Это делается простым присваиванием свойству imageList элемента управления TreeView1 ссылки на элемент управления ImageList 1.

Остальные операторы приведенного фрагмента текста сценария задают узлы отображаемой структуры содержания книги и не требуют пояснений.

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

Создадим HTML-страницу, на которой разместим элемент управления TreeView, содержащий оглавление книги, и плавающий фрейм, в котором будет отображаться содержимое глав при щелчке кнопкой мыши на соответствующем узле элемента управления TreeView:

<body bgcolor="lightgrey">

<P>

<!-Элемент управления TreeView-->

<object id="TreeView1"

classid="clsid:C74190B6-8589-llDl-B16A-00C0F0283628"

width="250" height="300">

</object>

<!-Элемент управления ImageList-->

<object id="imgList1" width=0 height=0

classid="clsid:2C247F23-8591-11D1-B16A-00C0F0283628">

</object>

&nbsp;Snbsp;&nbsp;&nbsp;&nbsp;

<IFRAME ID="iFrame1" WIDTH=680 HEIGHT=300>

</IFRAME>

</p>

</body>

Обратите внимание, что кроме элемента управления TreeView на страницу помещен и элемент управления ImageView, который необходим для привязки графических файлов изображений в узлах иерархической структуры, отображаемой элементом управления TreeView. Так как этот элемент управления не имеет видимого интерфейса, то значения параметров WIDTH и HEIGHT, определяющих размеры, не влияют на его отображение и установлены равными нулю.

Инициализацию элементов управления, как обычно, произведем в процедуре обработки события Load (Загрузка) объекта window. Но прежде создадим графические изображения, которые будут использоваться в раскрываемых и завершающих ветвях дерева оглавления узлах. Их можно создать в любом графическом редакторе, причем размеры не имеют значения, так как при отображении их в узлах они автоматически масштабируются. Для свернутого узла будем использовать изображение из файла "open.jpg", для раскрытого узла — из файла "close.jpg" и для завершающего ветвь узла — из файла "leaf.jpg".

Теперь, создав графические изображения, необходимо поместить их в элемент управления imgList1 и связать его с элементом управления TreeView1 до того, как начинать создавать структуру оглавления. Ниже представлен код процедуры обработки события загрузки окна:

Sub Window_onLoad()

imgList1.ListImages.Add, "open", LoadPicture("D:/Picture/open.jpg")

imgList1.ListImages.Add,"close", LoadPicture("D:/Picture/close.jpg")

imgList1.ListImages.Add,"leaf", LoadPicture("D:/Picture/leaf.jpg")

TreeView1.ImageList=imgList1

TreeView1.Nodes.Add ,,"R","Интерактивные Web-документы","close"

TreeView1.Nodes.Add "R", 4,"Ch1","Глава 1","leaf"

TreeView1.Nodes.Add "R", 4,"Ch2","Глава 2","leaf"

TreeView1.Nodes.Add "R", 4,"Ch3","Глава 3","leaf"

End Sub

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

Для того чтобы изображение узла менялось при его раскрытии и сворачивании, следует написать процедуры обработки событий DblClick, Expand и collapse элемента управления TreeView1. При двойном щелчке кнопкой мыши на узле, имеющем подчиненные узлы, он раскрывается или сворачивается. События Expand (Раскрыть) и collapse (Свернуть) генерируются при щелчке на квадратике, отображаемом слева от раскрываемого узла: первое, когда узел свернут, а второе, когда узел был раскрыт. В процедурах обработки этих событий необходимо просто заменить изображение в узле, соответственно, для события Expand на файл "open.jpg", а для события collapse на файл "close.jpg", тогда как в процедуре обработки двойного щелчка на узле следует проверить, раскрываемый ли это узел и в каком состоянии он находился: был раскрыт или свернут. После такой проверки заменить изображение на противоположное. Ниже представлены исходные тексты процедур обработки событий:

Sub TreeView1_DblClick()

If TreeView1.Selectedltern.Children <> 0 Then

If TreeView1.SelectedItem.Expanded = True Then

TreeView1.SelectedItem.Image = "open"

Else

TreeView1.SelectedItem.Image = "close"

End If

End If

End Sub

Sub TreeView1_Expand(ByVal Node)

Node.Image = "open"

End Sub

Sub TreeView1_Collapse(ByVal Node)

Node.Image = "close"

End Sub

Процедурам обработки событий Expand и Collapse в качестве параметра передается объект Node (узел) элемента управления TreeView1, на флажке которого был произведен щелчок кнопкой мыши. Он используется в этих процедурах для установки нового значения своего свойства image, в котором хранится ссылка на изображение.

В процедуре обработки события DblClick проверяется, имеет ли узел, на котором произведен щелчок (TreeView1.SelectedItem), порождаемые им узлы (свойство children не равно нулю). Если имеет, то проверяется, раскрыт ли он или нет. В зависимости от результатов проверки узлу назначается соответствующее изображение.

Теперь остается только при щелчке на завершающем узле ветви дерева оглавления загрузить в плавающий фрейм файл соответствующих глав книги. Это действие осуществляется в процедуре обработки события click элемента управления TreeView1:

Sub TreeView1_Click()

If TreeView1.SelectedItem.Children = 0 Then

Window.iFrame1.Location.Href = TreeView1.SelectedItem.Text & ".html"

End If

End Sub

Содержимое глав книги хранится в файлах "Глава l.html", "Глава 2.html" и "глава 3.html", расположенных в том же каталоге, что и файл нашего приложения, окончательный, полный текст которого приведен в примере 11.3.

Пример 11.3. Электронный вариант книги

<html>

<head>

<SCRIPT Language="VBScript">

Sub Window_onLoad()

imgList1.ListImages.Add,"open", LoadPicture("D:/Picture/open.jpg")

imgList1.ListImages.Add,"close", LoadPicture("D:/Picture/close.jpg")

imgList1.ListImages.Add,"leaf", LoadPicture("D:/Picture/leaf.jpg")

TreeView1.ImageList=imgList1

TreeView1.Nodes.Add ,,"R","Интерактивные Web-документы","close"

TreeView1.Nodes.Add "R", 4,"Ch1","Глава l","leaf"

TreeView1.Nodes.Add "R", 4,"Ch2","Глава 2","leaf"

TreeView1.Nodes.Add "R", 4,"Ch3","Глава 3","leaf"

TreeView1.object.Style=7

TreeView1.LineStyle=1

TreeView1.Font.Size=10

TreeView1.Font.Name="Arial"

End Sub

Sub TreeView1_Click()

If TreeView1.SelectedItem.Children = 0 Then

Window.iFrame1.Location.Href = TreeView1.SelectedItem.Text & ".html"

End If

End Sub

Sub TreeView1_DblClick()

If TreeView1.SelectedItem.Children <> 0 Then

If TreeView1.Selectedltern.Expanded = True Then

TreeView1.SelectedItem.Image = "open"

Else

TreeView1.SelectedItem.Image = "close"

End If

End If

End Sub

Sub TreeView1_Expand(ByVal Node)

Node.Image="open"

End Sub

Sub TreeView1_Collapse(ByVal Node)

Node.Image = "close"

End Sub

</SCRIPT>

</head>

<body bgcolor=lightgrey>

<P>

<object id="TreeView1"

classid="clsid:C74190B6-8589-HD1-B16A-00C0F0283628"

width="250" height="300">

</object>

<object id="imgList1" width=100 height=10

classid="clsid:2C247F23-8591-HD1-B16A-00C0F0283628">

</object>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

<IFRAME ID=iFrame1 WIDTH=680 HEIGHT=300>

</IFRAME>

</p>

</body>

</html>

В процедуру обработки события загрузки окна введены дополнительные установки для элемента управления TreeView. Свойство Font устанавливает параметры шрифта, которым отображается текст в метках узлов, а свойство style элемента управления TreeView определяет вид отображения узлов и всей иерархической структуры, представляемой этим элементом. Его значением может быть любое целое число из диапазона 0—7, определяющее, что отображается в узлах: 0 — только текст меток, 1 — изображение и текст, 2 — флажок и текст, 3 — флажок, изображение и текст, 4 — соединительные линии древовидной структуры и текст, 5 — линии, изображение и текст, 6 — линии, флажок и текст, 7 — линии, флажок, изображение и текст.

Предупреждение

Так как объект TreeView, как элемент объектной модели документа, имеет свойство style, определяющее свойства каскадных таблиц стилей этого элемента, то ссылка на свойство style элемента управления TreeView, представленного объектом TreeView1, осуществляется через свойство object (см. выше раздел "Элементы управления ActiveX и сценарии").

Java-апплеты

Java-апплеты — это еще один метод создания динамических HTML-документов. Технология Java была разработана относительно недавно (1995 г.) программистами фирмы Sun и в настоящее время продолжает быстро развиваться, занимая все более прочное положение на рынке программных средств для создания приложений Интернета. Она включает в себя язык программирования и платформу, для обозначения которых используется одно название — Java.

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

Программа на языке Java транслируется компилятором в специальный байтовый код — Java bytecode, называемый также J-кодом, для выполнения которого требуется интерпретатор Java. Таким образом, язык Java является одновременно компилируемым и интерпретируемым. Интерпретатор Java — это приложение, предназначенное для конкретной аппаратно-программной платформы: PC-Windows, PC-Linux, Mac, UNIX-машины. J-код не зависит от платформы. Он может быть подготовлен, например, на рабочей станции Sun, работающей под управлением операционной системы Solaris, а выполнен на персональном компьютере под управлением Windows NT. Это обеспечивает архитектурную независимость и переносимость программ на языке Java. Байтовый код Java можно рассматривать как набор машинных команд для некоторой виртуальной машины, реализуемой интерпретатором. Он может исполняться в любой среде, в которой выполняется виртуальная машина Java.

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

Класс определяет целый тип данных. Конкретный экземпляр этого типа называется объектом. Написание Java-программы заключается в создании нового класса или совокупности связанных между собой классов, то есть в определении набора данных, описывающих решаемую программистом задачу, и в конструировании методов, реализующих обработку этих данных. При этом для порождения новых классов может использоваться существующая базовая коллекция классов. Исходный текст на языке Java, составляющий описание класса, сохраняется в файле, имя которого имеет расширение JAVA. Этот файл компилируется в J-код и сохраняется в файле с тем же именем и расширением CLASS. Скомпилированные классы Java в виде J-кода могут храниться локально на компьютере или распределенно в сети и динамически загружаться выполняющимися приложениями по мере необходимости.

Платформа Java состоит из виртуальной машины и интерфейса прикладного программирования Java API. Виртуальная машина предназначена для выполнения J-кода на различных платформах. Интерфейс прикладного программирования Java представляет собой большую коллекцию классов в формате J-кода, сгруппированных по своему назначению в отдельные пакеты. Список имеющихся пакетов занимает несколько страниц текста, и каждый из пакетов содержит коллекцию классов. Для работы с такой сложной структурой используется специальная схема именования пакетов и классов, напоминающая доменную систему имен Интернета (DNS). Например, имя java.iang определяет пакет, содержащий базовые классы самого языка Java. Имя java.iang.object определяет класс object внутри этого пакета. Пакеты, имена которых начинаются со слова java, составляют основу интерфейса прикладного программирования и входят в состав любой платформы Java. Кроме основной части API существуют стандартные расширения для работы с трехмерной графикой, анимацией и т. д.

Для создания Java-программ необходим набор средств разработчика Java Development Kit (JDK), включающий в себя базовую коллекцию классов, компилятор javac, отладчик jdb, виртуальную машину java для выполнения готовых приложений и программу просмотра апплетов Appletviewer. Существуют варианты набора JDK от фирм Sun и Microsoft и, кроме того, визуальные средства разработки фирм Microsoft, Borland, Symantec. Основным разработчиком, определяющим направление развития технологии Java, является фирма Sun, поэтому лучше использовать инструментальные средства именно этого производителя. К тому же визуальные средства не позволяют проследить все стадии разработки программы. Сведения о текущей версии и приобретении JDK можно получить на сервере Sun http://www.javasoft.com.

Приложения и апплеты

В среде Java существуют два основных типа программ: приложения (application) и апплеты (applets). Приложение — это самостоятельная программа, для выполнения которой требуется только наличие виртуальной машины Java. Апплет — это программа, которая предназначена для выполнения в составе Web-браузера или специальной программы просмотра апплетов.

Схема применения апплетов выглядит следующим образом. Апплет создается, компилируется и сохраняется на Web-сервере. В HTML-документ, выставляемый на сервере, при помощи специального тэга помещается ссылка на местоположение апплета. При получении документа с сервера браузер загружает апплет и начинает его выполнять. Такой подход к созданию динамических документов прямо противоположен подходу, который используется в программировании интерфейсов CGI: апплет выполняется на стороне клиента, а CGI-сценарий — на стороне сервера. Два основных браузера, Netscape и Internet Explorer, имеют в своем составе средства для выполнения апплетов, включающие виртуальную машину и набор классов.

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

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

Апплет не может:

Для проверки соблюдения правил безопасности существует специальный класс java.lang.SecurityManager. Экземпляр этого класса выполняется в составе Виртуальной Java-машины браузера. Когда объект java.lang.SecurityManager обнаруживает нарушение правил безопасности, возникает исключение (понятие близкое понятию прерывание, означающее возникновение ситуации, требующей специальной обработки), которое апплет перехватывает и реагирует заданным образом.

Структура приложения

Мы установили, что апплет это особый тип Java-приложения. Прежде чем перейти к рассмотрению апплетов, рассмотрим простейший пример приложения, не являющегося апплетом. В соответствии с международной традицией изучение языка программирования начинается с написания программы "Hello, world!". He будем ее нарушать. Создадим файл HelloWorld. java, содержащий следующий текст:

Пример 11.4. Программа "Helto, world!" на языке Java

class HelloWorldApplication {

public static void main(String[] args) {

System.out.println("Hello, World!");

}

}

и скомпилируем его, используя компилятор javac:

javac HelloWorldApplication.Java

Результатом компиляции является файл HelloWorldApplication.class, содержащий J-код, выполнение которого на виртуальной Java-машине завершается выводом строки

Hello, World!

Как мы уже знаем, программа на языке Java строится из классов. Простая программа состоит из одного класса. Определение класса должно содержать две обязательные компоненты — ключевое слово class и следующее за ним имя класса. В примере это имя HelloWorldApplication. Оно должно совпадать с именем файла, содержащего текст программы. Следует иметь в виду, что в языке Java различаются большие и малые буквы. Компилятор следит за правильностью употребления имен: HelloWorld и Helloworld обозначают разные имена. Кроме обязательных компонентов определение может содержать модификаторы, характеризующие некоторые свойства класса. Вот список всех модификаторов в порядке их появления в определении.

public Класс может быть использован классами из другого пакета; по умолчанию класс может использоваться только классами из одного с ним пакета
abstract Абстрактный класс, для которого нельзя создать экземпляры; используется для последующего создания подклассов, дополняющих его структуру и поведение
final Объявляет p том, что для данного класса нельзя создавать подклассы
class class_name Обязательная часть определения класса
extends Superclass Определяет, что для данного класса надклассом является Superclass
implements lnterface_list Определяет, что данный класс реализует список интерфейсов Inteface_list

Внутри фигурных скобок содержится описание переменных и методов данного класса. В классе HelloWorldApplication отсутствуют переменные и имеется всего один метод с именем main(). Каждое приложение Java обязательно должно содержать метод main (). При запуске приложения ему можно передать параметры через строковый массив string [ ] args. В рассмотренном примере метод main о состоит из одного обращения к методу System.out.printin(), направляющему список своих аргументов в стандартный выходной поток.

Описания переменных и методов содержат обязательные компоненты и модификаторы. Обязательными являются имя, а также тип переменной или тип значения, возвращаемого методом. Если метод не возвращает никакого значения, то в качестве описателя типа используется ключевое слово void.

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

Интерфейсы

Интерфейс по своей структуре очень похож на абстрактный класс, в определении которого вместо ключевого слова class используется ключевое слово interface:

interface interface_name [extends interface_name] {

[описание переменной;]

[описание метода;]

}

Интерфейс может содержать описание переменных и заголовки описаний методов. Сами методы являются пустыми, их реализация в интерфейсе не определена. Интерфейс может наследовать свойства любого числа других интерфейсов, задаваемых при помощи модификатора extends interface_name. Если класс реализует некоторый интерфейс, то он должен явно определить все методы, перечисленные в описании интерфейса. Применению интерфейсов можно дать следующее объяснение. Класс может наследовать свойства (переменные и методы) только одного класса. Если родительский класс не содержит необходимых методов, то наследующий класс должен определить и реализовать их самостоятельно. Но лучше делать это, следуя определенной схеме. Эта схема, содержащая необходимые переменные и названия методов, предлагается интерфейсами. Класс же может реализовать любое число интерфейсов.

Например, интерфейс java.awt.event.MouseListener имеет следующее описание

public abstract interface MouseListener extends EventListener {

void mouseClicked(MouseEvent e)

void mouseEntered(MouseEvent e)

void mouseExited(MouseEvent e)

void mousePressed(MouseEvent e)

void mouseReleased(MouseEvent e)

}

Класс, используемый в системе графического интерфейса пользователя и предполагающий обрабатывать события, связанные с манипуляциями мышью: нажатие и отпускание кнопки, щелчок, перемещение курсора мыши в пределы и за пределы объекта, должен реализовать интерфейс java.awt.event.MouseListener. Внутри класса для слежения за этими собы-тиями при помощи метода addMouseListener создается специальный объект. Когда этот объект регистрирует одно из перечисленных событий, вызывается метод обработки этого события, указанный в интерфейсе java.awt.event. Mouse Listener и реализованный в самом классе.

Апплеты

После того как мы познакомились со структурой и рассмотрели простой пример обычного приложения, сделаем то же самое применительно к апплетам. С точки зрения структуры апплет отличается от приложения, прежде всего, отсутствием метода main (). Любой апплет представляет собой подкласс класса Applet. В иерархии пакетов и классов вновь создаваемый апплет newApplet занимает место согласно схеме, показанной на рис. 11.8.

Рис. 11.8. Место апплета newApplet в иерархии классов

Каждый апплет, являясь подклассом класса java.applet.Applet, наследует все переменные и методы своих предшественников в данной иерархической структуре. В частности, класс Applet определяет следующие собственные методы.

Таблица 11.2. Методы класса Applet

Тип возвраща-емого значения Метод Описание
void Destroy () Вызывается браузером, чтобы сообщить ап плету о предстоящем завершении его работы с тем, чтобы он мог освободить используемые им ресурсы

AppletContext

getAppletContext ( )

Предоставляет возможность получать информацию о среде, в которой выполняется апплет и воздействовать на нее. Средой апплета является HTML-документ, содержащий этот апплет

String

getAppletlnfo()

Возвращает информацию о самом апплете

Audi oC lip

getAudioClip(URL url)

Возвращает объект типа AudioClip, находящийся по адресу url

AudioClip

getAudioClip(URL url, String name)

Возвращает объект типа AudioClip, задаваемый параметрами url и name: url — базовый URL, задающий местоположение каталога name — местоположение аудио-клипа относительно каталога url

URL

getCodeBase ( )

Возвращает базовый URL апплета

URL

GetDoc umentBase ( )

Возвращает базовый URL документа, в который встроен апплет

Image

get Image (URL url)

Возвращает графический объект типа image, который затем может быть отображен на экране. Объект задается своим адресом URL

Image

get Image (URL url, String name)

Возвращает графический объект типа Image, который затем может быть отображен на экране. Объект задается своим базовым адресом url и относительным name

Locale

getLocale ( )

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

String

get Parameter (String name)

Возвращает значение именованного параметра name, определенного в HTML-тэге <param>

String [ ] [ ]

getParameterlnfо ( )

Возвращает строковый массив, содержащий информацию о параметрах. Обычно переопределяется в описании апплета

void

init()

Вызывается браузером для инициализации апплета: просмотра списка параметров, построения интерфейса пользователя, загрузки ресурсов

boolean

is Active ( )

Сообщает, является ли апплет активным

void

play (URL url)

Проигрывает аудиоклип, расположенный по указанному адресу url

void

play (URL url, String name)

Проигрывает аудиоклип, расположенный по указанному адресу, определяемому базовым адресом url и относительным name

void

resize (Dimension d)

Запрашивает новые размеры для апплета, задаваемые при помощи аргумента типа Dimension

void

resize (int width, int height)

Запрашивает новые размеры для апплета, задаваемые при помощи аргументов, определяющих новую ширину width и высоту height

void

setStub (AppletStub stub)

Вызывается браузером перед инициализацией апплета для создания интерфейса между апплетом и средой браузера

void

showStatus (String msg)

Запрашивает браузер отобразить в окне состояния строку

msg

void

start ()

Вызывается каждый раз, когда апплет попадает в область видимости

void

stop ( )

Вызывается каждый раз, когда апплет исчезает из области видимости для приостановки его выполнения

Обсудим применение некоторых методов, оформив в виде апплета программу "Hello, World!". Создадим для этого подкласс класса Applet и сохраним его в файле HelloWorld. java. Простейший вариант может выглядеть следующим образом:

Пример 11.5. Текст апплета HelloWorld. java ;

import java.applet.Applet;

import java.awt.Graphics;

public class HelloWorld extends Applet {

public void paint(Graphics g) {

g.drawstring("Hello world!", 5, 15);

}

}

Первые две строки содержат оператор import. Он позволяет использовать внутри текущего класса сокращенные имена классов. Если бы его не было, то для ссылки на класс необходимо было указывать полное имя, определяющее положение класса в иерархии классов Java, например, java.applet.Applet.

Выводимая строка "Hello world" должна появиться в окне браузера, поэтому вместо записи ее в стандартный выходной поток используется метод drawstring о класса java.awt.Graphics, используемый для отображения заданной строки в окне браузера. Пакет java.awt содержит полный набор классов для создания графического интерфейса пользователя и отображения графики и изображений.

Метод paint() является методом класса java.awt.Container и используется для изображения объекта, которому он принадлежит. В данном примере он переопределяется так, чтобы выводить изображение строки.

Для того чтобы просмотреть апплет в окне браузера, необходим HTML-документ, в который при помощи специального тэга вставлена ссылка на апплет. Создадим файл HelloWorld.html:

<HTML>

<HEAD><TITLE>Программа "Hello, world"</TITLE></HEAD>

<BODY>

<H3>Программа выводит строку:</H3>

<APPLET CODE="HelloWorld.class" WIDTH=150 HEIGHT=25>

</APPLET>

</BODY>

</HTML>

Откроем этот файл в окне браузера. Мы должны увидеть изображение, показанное на рис. 11.9.

Рис. 11.9. HTML-документ апплета HelloWorld

Встраивание апплета в HTML-документ

Для встраивания апплетов в HTML-документ можно использовать два тэга: <APPLET> или <OBJECT>. Для каждого из них существует обязательный закрывающий тэг, соответственно </APPLET> и </OBJECT>. В спецификации языка HTML 4.0 тэг <APPLET> называется отмененным и рекомендуется использовать для встраивания апплетов более общий тэг <OBJECT>, который был описан ранее в этой главе. Вместе с тем, тэг <APPLET> продолжает широко использоваться. В версии языка HTML 4.0 он имеет следующий набор собственных параметров:

Задает базовый URL апплета. Если значение этого параметра не задано, то по умолчанию используется базовый URL текущего документа. Значением параметра может быть только URL-адрес каталога текущего документа или его подкаталогов.

Задает список разделенных запятыми URL-адресов архивов. Архивы содержат классы и другие ресурсы, которые могут быть использованы апплетом. Они предварительно загружаются браузером для повышения производительности апплета. Адреса архивов задаются относительно базового URL апплета.

Определяет имя и местоположение файла, содержащего класс апплета, относительно базового URL апплета. Один из параметров code или object должен обязательно присутствовать.

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

Указывается альтернативный текст для замены области <APPLET> в браузерах, которые не могут отображать апплеты.

Задает имя конкретного экземпляра апплета.

Ширина области апплета в пикселах.

Высота области апплета в пикселах.

Задает выравнивание апплета в соответствии с заданным значением параметра.

Задает размер дополнительного пространства слева и справа от области апплета. Может задаваться в пикселах или процентах доступного свободного пространства.

Задает размер дополнительного пространства сверху и снизу от области апплета. Может задаваться в пикселах или процентах доступного свободного пространства.

Жизненный цикл апплета

Каждый апплет имеет свой цикл существования. То, что происходит с апплетом при открытии документа, просмотре, переходе к другому документу и возвращении, зависит от методов init(), start(), stop(), destroy(). Вызывая эти методы, браузер или программа просмотра апплетов appletviewer управляют поведением апплета.

Метод init() вызывается один раз сразу после загрузки документа и создания апплета. Он используется для того, чтобы подготовить условия для выполнения апплета, например, создать интерфейс пользователя: кнопки, области ввода текста и другие элементы управления. Апплету могут понадобиться различные ресурсы, которые также удобно загрузить во время инициализации: шрифты, изображения и т. д.

Метод start() вызывается каждый раз, когда апплет становится видимым, метод stop(), напротив, когда апплет становится невидимым. Такая смена состояний происходит, например, при просмотре многостраничного документа или переходе по ссылке к другому документу и возвращении обратно. Метод stop () приостанавливает выполнение апплета, а метод start () возобновляет.

Метод destroy() также вызывается всего один раз и сообщает апплету о необходимости перед завершением работы освободить используемые ресурсы, кроме процессора и памяти.

Указанные методы могут переопределяться конкретным классом апплета. Рассмотренный пример HelloWorld. java все методы наследует, переопределяя только метод paint() для вывода изображения строки. Метод paint(), а также метод update(), наследуемые у класса java.awt.container, используются для изображения на экране того объекта, к которому они относятся. Метод paint () полностью перерисовывает объект, а метод update () рисует только изменения в изображении объекта, экономя время, необходимое для восстановления картинки. Управление обновлением изображения организовано таким образом, что метод update () никогда не вызывается объектом непосредственно, а только через метод repaint(), как будет показано ниже. Методы paint() и update(), как правило, переопределяются внутри апплета.

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

Пример 11.6. Текст апплета HeiloWorld2. java

import java.applet.*;

import java.awt.*;

public class HelloWorld2 extends Applet {

private Font font;

public void init() {

font = new Font("Arial", Font.ITALIC, 48);

}

public void paint(Graphics g) {

// The pink oval

g.setColor(Color.blue);

g.fillOval(10, 10, 330, 100);

g.setColor(Color.yellow);

g.setFont(font);

g.drawstring("Hello, World!", 40, 75);

}

}

В этом примере уже переопределяется метод init (), осуществляющий загрузку необходимого ресурса — шрифта "Arial" для отображения выводимой строки.

Изображение апплета в окне браузера показано на рис. 11.10.

Рис. 11.10. HTML-документ апплета HelloWorld2

В следующем примере мы попытаемся переопределить методы, управляющие жизненным циклом апплета: init(), start(), stop(), destroy(), таким образом, чтобы каждое обращение к ним сопровождалось сообщением, выводимым на экран.

Пример 11.7. Текст апплета HelloWorld3.java

import Java.applet.Applet;

import java.awt.Graphics;

public class HelloWorldS extends Applet {

StringBuffer buffer;

int start=0;

int stop=0;

public void init() {

buffer = new StringBuffer();

addItem("Инициализация; ");

}

public void start () {

addItem("Запуск апплета "+(++start)+"-й раз; ") ;

}

public void stop() {

addItem("Приостановка апплета "+(++stop)+"-й раз; ");

}

public void destroy() {

addItem("Заканчиваем работу");

}

void addItemfString newWord) {

System.out.println(newWord);

buffer.append(newWord);

repaint();

}

public void paint(Graphics g) {

g.drawRect(0, 0, getSize().width-1, getSize().height - 1);

g.drawstring("Hello, world!", 5, 15);

g.drawstring(buffer.toString(), 5, 30);

}

}

В данном примере каждый из методов init(), start(), stop(), destroy() использует определенный внутри апплета метод additemo для добавления к переменной buffer своего сообщения. Затем изображение строки buffer, помещенное после приветствия "Hello, world!" в прямоугольной рамке, при помощи метода paint() отображается на экране. Обратите внимание на тип переменной buffer. В языке Java для описания строкового типа используются классы string и stringBuffer. Класс string служит для представления строковых констант, а класс stringBuffer — строковых переменных.

Рис. 11.11. HTML-документ апплета HelloWorld3

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

Создание графического интерфейса пользователя

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

Для работы с окнами, графикой и создания пользовательского интерфейса в состав средств разработчика JDK входит наборAWT (Abstract Windowing Toolkit). Ему соответствует пакет java.awt, содержащий все необходимые классы. НаборAWT предоставляет для создания интерфейса пользователя такие компоненты:

Кнопка (класс java.awt.Button).
Флажок (класс java.awt.Checkbox).
Строка текста (класс java.awt.TextField).
Многострочное текстовое поле (класс java.awt.TextArea).
Метка (класс java.awt.Label).
Список (класс java.awt.List).
Всплывающее меню (класс java.awt.Choice).
Полоса прокрутки (класс java.awt.Scrollbar).
Графическая область экрана (класс java.awt.Canvas).
Меню (класс java.awt.Menu).

Начиная с версии 1.1, набор JDK содержит новый комплект средств разработки графического интерфейса пользователя — Swing. Комплект Swing содержит многие элементы, отсутствующие в комплекте AWT, но не является его полной заменой. Swing позволяет создавать элементы графического интерфейса, которые выглядят одинаково на различных платформах. Как известно, в графической оконной системе UNIX внешний вид элементов интерфейса зависит от выбора соответствующей библиотеки, содержащей набор этих элементов. Используя Swing, можно создавать графический интерфейс, внешне одинаковый для разных платформ. В Java 1.2 пользовательский интерфейс рекомендуется создавать, используя Swing вместо AWT.

В следующем примере для иллюстрации используется всего один элемент GUI — текстовое поле, которое может содержать несколько одновременно отображаемых строк текста с возможностью просмотра в горизонтальном и вертикальном направлении.

Пример 11.8. Текст апплета HellоWorld4.java

import java.applet.Applet;

import java.awt.TextArea;

public class HelloWorld4 extends Applet {

TextArea text_area;

int start=0;

int stop=0;

public void init() {

text_area = new TextArea("Hello, World!");

text_area.setEditable(false) ;

setLayout(new java.awt.GridLayout(1,0));

add(text_area);

addItem("Инициализация;") ;

}

public void start() {

addItem("Запуск апплета "+(++start)+"-й раз; ");

}

public void stop() {

addItem("Приостановка апплета "+(++stop)+"-й раз; ") ;

}

public void destroy() {

addItem("Заканчиваем работу");

}

void addItem(String newWord) {

text_area.append(newWord);

}

}

Изображение апплета представлено на рис. 11.12.

Рис. 11.12. HTML-документ апплета HelloWorld4

Последний пример отличается от предыдущего только способом вывода на экран текста. В примере 11.8 для вывода используется элемент графического интерфейса — текстовая область. Это изменение находит отражение в тексте апплета. В последнем примере отсутствует переопределение метода paint (). В нем нет необходимости, так выводом на экран теперь управляет не метод апплета, а сам элемент интерфейса. Посмотрим, в каком месте программы это происходит.

Основные изменения произошли в методе init(). Сам апплет содержит новую переменную text_area, которая может принимать значение ссылки на объект типа TextArea. Этот тип представляет область, способную отображать несколько строк текста. Метод init() в качестве первого шага инициализации апплета создает при помощи оператора new новый объект типа TextArea и выводит в него начальную строку "Hello, world!".

Вызов метода setEditabie () с аргументом false запрещает редактирование текста внутри области.

Следующие две строки содержат обращения к методам setLayout() и add(). Эти методы класс Applet наследует у класса java.awt.Container.

Метод add () служит для того, чтобы вставить в апплет элемент, задаваемый аргументом, в данном случае — текстовую область, на которую указывает переменная text_area.

Метод setLayLayout () создает новый объект типа GridLayout для управления размещением элементов внутри апплета.

Последнее замечание нуждается в пояснении. Существуют разные формы метода add (), отличающиеся количеством и типом аргументов. Форма, использованная в примере, не имеет дополнительных аргументов, при помощи которых можно было бы указать, каким образом следует расположить добавляемый элемент внутри апплета. А что произойдет, если кроме текстовой области добавить в апплет другие элементы: кнопки, метки, меню? Для управления размещением элементов внутри объектов-контейнеров (к HHV относятся и апплеты) в языке Java существует специальный тип объектов LayoutManager. Если говорить точнее, то java.awt.LayoutManager — это интерфейс, содержащий список методов, без их реализации, для управления компоновкой элементов внутри контейнера. Реализация методов интерфейса, как мы знаем, осуществляется внутри классов. В составAWT входят не сколько классов, реализующих некоторые общие схемы размещения. Это классы BorderLayout, CardLayout, FlowLayout, GridLayout, GridBagLayout. Внутри апплета создается объект одного из перечисленных типов, называемый менеджером размещения, который и управляет размещением элементов. В примере 11.8 используется менеджер типа GridLayout.

Менеджер BorderLayout старается разместить элемент в одной из пяти именованных областей контейнера: NORTH (СЕВЕР), SOUTH (ЮГ), EAS (ВОСТОК), WEST (ЗАПАД) и CENTER (ЦЕНТР), в соответствии со значением аргумента в методе add (), например:

add(new Button("OK"), BorderLayout.SOUTH);

Менеджер cardLayout размещает элементы подобно карточкам в картотеке, когда только одна карточка является видимой в каждый момент.

Менеджер FiowLayout размещает элементы слева направо и сверху вниз подобно тому, как размещается текст на странице.

Менеджер GridLayout делит область контейнера на равные прямоугольники и размещает элементы по одному в каждом прямоугольнике. Например, обращение к методу

setLayout(new GridLayout(3,2));

устанавливает для размещения элементов сетку, состоящую из трех строк и двух столбцов.

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

Обработка событий

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

Пример 11.9. Текст апплета HelloWorldS.Java

import java.awt.event.MouseListener;

import java.awt.event.MouseEvent;

import java.awt.event.KeyListener;

import java.awt.event.KeyEvent;

import Java.applet.Applet;

import java.awt.TextArea;

public class HelloWorldS extends Applet implements MouseListener,

KeyListener {

TextArea text_area;

int start = 0;

int stop = 0;

int click = 0;

int keytyped = 0;

public void init() {

addMouseListener(this);

addKeyListener(this);

text_area = new TextArea("Hello, World!",4,80) ;

text_area.setEditable(false);

setLayout(new java.awt.FlowLayout());

add(text_area);

addItem("Инициализация;");

}

public void start() {

addItern("Запуск апплета "+(++start)+"-й раз; ");

}

public void stop() {

addItem("Приостановка апплета "+(++stop)+ "-й раз; ");

} public void destroy() {

addItem("Заканчиваем работу");

}

void addltern(String newWord) {

text_area.append(newWord);

}

public void mouseEntered(MouseEvent event) {

}

public void mouseExited(MouseEvent event) {

}

public void mousePressed(MouseEvent event) {

}

public void mouseReleased(MouseEvent event) {

}

public void mouseClicked(MouseEvent event) {

addItem((++click)+"-й "+"щелчок;");

}

public void keyPressed(KeyEvent event) {

}

public void keyReleased(KeyEvent event) {

}

public void keyTyped(KeyEvent event) {

addItem((++keytyped)+"-oe "+" нажатие клавиши; ");

}

}

Прежде всего, мы замечаем, что изменилась первая строка описания класса. Она содержит предложение implements MouseListener, KeyListener. Это означает, как мы помним, что класс HelloWorld5 реализует два интерфейса: java.awt.event.MouseListener и Java,AWT.event.KeyListener, И, значит, обязан реализовать методы этих интерфейсов. Выше мы перечислили методы интерфейса java.awt.event.MouseListener. В классе HelloWorld5 они реализованы очень просто. Метод mouseClicked(), отвечающий за обработку щелчков мышью, вызывает метод additem() для добавления в текстовую область сообщения об этом событии. Остальные методы свои события игнорируют. Интерфейс java.awt.event.KeyListener объявляет три метода:

void keyPressed (KeyEvent e) Вызывается при нажатии клавиши
void keyReleased (KeyEvent e) Вызывается при отпускании клавиши

void keyTyped( KeyEvent e)

Вызывается при отпускании клавиши после нажатия

В классе HelloWorld5 все они также реализованы, но обрабатывается только отпускание клавиши после нажатия.

Если запустить апплет, то он будет реагировать на нажатие клавиш и щелчки мыши в своей области выводом сообщений, как показано на рис. 11.13.

Рис. 11.13. HTML-документ апплета HelloWorld5

В языке Java каждому типу событий соответствует класс, например, событиям, связанным с мышью, — класс MouseEvent, событиям, связанным с клавиатурой, — класс KeyEvent, событиям, которые генерируются при манипуляциях с компонентами пользовательского интерфейса (нажатие кнопки), — класс ActionEvent. Каждое событие имеет источник, представленный объектом, и идентификатор типа, позволяющий различать разные события одного класса, например, нажатие и отпускание клавиши. Модель обработки событий основана на применении специальных объектов — регистраторов событий. Объект-источник поддерживает список всех объектов-регистраторов. При возникновении события он вызывает метод объекта-регистратора и передает ему в качестве аргумента объект, соответствующий типу события. Чтобы источник события мог вызвать метод объекта-регистратора, необходимо, чтобы этот метод был регистратором реализован. С этой целью все объекты-регистраторы одного типа должны реализовывать соответствующий интерфейс. Например, если объект регистрирует события клавиатуры KeyEvent, то он должен реализовать интерфейс KeyListener.

В нашем примере в качестве регистратора событий клавиатуры и мыши используется сам апплет HelloWord5. Он добавляет себя в списки регистраторов к объектам-источникам событий при помощи методов addKeyListener() и addMouseListener (), соответственно. Идентификатор this обозначает текущий апплет. При щелчке мышью в области апплета объект-источник события вызовет метод mouseClicked(MouseEvent event), реализованный в апплете. Аналогично будут обрабатываться и другие события.

В примере 11.9 апплет обрабатывает не все события клавиатуры и мыши, но должен определять все методы соответствующего интерфейса, даже если он их не использует. В результате текст апплета содержит шесть пустых методов или "заглушек"; mouseEntered, mouseExited, mousePressed, mouseReleased, keyPressed и keyReieased. Если апплет реализует несколько интерфейсов, и из каждого интерфейса использует только по одному методу, то он все равно должен реализовать оставшиеся методы как "заглушки". Избежать этого можно, только отказавшись от реализации интерфейсов. Но как тогда обрабатывать события? В этом случае можно использовать возможности, добавленные в версию Java 1.1.

В Java 1.0 не разрешалось определять новые классы внутри других классов. Новый класс мог быть определен только на верхнем уровне — как член пакета. Расширения языка, добавленные в Java 1.1, позволяют определять новые классы внутри других классов и даже внутри блоков, заключенных в фигурные скобки {}. Такие классы называют внутренними классами. Используя внутренние классы, в предыдущем примере можно отказаться от интерфейсов KeyListener, MouseListener и записать текст более компактно:

Пример 11.10. Текст апплета HelloWord5a.java

import java.awt.event.*;

import java.applet.*;

import java.awt.*;

public class HelloWorld5a extends Applet {

TextArea text_area;

int start = 0;

int stop = 0;

int click = 0;

int keytyped = 0;

public void init() {

this.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent event) {

addItem((++click)+"-й "+"щелчок;");

}

});

this . addKeyListener (new KeyAdapter() {

public void keyTyped(KeyEvent event) {

addItem((++keytyped)+"-oe "+" нажатие клавиши; ");

}

});

text_area = new TextArea("Hello, World!",4,80);

text_area.setEditable(false);

setLayout(new java.awt.FlowLayout() );

add(text_area);

addItem("Инициализация;") ;

}

public void start() {

addItem("Запуск апплета "+(++start)+"-й раз; ") ;

} public void stop() {

addItem("Приостановка апплета "+(++stop)+"-й раз; ");

}

public void destroy() {

addItem("Заканчиваем работу");

}

void addItem(String newWord) {

text_area.append(newWord);

}

}

Разберем, как обрабатываются события в этом апплете. В методе init() ап-плет передает своему методу addMouseListener () аргумент, чтобы добавить его в список объектов-регистраторов событий от мыши. Аргументом является объект, создаваемый оператором new. Рассмотрим его подробно.

MouseAdapter — это абстрактный класс, имеющий следующее описание:

public abstract class MouseAdapter extends Object implements MouseListener {

void mouseClicked(MouseEvent event);

void mouseEntered(MouseEvent event);

void mouseExited(MouseEvent event);

void mousePressed(MouseEvent event);

void mouseReleased(MouseEvent event);

}

Все Методы класса MouseAdapter — это методы интерфейса MouseListener. Они также являются пустыми. Этот абстрактный класс является шаблоном, используя который можно создать новый класс, в котором переопределить пустые методы так, чтобы они обрабатывали события нужным образом Если затем создать объект этого нового класса, то его можно использовать в качестве регистратора событий мыши, передав в виде аргумента методу addMouseListener (). Оператор

new MouseAdapter() {

public void mouseClicked(MouseEvent event) {

addItem((++click)+"-й "+"щелчок;");

}

}

одновременно определяет новый внутренний безымянный класс и создает объект этого класса. Данный внутренний класс наследует классу MouseAdapter переопределяя только один, необходимый апплету, метод mouseClicked() Вновь созданный объект безымянного класса в качестве аргументе addMouseListener о добавляется в список регистраторов событий мыши.

Обработка событий клавиатуры организована аналогично.

Рисунки в апплетах

Наличие хорошо подобранных рисунков оживляет изображение HTML-страницы, делает ее более выразительной. Рисунок можно вставить непосредственно в HTML-документ при помощи тэга <img> или отобразить в составе апплета. Второй способ является более гибким и мощным, так как апплет кроме простого статического отображения рисунка обладает и многими другими возможностями, например, способностью динамически отображать и удалять рисунки, используя кнопки и другие элементы графического интерфейса, или создавать эффект анимации. Апплет располагает также методами для проигрывания звуковых файлов. Добавление в апплет изображений и звуков осуществляется однотипно. Рассмотрим простой пример апплета, отображающего статический рисунок.

Пример 11.11. Текст апплета HelloWorld6.java

import java.awt.*;

import Java.applet.*;

import java.net.*;

public class HelloWorld6 extends Applet {

Image globe;

public void init() {

URL CodeBase = getCodeBase();

globe = getImage(CodeBase, "globe.gif");

}

public void paint(Graphics g){

int width = globe.getWidth(this);

int height = globe.getHeight(this);

g.drawRect(52, 52, width+10, height+10);

g.drawlmage(globe, 57, 57, width, height, this);

}

}

В примере 11.11 предполагается, что файл globe.gif, содержащий изображение, находится в том же каталоге, что и файл, содержащий код апплета. При помощи метода getcodeBase о определяется URL-адрес этого каталога, после чего метод getImage() загружает из каталога указанный файл. Для отображения файла в окне браузера переопределяется метод paint (). Изображение апплета приведено на рис. 11.14.

Рис. 11.14. Пример апплета, содержащего рисунок

Архивы

В предыдущем примере для нормальной работы апплета требуются два файла: файл апплета HelloWorlde.class и файл рисунка globe.gif. Апплет может содержать несколько рисунков, несколько звуковых файлов и использовать внутренние классы, о которых говорилось выше. Для внутренних классов компилятор создает отдельные файлы. Таким образом, для работы апплета может потребоваться достаточно большое количество файлов. Браузер при загрузке апплета должен загрузить также и все необходимые файлы, и для каждого из них он открывает отдельное HTML-соединение с сервером. В результате увеличивается сетевой трафик и загруженность Web-сервера, который вместо одного запроса вынужден обрабатывать несколько. Выход заключается в том, чтобы поместить все необходимые файлы в один архивный файл. Передача этого файла браузеру произойдет в рамках одного HTML-соединения. Впервые передача апплетов в составе архивных файлов была поддержана браузером Netscape, который использовал для этой цели формат ZIP без компрессии. Для того чтобы сообщить браузеру о местонахождении архива, в состав тэга <APPLET>был добавлен новый параметр ARCHIVE:

<APPLET CODE = "myApplet.class" ARCHIVE = "myApplet.zip"> </APPLET>

Местоположение архива указывается относительно базового URL-адреса апплета, то есть относительно каталога, содержащего его код. Версия HTML 4.0 официально поддерживает параметр ARCHIVE.

Впоследствии фирмы Netscape и Sun совместно разработали на базе ZIP-формата новый формат JAR (Java ARchive), позволяющий передавать апплеты вместе с сопутствующими файлами в составе одного архивного файла в сжатом виде. Формат JAR поддерживается также последними версиями Internet Explorer (4.0+). Для создания JAR-архива в состав JDK входит утилита командной строки jar. Типичное обращение к ней имеет вид:

jar -cf myarchive.jar *.class image.gif sound.au

Значение опций:

— создать новый архив;

-f — указать имя архивного файла.

Java и JavaScript

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

Для создания динамических HTML-страниц используются различные подходы. С некоторыми из них мы уже познакомились. Язык JavaScript создан в фирме Netscape и встроен разработчиками в браузер Netscape для создания интерактивных сценариев. Технология Java развивается фирмой Sun. Каждая из этих технологий имеет свои преимущества и недостатки, но обе располагают большим арсеналом средств для решения своих задач. Некоторые задачи удобнее решать при помощи JavaScript, другие — используя Java. Браузер Netscape поддерживает обе технологии, но первоначально они существовали внутри браузера изолированно друг от друга, не имея возможности взаимодействовать. Возможность такого взаимодействия полезна, так как позволяет некоторые задачи решать проще, комбинируя подходящие приемы из обеих технологий. Начиная с версии 3.0 в браузеры Netscape добавлена новая технология LiveConnect, поддерживающая взаимодействие JavaScript и Java, а именно:

Для взаимодействия с Java технология LiveConnect добавляет в язык JavaScript новые типы данных.

Объект Javaciass не имеет собственных свойств. Все его свойства представляют поля и методы соответствующего класса Java, имеющие ключевое слово public в своем описании, и имеют те же самые имена. Например, объект java. lang. System представляет Java-класс java. lang. System.

Объект JavaObject представляет объект Java, то есть экземпляр Java-класса. Его свойства представляют открытые поля и методы экземпляра класса.

Объект JavaPackage может содержать классы, представленные объектами Javaciass. Все объекты JavaPackage содержатся в родительском объекте. На этот объект самого верхнего уровня иерархии ссылается свойство Packages объекта window. Схема именования свойств для JavaPackage отражает схему именования пакетов Java. Например, свойство java. lang. system представляет класс Java.lang.System.

Браузер Netscape, поддерживая технологию Java, содержит собственную коллекцию Java-классов. В эту коллекцию для взаимодействия с JavaScript добавлены новые классы, которые сгруппированы в самостоятельную иерархию пакетов, схема именования которой содержит имена, начинающиеся словом netscape. Классы, обеспечивающие взаимодействие Java с JavaScript, содержатся в пакете netscape.javascript. Основным среди них является класс netscape, javascript, jsobject, представляющий объект JavaScript.

Примечание

Браузер MS Internet Explorer также имеет свою коллекцию классов Java. Начиная с версии Internet Explorer 4.0 в нее включен пакет netscape, javascript.

Класс jsobject имеет следующий синтаксис:

public final class JSObject extends Object {

public static JSObject getwindow(Java.applet.Applet applet);

public Object getMember(String name);

public Object getSlot(int index);

public void setMember(String name, Object value);

public void setSlot(int index, Object value);

public void removeMember(String name);

public Object call(String methodName, Object args[]);

public Object eval(String s);

public String toString();

protected void finalize();

}

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

Необходимо выполнить несколько условий, чтобы предоставить апплетам Java доступ к свойствам и методам объектов JavaScript.

set CLASSPATH= .;с:\winnt\Java\classes.zip;

c:\Program Files\Netscape\Communicator\Program\Java\Classes\java40.jar;

В Windows это можно сделать также через Панель управления.

import netscape.javascript.*

JSObject applet_win = JSObject.getWindow(this);

Рассмотрим несколько примеров взаимодействия Java с JavaScript.

Пример 11.12. Вызов функции JavaScript из апплета

а) Текст апплета AppletcallsJScript. class

import java.applet.*;

import java.awt.*;

import java.awt.event.*;

import netscape.javascript.*;

public class AppletCallsJScript extends Applet implements ActionListener {

Button b;

TextField t;

public void init() {

t = new TextField(40);

add(t);

b = new Button("Выполнить");

add(b);

b.addActionListener(this);

}

public void actionPerformed(ActionEvent ae) {

if (ae.getSource() == b) {

JSObject mywin = JSObject.getWindow(this);

mywin.eval(t.getText()) ;

}

}

}

б) Текст HTML-документа

<HTML><HEAD></HEAD><BODY>

<h3>

Здесь размещен апплет, вызывающий выполнение функции JavaScript

</h3>

Введите функцию и нажмите кнопку<br> <APPLET CODE=AppletCallsJScript.class

MAYSCRIPT

WIDTH=300

HEIGHT=80>

< /APPLET>< /BODY>< /HTML>

В этом примере апплет, встроенный в HTML-документ, содержит текстовое поле и кнопку Выполнить. В текстовое поле можно ввести строку, которая содержит обращение к функции JavaScript. Нажатие кнопки обрабатывается методом actionPerformed (). Метод actionPerformed () создает объект, представляющий окно браузера, вызывает метод этого объекта eval () и передает ему для выполнения строку, введенную в текстовое поле. На рис. 11.15 показана работа апплета, который вызывает функцию alert ( 'HELLO, WORLD'), осуществляющую вывод сообщения в диалоговое окно.

Рис. 11.15. Вызов функции JavaScript из апплета Java

Пример 11.13. Динамическое создание HTML-документа

а) Текст апплета CreateHtmlForm. Java

import java.applet.*;

import java.awt.*;

import java.awt.event.*;

import netscape.javascript.*;

public class CreateHtmlForm extends Applet implements ActionListener {

Button aButton;

public void init(){

setLayout(new FlowLayout());

aButton = new Button("Создать страницу"); add(aButton);

aButton.addActionListener(this);

}

public void actionPerformed(ActionEvent ae) {

if (ae.getSource() == aButton){

String HTML = "<html>";

HTML +="<HEAD><title>Создание страницы</title></HEAD>";

HTML +="<body>";

HTML +="<h3>Эта страница создана из апплета Java</h3>";

HTML +="<form method='get' action='/cgi-bin/first.cgi'>";

HTML +="Ввод Строка<input type='text' name='textfield'><br><br>";

HTML +="Кнопка передачи <input type=submit

name=subname><br><br>";

HTML +="Кнопка сброса <input type=reset></p>";

HTML +="</form></BODY></html>";

JSObject win = JSObject.getWindow(this);

win.eval("createHTML(\"" + HTML +"\");");

}

}

}

б) Текст HTML-документа со встроенным сценарием JavaScript

<HTML><HEAD></HEAD><BODY>

<SCRIPT>

function createHTML(s) {

document.write(s);

document.close() ;

}

</SCRIPT>

<h3>

Здесь размещен апплет, создающий HTML-страницу

</h3>

Нажмите кнопку<br>

<APPLET CODE=CreateHtmlForm.class

MAYSCRIPT

WIDTH=120

HEIGHT=100>

</APPLET></BODY></HTML>

В примере 11.13 (б) HTML-документ содержит описание функции JavaScript с именем createHTML(). Эта функция вызывает метод write (s) объекта document для записи в объект document строки s. Объект document представляет HTML-документ, выведенный на экран в данный момент. Если выводимые строки являются строками HTML-кода, то таким образом создается новый HTML-документ. В HTML-документ встроен апплет, содержащий одну кнопку с надписью Создать страницу. При нажатии кнопки вызывается метод ActionPerfomed (), обрабатывающий это событие. Обработка нажатия кнопки заключается в том, что формируется новый текст HTML-документа, который передается JavaScript-функции createHTML () для записи в документ. Вид исходного документа в окне браузера (а) и результат выполнения апплета (б) представлены на рис. 11.16.

Рис 11.16. Динамическое создание HTML-страницы

Пример 11.14. Обмен данными между апплетом и полем HTML-формы

а) Текст апплета FormReadWrite.Java

import java.applet.*;

import java.awt.event.*;

import java.awt.*;

import netscape.javascript.*;

public class FormReadWrite extends Applet implements ActionListener {

Button button1,button2;

TextField text_field;

JSObject window;

public void init(){

setLayout(new FlowLayout());

text_field = new TextField(30);

button1 = new Button("Запись в форму");

button2 = new Button("Считывание из формы");

button1.addActionListener(this);

button2.addActionListener(this);

add(text_field);

add(button1) ;

add(button2) ;

}

public void actionPerformed(ActionEvent ae) {

if (ae.getSource() == button1) {

JSObject window = JSObject.getWindow(this);

window.eval("setHTMLText('"+text_field.getText()+"');");

}

if (ae.getSource() == button2) {

JSObject window = JSObject.getWindow(this);

text_field.setText((String)window.eval("getHTMLText();"));

}

}

}

б) Текст HTML-документа

<HTML><HEAD><SCRIPT>

function getHTMLText(){

return document.forms[0].elements[0].value;

}

function setHTMLText(s){

document.forms[0].elements[0].value = s;

}

</SCRIPT></HEAD><BODY>

Это текстовое поле формы<br>

<FORM>

<INPUT TYPE=text SIZE=30>

</FORM>

А это апплет с текстовым полем и двумя кнопками<br>

<APPLET ALIGN=TOP CODE=FormReadWrite.class MAYSCRIPT WIDTH=300 HEIGTH=60>

</APPLET>

</BODY></HMTL>

HTML-документ данного примера содержит форму, состоящую из одного текстового поля, и апплет, содержащий текстовое поле и две кнопки Запись в форму и Считывание из формы. В документе определены также две функции JavaScript: getHTMLText () и setHTMLText (). Функция getHTML () возвращает, а функция setHTMLText () устанавливает значение первого поля первой на данной странице формы. Так как на данной странице всего одна форма, которая содержит только одно текстовое поле, то операции чтения и записи применяются именно к нему. Функции JavaScript вызываются внутри апплета методом actionPerformed (), обрабатывающим нажатие кнопок. Нажатие кнопки Считывание из формы вызывает копирование данных из текстового поля формы в текстовое поле апплета, нажатие кнопки Запись в форму — наоборот, копирование данных из текстового поля апплета в текстовое поле формы. Окно браузера, отображающее документ, представлено на рис. 11.17.

Рис 11.17. Обмен данными между апплетом и полем HTML-формы

Заключение

Данный раздел является элементарным введением в апплеты, предназначенным для того, чтобы дать начальное представление об этой развивающейся области Web-программирования. Возможно он, как и другие разделы этой книги, вызовет интерес к продолжению изучения затронутой темы. Многие вопросы, связанные с созданием и применением апплетов, остались за пределами изложения. Для их изучения можно воспользоваться литературой, посвященной технологии Java и, в частности, апплетам, а также огромными ресурсами Интернета. Лучший способ изучения — создание собственных апплетов. В качестве образца можно использовать примеры, в большом количестве размещенные на различных сайтах. Отправной точкой поиска может послужить один из следующих адресов:

http://www.gamelan.com

http://www.javaworld.com

http://www.ibm.com/java/

http://www.javasoft.com

http://javaboutique.com


Реклама: