Московский государственный университет печати

Гасов В.М.
Цыганенко А.М.


         

Методы и средства подготовки электронных изданий

Учебное пособие


Гасов В.М.
Методы и средства подготовки электронных изданий
Начало
Печатный оригинал
Об электронном издании
Оглавление

Введение

1.

Глава 1. Основные компоненты электронных изданий

1.1.

Текстовая информация

1.2.

Полутоновые и цветные иллюстрации

1.3.

Анимационная графика

1.4.

Видеоинформация

1.5.

Аудиоинформация

2.

Глава 2. Технологии гипертекстовых изданий

2.1.

Функции гипертекстовых электронных изданий

2.2.

Принципы построения гипертекстовых изданий

2.3.

Математическая модель гипертекста

2.4.

Гипертекстовые Web-документы

2.5.

Подготовка публикаций в среде Adobe Acrobat

2.6.

Технология Help-файлов

2.7.

Средства доставки электронных изданий

2.8.

Классификация и общие принципы оформления электронных изданий

3.

Глава 3. Цифровое представление текстовой информации

3.1.

Стандарты кодирования символов ASCII, ANSI, КОИ-8 и UNICODE

3.2.

Формат PDF

3.3.

Формат разметки текста RTF

4.

Глава 4. Графические форматы

4.1.

Растровый формат GIF

4.2.

Формат графических файлов PNG

4.3.

Графический формат JPEG

4.4.

Формат TIFF

4.5.

Программные средства преобразования форматов

5.

Глава 5. Представление анимационной, видео- и звуковой информации

5.1.

Семейство форматов MPEG

5.1.1.

Компрессия видеоданных в MPEG

5.1.2.

Формат MPEG-1

5.1.3.

Формат MPEG-2

5.1.4.

Формат MPEG-4

5.1.5.

Формат MPEG-7

5.2.

Звуковые форматы

5.3.

Анимационные файловые форматы FLI, FLC, CEL

6.

Глава 6. Программы просмотра Web-публикаций

6.1.

Доступ к Web-странице в Internet

6.2.

Программа просмотра MS Internet Explorer

6.3.

Программа просмотра Netscape Navigator

7.

Глава 7. Языки разметки гипертекста и программирования скриптов

7.1.

Язык разметки гипертекста НТМL

7.2.

Расширенный язык разметки XML

7.3.

Язык Java

7.4.

Язык JavaScript

7.5.

Язык программирования сценариев PHP

7.6.

Язык Perl

7.7.

Язык моделирования виртуальной реальности VRML

8.

Глава 8. Программирование Web-страниц в языковой среде HTML

8.1.

Структура и форматирование HTML-документа

8.2.

Таблицы

8.3.

Изображения и навигационные карты

8.4.

Формы

8.5.

Фреймы

8.6.

Фреймы и таблицы

8.7.

Объекты

8.8.

Гиперссылки

8.9.

Таблицы стилей

9.

Глава 9. Автоматизация создания Web-публикаций. Программный пакет Macromedia Dreamweaver

9.1.

Назначение и функциональные возможности пакета

9.2.

Структурная схема программного пакета

9.3.

Интерфейс пользователя и принципы его организации

9.4.

Некоторые типовые процедуры пакета Dreamweaver

9.4.1.

Работа с текстом

9.4.2.

Вставка изображений

9.4.3.

Создание карты изображения

9.4.4.

Работа с таблицами

9.4.5.

Создание форм

9.4.6.

Работа с фреймами

9.4.7.

Работа со слоями

9.5.

Использование интерактивных возможностей и анимации

9.6.

Создание Web-сайта

10.

Глава 10. Программный пакет MS FrontPage

10.1.

Функциональные возможности программного пакета

10.2.

Структурная схема пакета

10.3.

Пользовательский интерфейс FrontPage

10.4.

Типовые процедуры работы с пакетом

10.5.

Пример создания Web-страницы

11.

Глава 11. Создание мультимедийных изданий. Программный пакет Macromedia Director

11.1.

Функциональные возможности программной среды

11.2.

Интерфейс пользователя

11.3.

Работа с мультимедийными элементами

11.3.1.

Элементы труппы

11.3.2.

Спрайты

11.3.3.

Изображения

11.3.4.

Текст

11.3.5.

Анимация

11.3.6.

Аудиоинформация

11.3.7.

Создание проекторов

11.3.8.

Цифровая видеоинформация

11.4.

Пример мультимедийного гиперграфического издания

Заключение

Библиографический список

Указатели
695   предметный указатель
434   указатель иллюстраций
45   указатель компаний
Рис. 07.01. Структура элемента XML Рис. 07.02. Структура процесса преобразования XML-документа Рис. 07.03. Структурная схема исполнения скриптов JavaScript Рис. 07.04. Пример визуализации простой программы в окне браузера Рис. 07.05. Пример заполняемой формы Рис. 07.06. Результат выполнения программы Рис. 07.07. Второй вариант окна приглашения Рис. 07.08. Страница заказа журнала

Основой современных технологий, используемых в InternetInternet, являются языки разметки Гипертекстгипертекста и написания сценариев, апплетов и скриптов публикаций WWW (World Wide Web). Сегодня разработано достаточно много различных программных языков, либо специально ориентированных на использование в Web, либо включающих функции, предназначенные для Internet.

В данной главе рассматриваются наиболее распространенные языки разметки Web-страниц - HTML, XML, языки написания скриптов HTML - JavaJava, JavaScriptJavaScript, PHP, Perl. Сюда же включен язык моделирования Виртуальная реальностьвиртуальной реальности VRML, использующийся для создания трехмерных графических сцен и сценариев.

В 1986 г. Международная организация по стандартизации (ISO) приняла первый стандарт ISO-8879, озаглавленный «Standard Generalized Markup Language (SGML)». Этот стандарт был посвящен описанию языка SGMLSGML - обобщенного метаязыка, позволяющего строить системы логической и структурной разметки любых разновидностей текстов. Слово структурная означает, что управляющие коды, вносимые в текст при такой разметке, не несут никакой информации о внешнем виде документа, а лишь указывают границы и соподчинение его составных частей, т.е. задают его логическую структуру.

Он был разработан для стандартизации обмена данными между разнородными программами и платформами. Язык SGML являлся не только мощным, но и очень сложным средством. Кроме того, SGML-документ было трудно интерпретировать без определений языка разметки, который хранится в определении типа документа DTD (document type definition). DTD необходимо было посылать вместе с SGML-документом или включать в документ, для того чтобы можно было распознать теги, созданные пользователем. Под тегами понимались специальные управляющие коды, записываемые в виде текста, ограниченного угловыми скобками

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

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

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

Таким образом, в этом языке нашли отражение новая идеология, новые принципы построения электронных публикаций. Несомненно, идеология SGML оказала влияние на многие компьютерные разработки. Однако язык SGML не получил мас-штабного распространения до тех пор, пока он не был выбран в качестве основы для нового языка разметки гипертекстовых документов. Этот язык (самое известное из приложений SGML) был назван HTMLHTML ( Hyper Text Markup Language, «язык разметки гипертекста»). Термин «разметка» применительно к документу означает обычно все, что не относится к его информационному наполнению.

По сути, язык HTML - это набор предписаний SGML, сформулированных в виде DTD. В случае языка HTML DTD хранится в браузере и этот DTD во много раз меньше, чем DTD SGML. Для передачи информации по Internet HTML использует протокол передачи гипертекстов (Hypertext Transfer Protocol).

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

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

Чтобы разрешить это противоречие, не нарушая основные концепции разметки гипертекста, авторы версии 3.0 ввели новое средство: иерархические стилевые спецификации (Cascading Style Sheets - CSS). Система CSS формально независима от HTML, имеет совершенно иной синтаксис, не наследует никаких идеологических ограничений и позволяет уже совершенно в иных терминах задавать параметры визуального представления для любого тега HTML. С помощью CSS автор может указать, каким шрифтом, какого кегля набирать заголовки такого-то уровня. Причем это было достигнуто не введением новых тегов, а разработкой механизма, позволяющего влиять на интерпретацию уже существующих тегов логической разметки, с учетом контекста его употребления. Браузеры с текстовым интерфейсом или синтезаторы речи могут проигнорировать эту дополнительную информацию и использовать для оформления свои обычные средства.

В последующих версиях (3.2 и 4.0) разработчики попыталась объединить большинство нововведений языка, появившихся после выхода версии 3.0, с учетом современных концепций развития компьютерных технологий, в частности Мультимедиамультимедиа.

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

В 1996 г. члены рабочей группы Консорциума World Wide Web (W3C, http://www.w3.org) вернулись к рассмотрению стандартного обобщенного языка разметки (SGML), упрощенным потомком которого является HTMLHTML.

Упростив SGML для использования в Web, группа предложила расширяемый язык разметки XMLXML (Extensible Markup Language - рекомендация W3C по статусу на февраль 1998 г.). XML представляет собой подмножество SGML, причем любой действительный документ XML является действительным документом SGML. Как и SGML, XML - это метаязык, определяющий другие языки разметки для специфических целей. Например, язык синхронизированной интеграции мультимедиа (Synchronized Multimedia Integration Language - SMIL) базируется на XML.

XML используется для разметки стандартных документов во многом так же, как HTML. Однако XML ориентирован на работу со структурированными данными, такими, как результаты за-проса, метаинформация о Web-узле или элементы и тип схемы.

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

Чтобы сделать Web-страницу интерактивной, необходим язык, выполняемый в контексте браузера. В качестве таких языков выступают JavaJava, JavaScriptJavaScript, PHPPHP, PerlPerl и др.

Эти языки используются не только для создания интерактивных Web-страниц, но и предоставляют пользователю средства для управления Браузербраузером. Созданные, например, на JavaScriptJavaScript программы не могут выполняться самостоятельно. Они работают только в контексте браузера, поддерживающего выполнение скриптовых программ. К таким браузерам относятся Microsoft Internet ExplorerMicrosoft Internet Explorer и Netscape NavigatorNetscape Navigator. Создаваемые программы, называемые сценариями или скриптами, включаются в состав Web-страниц и распознаются и обрабатываются браузером отдельно от остального HTML-кода.

Обычно скриптовые языки используются для:

  • отображения диалоговых панелей и сообщений в статусной строке браузера;

  • создания динамического содержимого страницы во время ее загрузки или уже после того, как она полностью загружена;

  • изменения содержимого страницы, атрибутов графического изображения, содержимого других HTML-элементов и отклика на события;

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

  • навигации по другим страницам;

  • управления встроенными в Web-страницу объектами типа Java-апплетов и элементов ActiveX;

  • обеспечения связи Web-страницы с базами данных.

Язык JavaJava произошел от языка программирования Oak, ориентированного на работу в Internet. В дальнейшем он был переименован в Java.

Синтаксис языка Java близок к синтаксису языка C++. Унаследовав самое лучшее от языка программирования C++, язык Java при этом избавился от некоторых его недостатков, в результате чего на нем стало проще программировать.

Основное достоинство Java заключается в том, что на этом языке можно создавать приложения, способные работать на различных платформах. К сети Internet подключены компьютеры самых разных типов (Pentium PC, Macintosh, рабочие станции Sun и т.д.), работающие с различными операционными системами (UNIX, Мас-ОС, WindowsWindows). Между тем, создавая Web-сервер в сети Internet, разработчик стремится к тому, чтобы его Web-страницей пользовалось как можно большее число людей.

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

С помощью апплетов можно сделать страницы сервера Web динамичными и интерактивными. Апплеты позволяют выполнять сложную локальную обработку данных, полученных от Web-сервера или введенных пользователем с клавиатуры.

JavaScriptJavaScript - это развивающийся язык описания сценариев, с помощью которого можно расширять возможности HTML-страниц в системе World Wide Web. Он разрабатывался корпорацией Netscape Communications для использования в Web-браузере Netscape Navigator (JavaScript для клиента) и Web-серверных продуктах (JavaScript для сервера), созданных этой корпорацией.

В отличие от Java-апплетов, загружаемых отдельно от HTML-документа, в котором они используются, программы, написанные на языке JavaScript, располагаются непосредственно в HTML-документах. Для этого предназначен специальный тег <SCRIPT> и парный ему </SCRIPT>. JavaScript - простой интерпретируемый язык программирования.

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

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

Этот язык позволяет значительно усовершенствовать HTML-программы.

PHPPHP - язык написания сценариев, внедряемых в HTML-документ. Многое из синтаксиса данного языка заимствовано из C, Java и Perl, с добавлением специфичных для PHP возможностей. Задача языка состоит в том, чтобы предоставить возможность Web-разработчикам создавать динамично изменяемые HTML-страницы.

Отличительной особенностью языка PHP является интеграция Web-страниц с базами данных. На сегодняшний момент поддерживается достаточно широкий перечень баз данных в режиме работы в собственной системе команд и через ODBC: Oracle, Adabas D, Sybase, FilePro, mSQL, Velocis, MySQL, Informix, Solid, dBase, ODBC, Unix dbm, PostgreSQL.

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

Cинтаксис выражений Perl близок к синтаксису языка С. Perl не ставит ограничений на объем обрабатываемых данных, и если хватает ресурсов, то весь файл обрабатывается как одна строка. Рекурсия может быть произвольной глубины. Хотя Perl приспособлен для обработки текстовых файлов, он может обрабатывать также двоичные данные и создавать *.dbm файлы, подобные ассоциативным массивам. Perl позволяет использовать регулярные выражения, создавать объекты, вставлять в программу на языках С или C++ куски кода на Perl, а также обеспечивает доступ к базам данных, в том числе Oracle.

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

Говоря о перспективах развития World Wide Web, необходимо отметить стремление использовать технологии Виртуальная реальностьвиртуальной реальности на Web-серверах. VRML (Virtual Reality Markup Language) - это один из воплощенных вариантов виртуальной реальности и технологий трехмерного моделирования. Впоследствии слово Markup было заменено словом Modeling - для отражения графической природы языка.

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

Консорциумом World Wide Web Organization (W3O) был предложен стандарт VRMLVRML, который называют также языком моделирования виртуальной реальности.

В октябре 1994 г. был определен проект спецификации VRML 1.0 и к маю 1995 г. завершилась разработка третьей и окончательной редакции спецификации VRML 1.0.

В качестве базы языка VRML был выбран урезанный формат текстового файла SGI Open Inventor, дополненный сетевыми возможностями. Формат Open Inventor позволял описать трехмерную сцену с полигональными объектами, источниками света и текстурами.

Хотя разработчики языка VRML стремились добиться его независимости от HTML, для передачи файлов по Internet в нем предусмотрены те же самые протоколы. Поэтому концепции Internet и Web применимы и к VRML. Просмотр VRML-документов возможен с помощью VRML-или HTML-браузеров с дополнительным VRML-модулем. Унифицированный указатель ресурсов URL для VRML-документа выглядит так же, как указатель для HTML-документа, за исключением расширения. Для HTML-документа используются расширения htm или html, а для VRML-документа - wrl, wrz или flr. Эти расширения применяются для обозначения VRML-документов, называемых файлами «миров» (world).

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

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

Электронные версии печатных изданий на базе World Wide WebWWW подготавливаются, хранятся и используются в среде World Wide Web. WEB-публикации представляют собой многосложные гипертекстовые структуры, для создания которых был разработан специальный язык, получивший название «язык разметки гипертекста» (НТМL).

Язык HTMLHTML приобрел популярность в середине 90-х годов благодаря экспоненциальному росту числа пользователей сети Internet. К этому времени возникла необходимость стандартизации языка. Работу по созданию спецификации HTML взяла на себя организация World Wide Web Consortium (сокращенно - W3C). В ее задачу входило составление спецификации, отражающей современный уровень развития языка с учетом разнообразных предложений разработчиков браузеров.

Схема утверждения спецификации состоит в следующем. Консорциум W3C готовит проект спецификации, после обсуждения которого выпускает так называемый черновой, рабочий (draft) вариант спецификации и предлагает его к обсуждению на определенный период. После обсуждения рабочий вариант спецификации может стать рекомендацией, т.е. официально признанным вариантом спецификации HTML.

Июль 1997 г. ознаменовался выходом предлагаемой спецификации HTML 4.0, которая в декабре 1997 г. стала официальной рекомендацией. На сегодняшний день это последняя из принятых спецификаций.

Язык разметки Гипертекстгипертекста (НТМL) изначально был ориентирован на создание простых текстовых страниц для их последующей передачи адресату в системе электронной почты или других сервисах вычислительных сетей.

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

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

Используемые коды языка HTML совместимы с современными браузерами.

Язык HTML применяет каскадные таблицы стилей (cascading style sheets - CSS1). Эти таблицы стилей дают авторам Web возможность отделить информацию о компоновке и визуальной структуре страницы от ее содержимого, делая большинство браузеров способными визуализировать содержательный материал Web-страницы.

Остановимся на некоторых характерных особенностях языка разметки гипертекста HTML.

Спецификация HTMLHTML определяет набор символов для документов HTML как набор однобайтовых символов ISO 8859/1 (латинский алфавит - Latin 1). Это набор из 256 символов, из которых первые 128 идентичны символам ASCII (ISO-646). Они должны быть совместимым с ISO 10646 и Unicode.

В практической же работе из-за ограниченного набора символов клавиатуры и в целях обеспечения переносимости на другие аппаратные платформы можно использовать только набор символов ISO Latin 1. Поддержка ISO Latin 1 должна существовать во всех браузерах, однако иногда с этим возникают проблемы. Можно придерживаться набора символов ASCII, которые являются подмножеством ISO Latin 1, в особенности если нет необходимости в написании символов с диакритическим знаком или символов, не входящих в английский алфавит (a - z).

Если клавиатура или редактор Web-страниц не позволяет вводить некоторые символы ISO Latin 1, можно использовать символьные escape-последовательности. Они также применяются для добавления в подготавливаемый Гипертекстгипертекст элементов шрифтового и стилевого оформления, для задания гипертекстовых ссылок и т.д. В принятой в HTML терминологии эти последовательности называют «символьными объектами».

Escape последовательности или, точнее, символьные объекты, являются методом представления специальных символов. Например, escape-последовательность lt; обозначает символ «меньше чем» (<).

Некоторые символы, такие, как <, используются в HTML в специальном значении, поэтому должен существовать способ их выражения как символьных данных внутри самого документа или в URL-адресе. Принято использовать нотации (соответствия), приведенные в табл. 7.1.

Таблица 7.1

Escape-последовательность Форма визуализации
&lt <
&gt >
&amp &
&quot

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

Заметим, что «точка с запятой» является частью escape-последовательности, но в принципе она может быть опущена. Однако не все браузеры обработают такой код HTML. В escape-последовательности важен вариант написания символов, т. е. различаются прописные и строчные буквы.

Может использоваться кодирование цифровыми escape-последовательностями (ISO 8859), как показано в табл. 7.2.

Таблица 7.2

Escape-последовательность    Форма визуализации
&#60 <
&#62 >
&#38 &
&#34 “.

Теги HTMLТеги HTML. Команды форматирования языка HTML называют управляющими кодами (tag). Они представляют собой зарезервированные последовательности символов, начиная с символа < (знак меньше) и заканчивая символом > (знак больше).

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

Теги могут иметь имена, например TITLE или PRE, и необязательные атрибуты. Тег может быть без атрибутов или сопровождаться одним или несколькими атрибутами, например: ALIGN=CENTER.

Элементы HTML. Большинство (но не все теги HTML) спарены так, что за открывающим тегом следует соответствующий закрывающий тег, а между ними содержится текст или другие теги, например:

<H1> Заголовок</H1>

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

Aтрибуты. Для каждого тега определяется множество возможных атрибутов. Большинство тегов допускает один или несколько атрибутов, однако атрибутов может и не быть. Спецификация атрибута состоит из расположенных в следующем порядке:

  • имени атрибута, например WIDTH;

  • знака равенства (=);

  • значения атрибута, которое задается строкой символов, например, "80".

  • Имя представляет собой последовательность символов, содержащую только

    символы английского алфавита (A - Z, a - z);

    цифры (0 - 9);

    промежутки времени;

    дефисы (-).

Строка символов, которая используется для имени (NAME), иногда может содержать и другие символы. Тогда она должна быть взята в кавычки.

Таким образом, WIDTH=80 и ALIGN=CENTER - разрешенное сокращение для WIDTH="80" и ALIGN="CENTER". Существуют браузеры, которые допускают отсутствие кавычек или наличие элементов с открывающими кавычками без закрывающих. Однако такой подход применять нецелесообразно.

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

Если значение атрибута такое же, как его имя, может быть использован минимальный синтаксис атрибута. То есть <UL COMPACT="COMPACT"> можно сократить до <UL COMPACT>. Некоторые агенты пользователей (программы просмотра пользователя, Браузербраузеры) даже требуют минимизации для некоторых атрибутов (COMPACT, ISMAP, CHECKED, NOWRAP, NOSHADE, NOHREF). Так что используется минимизированный синтаксис там, где это возможно.

Значения атрибутов должны быть отделены пробелами или незаполненными строками.

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

Теги могут записываться с параметрами (атрибутами). Наборы допустимых параметров индивидуальны для каждого тега. Общие правила записи тегов заключаются в следующем. После имени тега могут следовать параметры, которые отделяются друг от друга пробелами. Порядок следования параметров тега произволен. Многие параметры требуют указания их значений, однако некоторые параметры не имеют значений или могут записываться без них, принимая значения по умолчанию. Если параметр требует значения, то оно указывается после названия параметра через знак равенства. Значение параметра может записываться в кавычках и без них. Кавычки ставятся всегда, если в значении параметра имеются пробелы. Внутри значения параметра, заключенного в двойные кавычки, можно ставить символы одинарных кавычек, и наоборот. В значениях параметров (в отличие от названий тегов и самих параметров) иногда важен регистр записи. Пример записи тега с параметрами:

<TABLE BORDER ALIGN="left">

Здесь для тега <TABLE> задано два параметра. Первый параметр BORDER указан без значения, второй параметр ALIGN имеет значение left.

Case-чувствительность определяет правильность использования прописных и строчных символов. В частности, при написании имен тегов и атрибутов, большинства значений атрибутов HTMLHTML является case-нечувствительным языком. Например, можно записать тег TITLE, Title, title или tItLE. Но существуют и case-чувствительные конструкции языка, например, escape-последовательности.

При анализе состава и структуры команд (тегов) данного языка их обычно делят на группы. Рассмотрим некоторые из таких групп.

Команды структуры определяют документ HTML в целом и указывают начала и концы его отдельных частей. Эти теги иногда называют блоковыми элементами, так как они включают элементы, которые специфицируют структуру документа, например, разделение на части и параграфы (абзацы). К данной категории команд (управляющих кодов) можно отнести < HTML>, <HEAD> и <BODY>.Они содержат основную информацию по идентификации и организации гипертекстового документа и используются программами просмотра WWW. Управляющие коды < HTML> и </HTML> размещаются в начале и конце гипертекста и служат его идентификаторами. Между кодами <HEAD> и </HEAD> помещается раздел заголовка публикации. Между кодами <HEAD> и </HEAD> могут вставляться некоторые другие коды, например <TITLE> и </TITLE>. Текст документа, обрамленный указанными кодами (<TITLE> и </TITLE>), выводится программой просмотра в виде заголовка соответствующего окна. Управляющие коды <BODY> и </BODY> определяют часть документа, представляемую пользователю в клиентской области окна программ просмотра Web. Внутри пространства между <BODY> и </BODY> размещается собственно текстовой материал, включая абзацы, заголовки и списки, с перемежающимися управляющими кодами для гипертекстовых ссылок, кодов форматирования символов, вставляемой графики,таблиц и т.д. Как следует из вышесказанного, блоковые элементы могут содержать как текстовые, так и другие элементы, например, блоки могут быть вложенными.

Общая структура гипертекстового документа HTML имеет следующий вид:

<HTML>

<HEAD>

<TITLE>

Заголовок окна

</TITLE>

</HEAD>

<BODY>

Текст документа

</BODY>

</HTML>

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

Текстовыми элементами могут быть:

  • простой текст, возможно содержащий escape-последовательности (например, amp;);

  • выражения разметки;

  • разметка шрифта;

  • специальные элементы;

  • элементы формы.

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

Необходимо отметить, что текстовые элементы могут быть вложенными. Но текстовые элементы не могут включать блоковые элементы.

К командам форматирования текстового потока относят код конца абзаца <P>, код принудительного перевода строки <BR> и место вставки горизонтальной линии <HR>. Первая команда соответствует непечатаемому символу окончания абзаца в текстовых редакторах типа MS Word и других (при наборе текста соответствует нажатию клавиши Enter). Управляющий код <BR> соответствует нажатию комбинации клавиш Shift + Enter и используется, например, для отделения фамилии от адреса, с тем чтобы они не попали при просмотре в одну строку. Управляющий код <HR> используется для создания горизонтальных линий, применяемых в качестве разделителей.

Наряду с названными командами могут использоваться:

    <PRE> и </PRE> : коды выделения предварительно отформатированного текста. Обычно текстовой блок, помещенный между этими кодами, выводится при просмотре равноширинными шрифтами. Эти же коды используются в ряде версий HTML для передачи табличных данных.

    <LISTING>, </LISTING>: коды выделения текста программы или листинга, сгенерированного транслятором языка программирования.

    <BLOCKQUOTE>, </BLOCKQUOTE>: коды, используемые для ограничивания цитат или извлечений из других источников. Цитируемый текст выделяется с обеих сторон отступами, он может быть набран другим текстом и т.д.

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

В HTML предусмотрено шесть уровней заголовков, каждому из которых соответствует определенный код:<H1>, <H2>, <H3>, <H4>, <H5>, <H6>.

Обычно используются парные коды, например:

    <H1> Заголовок </H1>.

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

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

    <B> Полужирный шрифт

    <I> Курсив

    <U> Подчеркивание

    <ТТ> "Телетайпный текст (равноширинный шрифт "Курьер")

Пример: "В HTML может использоваться <B> Полужирный шрифт </B>, <I> Курсив </I> или <U> Подчеркивание </U>".

В программе просмотра получим:

В HTML может использоваться Полужирный шрифт, Курсив или <__>Подчеркивание<__>.

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

    <ADDRESS> - информация для контекста с автором документа HTML.

    <CITT> - цитата.

    <DFN> - используется для директив HTML.

    <EM> - выделение (например, курсивом).

    <KBD> - клавиатурный символ.

    <SAMP> - пример вывода команды.

    <STRONG> - усиленное выделение (полужирным шрифтом).

    <VAR> - переменная в программе и т.д.

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

Команды форматирования списков. Язык HTMLHTML предусматривает возможность создания трех видов списков: упорядоченные списки (<OL>), неупорядоченные списки (<UL>) и списки определений (<DL>).

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

Неупорядоченные списки объединяют перечень позиций списка, в которых порядок несуществен.

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

Отдельные элементы упорядоченных и неупорядоченных списков помечаются одиночным кодом <LI>, а элементы списков определений помечаются кодами <DT> - для термина и <DD> - для определения.

Пример записи в HTML:

<UL>

<LI> Один элемент списка

<LI> Еще один элемент списка

<LI> Еще один элемент списка

</UL>

Вид экранной визуализации в программе просмотра:

    Один элемент списка

    Еще один элемент списка

    Еще один элемент списка

Команды вставки графики, форм, таблиц и фреймов. HTML в определенной степени учитывает ориентацию WWW на графику. Поэтому в составе его команд имеются и управляющие коды вставки в документ графических элементов. Эта операция осуществляется с помощью управляющего кода <IMG>. Он содержит унифицированный адрес ресурса URL, определяющий положение графического объекта в отдельном файле, и задает определенные атрибуты его вывода на экран. Фактически графика, как и в программах верстки, не входит непосредственно в документ, а используется ссылка на соответствующий графический файл, который вызывается по ссылке. Адрес размещения графики может быть абсолютным или относительным. Это позволяет размещать рисунок как на той же машине, где размещен документ, так и на любом другом адресуемом сервере. В качестве примера использования управляющего кода приведем следующую запись:

<IMG> SRC="URL" [ALTON=TOP|MIDLE|BOTTOM] [ALT="text"]

В режиме просмотра программа отдельными транзакциями извлекает все графические объекты, на которые имеются ссылки в документе, а затем объединяет в выводимом документе в соответствии с дополнительным параметром выравнивания (Bottom). Необязательный параметр ALT задает текст, который будет выведен вместо рисунка программами просмотра, работающими только в текстовом режиме (Lynx). Большинство программ просмотра способны работать с Jpeg-файлами, форматами GIF и некоторыми другими.

Для создания форм могут использоваться такие теги, как:

    <FORM ACTION= "URL"></FORM> - определение формы;

    <INPUT NAME="***"> - имя поля;

    <INPUT SIZE=?> - размер поля;

    <SELECT></SELECT> - список вариантов;

    <OPTION></OPTION> - опции и т.д.

К тегам этой группы можно отнести управляющие команды создания таблиц (тег <TABLE></TABLE> - определяет таблицу и др.) и теги формирования фреймов (тег <FRAMESET></FRAMESET> - используется вместо тега <BODY> в документах с фреймами и т.п.).

Более подробно вопрос использования тегов HTML будет обсуждаться в гл. 8.

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

<A HREF="URL "> Фрагмент текста </A>

где «Фрагмент текста» - это часть документа, видимая пользователем в окне просмотра браузера, а URL - «место назначения» гипертекстовой связи. Адрес этого «места» может быть абсолютным - с заданием полного имени сервера и именем файла документа назначения; относительным, при котором предполагается, что имя сервера и начальный каталог те же, что и у документа, содержащего гипертекстовую ссылку.

В HTMLHTML реализована поддержка механизма специальных гипертекстовых ссылок, которые обеспечивают связь данной публикации с другими публикациями. Гипертекстовая ссылкаГипертекстовая ссылка - это адрес другого HTML-документа или информационного ресурса Internet, который тематически, логически или каким-либо другим способом связан с публикацией, в которой эта ссылка определена. Ссылка состоит из двух частей. Первая их них - это то, что визуализируется в поле WEB-страницы. Она называется «указатель ссылки» (anchor). Вторая часть, дающая инструкцию браузеру, называется адресной частью ссылки (Universe Resource Locator или URL-адрес).

Типичным примером использования этой записи можно считать следующую:

Этот текст содержит

<A HREF = "http://polyn.net.kiae.su/ altai/index.html">
гипертекстовую ссылку </A>.

Здесь тег - контейнер <A> (anchor), использует атрибут HREF, обозначающий гипертекстовую ссылку, для записи этой ссылки в форме URL. Указатель может быть как относительным, так и абсолютным. Данная ссылка указывает на документ с именем "index.html" в каталоге "altai" на сервере "polyn.net.kiae.su", доступ к которому осуществляется по протоколу "http".

Возможно использование локального адреса в том случае, если файл находится на ПЭВМ, где запущена программа просмотра WWW, а не на сервере WWW. Между кодами <A> и </A> можно поместить текст любого объема, код <IMG> для вставки графики или сочетание того и другого.

Кроме ссылок на другие документы часто используются ссылки на разные части текущего документа. Например, большой документ читается лучше, если он имеет оглавление со ссылками на соответствующие разделы. Для построения внутренней ссылки сначала нужно создать указатель, определяющий место назначения. Например, сделать ссылку на текст определенной главы документа. Сначала размещается указатель и присваивается имя при помощи параметра name тега <a>. При этом параметр href не используется и браузер не выделяет содержимое тега <a>. Например:

<a name=chapter_5></a>

Теперь создается сама ссылка. Для этого в параметре href указывается имя ссылки с префиксом #, свидетельствующим о том, что это внутренняя ссылка.

<a href="#chapter_5">Глава 5</a>

Если пользователь щелкнет кнопкой мыши на словах «Глава 5», браузер выведет соответствующую часть документа в окно просмотра.

При использовании гипертекстовых связей программа просмотра извлекает документ, форматирует его и затем показывает начиная с верхней части окна просмотра. Однако код связи позволяет также немедленно "прокрутить" документ до метки в документе назначения. Код гипертекстовой связи такого рода имеет вид:

<A HREF="URL #метка"> Фрагмент текста </A>

Метка должна находиться в HTML-документе назначения:

<<A NAME="метка"> текст, видимый пользователю </A>

Гипертекстовые связи могут изменять положение просматриваемого документа на экране ПЭВМ:

<<A HREF="#метка"> Текст <A/>

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

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

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

Подобный подход к созданию HTML-документов с помощью специализированных редакторов с особенной очевидностью просматривается в современных программных разработках для WWW. При этом используется расширение функциональных возможностей стандартных текстовых редакторов (таких, как MS Word) в область создания HTML-файлов (с расширением *.HTM). Практикуется и модификация текстовых редакторов с помощью специальных утилит современных ОС (Windows 2000Windows 2000 и др.), встраивающих специальный модуль работы с гипертекстовыми документами.

Язык HTMLHTML был разработан специально для того, чтобы обеспечить быструю пересылку документов. Чтобы размер файлов оставался небольшим, весь текст в HTML-файлах хранится в обычном формате ASCII; все шрифты и команды форматирования воспроизводятся программой просмотра конечного пользователя, а не документом HTML. Более того, поэтапная загрузка предоставляет пользователю возможность читать текст во время пересылки изображений.

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

Одним из способов устранения этого ограничения может быть расширение функциональной базы формата HTML. В спецификации HTML предусмотрены таблицы, списки стилей, кадры, фреймы, формы и другие элементы, позволяющие изменять дизайн страницы. Известные фирмы Adobe SystemsAdobe Systems, AppleApple и NetscapeNetscape в своих программных изделиях предусмотрели использование шрифтов Type 1 и TrueType.

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

Поэтому в 1996 г. члены рабочей группы Консорциума World Wide Web (W3C, http://www.w3.org) вернулись к рассмотрению стандартного обобщенного языка разметки (Standard Generalized Markup Language - SGML), упрощенным вариантом которого является язык HTML. Как известно, SGML представляет собой метаязык - систему для описания других языков. При всех своих возможностях он слишком сложен для большинства браузеров Web: одна спецификация SGML занимает свыше 500 страниц.

Упростив SGML для использования с Web, группа предложила язык XML (рекомендация W3C в феврале 1998 г.). Язык XMLXML можно рассматривать как подмножество SGML, причем любой документ XML является действительным документом SGML. Как и SGML, XML - это метаязык, определяющий другие языки разметки для специфических целей. Например, язык синхронизированной интеграции мультимедиа (Synchronized Multimedia Integration Language - SMIL) базируется на XML.

XML используется для разметки стандартных документов во многом так же, как HTMLHTML. Однако XML ориентирован на работу со структурированными данными, такими, как результаты запроса, метаинформация об узле Web или элементы и типы схем документов.

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

Особенности XML. Характерными особенностями языка XML являются:

  • Разметка XML-файла позволяет описывать его содержание.

  • XML-документ способен нести информацию о включенном в него материале. Он содержит информацию только о структуре и смысле документа, оставляя форматирование элементов таблице стилей (Extensible Stylesheet Language - XSL).

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

  • Способность объединять несколько XML-документов в один большой документ.

  • Для XML не обязательно определение типа документа.

  • Теги XML можно применять для управления поиском информации, в том числе и в глобальных сетях.

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

  • XML может употребляться в качестве формата обмена для протоколов транзакций.

Рассмотрим более подробно структуру и элементы языка разметки XML.

Язык разметки XML снимает ограничения на используемый набор тегов. Автору публикации предоставляется возможность вводить любые имена, которые могут быть для него полезными. Эта возможность является ключевой для активного манипулирования данными. В качестве примера в табл. 7.3 приведен один и тот же список имен и адресов, написанных на языках HTML и XML.

Таблица 7.3

Фрагмент HTML (список имен и адресов)     Фрагмент XML (список имен и адресов)
<H1>Editor Contacts</H1>

<H2>Имя: Джонатан Эйнджел</H2>

<P>Должность: старший редактор</P>

<P>Издание: Network Magazine</P>

<P>Улица и дом: Гариссона, 600</P>

<P>Город: Сан-Франциско</P>

<P>Штат: Kалифорния</P><

P>Индекс: 94107</P>

<P>Электронная почта: jangel@mfi.com</P>

<?xml version=""1.0""?>

<editor_contacts>

<editor>

   <first_name>Джонатан</first_name>

   <last_name>Эйнджел</last_name>

   <title>старший редактор</title>

   <publication>Network Magazine</publication>

       <address>

       <street>Гариссона, 600</street>

       <city>Сан-Франциско</city>

       <state>Kалифорния</state>

       <zip>94107</zip>

       </address>

<e_mail>jangel@mfi.com</e_mail>

</editor>

</editor_contacts>

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

В XML теги не могут накладываться, как в HTML (что не поощряется, но допускается большинством программ просмотра HTML). Однако они могут быть вложены друг в друга. На самом деле, вложение даже поощряется как способ создания иерархии данных (подчиненные или равноправные отношения). Как видно из приведенной таблицы, такие элементы, как <first_name> и <e_mail>, содержат данные, в то время как другие (<address>) присутствуют только в целях структурирования.

Теги начала и конца элемента являются основными используемыми в XML разметками, но не единственными. Например, элементам могут быть присвоены определенные атрибуты. Эта возможность аналогична имеющейся в HTMLHTML, где, например, элементу <table> может быть присвоен атрибут align="center". В XML элемент может иметь один или более связанных с ним атрибутов. Причем при составлении документа можно предложить их столько, сколько потребует логика представления публикации, например, <publication topic="networking" circulation="controlled">.

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

Типы документов. Для этих целей используются определения типов документов (Document Type Definition - DTD). Хранимые в начале файла XML или в виде файла *.DTD, эти определения описывают информационную структуру документа. DTD перечисляют возможные имена элементов, определяют имеющиеся атрибуты для каждого типа элементов и описывают сочетаемость одних элементов с другими.

Каждая строка в определении типа документа может содержать декларацию типа элемента, именовать элемент и определять тип данных, которые элемент может содержать. Она имеет следующий вид:

<ELEMENT имя_элемента

(тип_данных)>

Например, декларация <ELEMENT publication (#PCDATA)> определяет элемент с именем publication, содержащий символьные данные (т. е. текст). Декларация <ELEMENT special_report (article_1, article_2, article_3)> определяет элемент с именем special_report, содержащий подэлементы article_1, article_2 и article_3 в указанном порядке, например:

<special_report>

<article_1>XML:

время пришло</article_1>

<article_2>XML - язык

разметки</article_2>

<article_3>Управление сетями и

системами с помощью XML</article_3>

</special_report>

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

ATTLIST позволяет управлять атрибутами и многими другими способами: задавать значения по умолчанию, подавлять пробелы и т. д. DTD могут также содержать декларации ENTITY, где определяются ссылки на объекты, а также декларации NOTATION, указывающие, какие операции проводятся с двоичными файлами не в формате XML.

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

К документам XML могут быть применены термины «правильно составленный» (well-formed) и «действительный» (valid). Документ XML считается правильно составленным, если для каждого открывающего тега имеется соответствующий закрывающий тег, а накладывающиеся теги отсутствуют. Документ является действительным, если он содержит DTD и соответствует его правилам.

Значительный потенциал XML в качестве промежуточного программного обеспечения подкрепляется объектной моделью документа (Document Object Model - DOM), первая версия которого была принята в качестве рекомендации W3C в октябре 1998 г. DOM возникла как спецификация для обеспечения переносимости сценариев JavaScript и программ на JavaJava между Web-браузерами и позднее эволюционировала в API для документов HTML и XML. Она определяет логическую структуру документов, способы доступа и манипулирования ими. Программисты могут создавать документы, управлять их структурой и добавлять, модифицировать или удалять элементы и содержимое.

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

Таким образом, для разметки XML-документа с помощью тегов необходимо установить правила, понятные для языка разметки, а именно: описать, что является разметкой; точно определить, что означает тот или иной элемент разметки; описать подробно каждый из элементов (элемент - теги в совокупности с их содержанием); порядок их следования; а также указать атрибуты, их характеризующие.

На рис. 7.1Рис. 07.01. Структура элемента XML приведена потенциальная структура элемента.

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

Известно несколько языков описания таблиц стилей:

  • Каскадные таблицы стилей CSS (Cascade Style Sheets). При наличии нескольких таблиц стилей из них обычно формируется каскад, т. е. иерархия со свойствами, взятыми из всех таблиц.

  • Расширяемый язык таблиц стилей XSL (Extensible Style Sheets). Этот язык разрешает пользователю создавать свои собственные форматирующие теги и свойства.

  • Язык семантики и спецификаций стиля документа DSSSL (Document Semantic and Style Specification Language).

  • XS, известный как DSSSL-0.

Наибольший интерес представляют CSS и XSL. В табл. 7.4 приведены известные в литературе сравнительные характеристики указанных выше таблиц стилей.

Таблица 7.4

  CSS XSL
Может быть использован вместе с HTML Да Нет
Может быть использован вместе с XML Да Да
Является языком преобразования Нет Да
Синтаксис CSS XML

Пользующиеся популярностью в Web каскадные таблицы стилей CSS позволяют изменять форматирование известных тегов HTML и определять новые теги. В частности, таблицы стилей CSS используются для стандартизации представления типичных элементов, таких, как <H1>, и для введения новых, таких, как врезки. CSS могут служить и для форматирования документов XML.

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

Эти ограничения привели к созданию Extensible Stylesheet Language (XSL). XSL можно рассматривать как приложение XML со своей собственной семантикой (фиксированным набором элементов). Следовательно, оно может быть использовано для создания таблиц стилей (шаблонов документов), понятных любой программе просмотра XML.

Наиболее важная особенность XML и сопутствующей ему технологии расширяемого языка таблицы стилей (XSL) состоит в отделении форматирования от информационного наполнения. Этот подход подобен работе с таблицами стилей в MS Word.

Таблицы стилей XSL описывают, как должны преобразовываться документы XML в другие форматы, такие, как HTML или RTF. Но таблицы стилей XML - это больше, чем преобразователи форматов; они также предоставляют механизм для манипулирования данными. Например, данные можно сортировать, проводить по ним поиск, удалять или добавлять прямо из окна браузера.

Рассмотрим пример простой таблицы стилей для языка XML:

<?xml version = "1.0" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<!-декларация, что документ является таблицей стилей и что он связан с xsl: namespace ->

<xsl:template match="/">

<!-Применить шаблон ко всему в исходном документе XML ->

<HTML>

<BODY>

<H1>Editor Contacts</H1>

<xsl:for-each select="editor_contacts/editor">

<H2>Name: <xsl:value-of select="first_name">

<xsl:value-of select="last_name"/></H2>

<P>Title: <xsl:value-of select="title"/></P>

<P>Publication: <xsl:value-of select="publication"/></P>

<P>Street Address: <xsl:value-of select="address/street"/></P>

<P>City: <xsl:value-of select="address/city"/></P>

<P>State: <xsl:value-of select="address/state"/></P>

<P>Zip: <xsl:value-of select="address/zip"/></P>

<P>E-Mail: <xsl:value-of select="e_mail"/></P>

</xsl:for-each>

</BODY>

</HTML>

</xsl:template>

</xsl:stylesheet>

При сохранении файла на жестком диске под именем EDITORS.XSL (или любым другим) этот шаблон будет применен к EDITORS.XML при добавлении в него следующей строки после первой:

<?xml-stylesheet

type="text/xsl" href=

"editors.xsl" ?>

В конечном итоге текст на экране браузера будет выглядеть точно так же, как представленный ранее фрагмент HTML. Однако XSL может действовать как функция текстового процессора merge-print. Определенный как неотъемлемая часть пространства имен XSL, элемент xsl:for-each сообщает процессору о том, что он должен циклически обрабатывать все узлы в исходном файле XML. Атрибут xsl:value-of вставляет значение узла XML в элемент HTML. Таким образом, если придется вернуться к EDITORS.XML и вставить десятки или сотни контактных адресов, то они без каких-либо изменений будут отображаться в таблице стилей. Благодаря тому, что информацию о форматировании требуется передать только один раз, XML и XSL экономят пропускную способность.

Таблицы стилей XSL имитируют функцию merge-print еще и в том, что они позволяют избирательно опускать поля данных при отображении. Кроме того, вывод может быть отсортирован по любому конкретному полю данных. Для сортировки базы данных контактных адресов по фамилии редактора в прямом алфавитном порядке элемент xsl:for-each нужно изменить следующим образом:

<xsl:for-each select=

"editor_contacts/editor"

order-by="+last_name">

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

Комментарии и инструкции по обработке. Другими видами разметки XML являются комментарии (они выделяются точно так же, как в HTML) и инструкции по обработке. Инструкциям по обработке предшествует знак вопроса. Они описывают, что именно программа разбора должна использовать для интерпретации конкретного документа или его раздела. Например, инструкция <?xml version = 1.0"?> сообщает программе просмотра XML, что обрабатываемый документ действительно составлен с помощью XML. С другой стороны, инструкция <?rtf \page?> служит для вызова программы просмотра RTF и вставки символа конца страницы.

Разделы символьных данных - это части документа, рассматриваемые исключительно как символьные данные, не подвергающиеся просмотру. Они выглядят следующим образом:

<[CDATA[

Этот текст, даже если он содержит элементы кода HTML, такие, как <B>жирный шрифт</B> или <H1>заголовок</H1>, не подвергается грамматическому анализу.

Расширяемый язык создания ссылок. Первоначально язык создания ссылок был известен как XLink, затем XML-Link, а текущим рабочим названием для языков создания ссылок, находящихся в процессе разработки, является термин расширяемый язык создания ссылок, XLL (Extensible Linking Language).

Используя XML, можно определять собственные ссылочные элементы; использовать любой элемент в качестве ссылочного; создавать двунаправленные ссылки с отношениями типа «один ко многим» и «многие к одному»; определять способ обхода (то, в каком порядке пользователь будет продвигаться по ссылкам); создавать базы ссылок для определения и управления ссылками вне документов, к которым они относятся.

Можно также группировать ссылки; делать ссылку, адресатом которой является та часть документа, откуда исходит эта ссылка.

Существует два основных типа ссылок, различаемых по способу хранения и вызову:

  • встроенные ссылки (inline links). Это ссылки, которые определяются в том же месте, где они инициируются ;

  • внешние ссылки (out-of-line links), которые хранятся во вспомогательном файле в базе данных ссылок;

  • X-Ссылки (XLinks) используются для организации ссылок из отдельно взятого XML-документа на другие XML-документы;

  • X-Указатели (Xpointers) служат для адресации внутренней структуры XML-документа, обеспечивают ссылки на элементы, строки символов и другие части XML-публикаций.

Организация ссылок не включена в спецификацию XML, напротив, существуют две отдельные спецификации создания ссылок в XML.

Документы XML могут содержать ссылки на другие объекты. Ссылки представляют собой строку, начинающуюся с амперсанта и заканчивающуюся точкой с запятой. Эти ссылки позволяют, в частности, вставить в документ специальные символы, включение которых могло бы нарушить визуализацию публикации в программе просмотра. Например, чтобы поместить в документ знак «меньше чем» (<) необходимо вставить ссылку <, а чтобы вставить сам амперсант - ссылку , и т. д. Это подобно приемам, используемым в HTMLHTML. Однако ссылки XML даются на определенные автором разделы текста в данном или в другом документе.

Например, ссылки на объекты позволяют применить объект-но-ориентированный подход при создании журнальной статьи:

<article>

introduction;

body;

sidebar;

conclusion;

resources;

</article>

Анализаторы. Работа по созданию XML-документа фактически разбивается на два этапа. Первый заключается в создании DTD, второй - в формировании собственно XML-документа. Таким образом, для работы над документом необходимо иметь два анализатора.

Специфика XML определяет два компонента, необходимых для практического использования XML: XML-процессор и XML-приложение.

Анализаторы (parsers) играют роль XML-процессора. Они за-гружают XML-файл и другие необходимые файлы, проверяют, является ли XML-документ правильным или состоятельным (в зависимости от типа анализатора).

Существуют два основных типа анализатора:

  1. Неверифицирующие анализаторы (non-validating parsers) - тестируют, является ли документ правильным, т.е. удовлетворяющим трем условиям:

      в документе может содержаться один или более элементов;

      документ должен включать один элемент с уникальным именем, никакая часть которого не содержится внутри никакого другого элемента - корневой элемент (root element);

      все элементы внутри корневого элемента должны быть вложены правильно (имеют размер 30-40 Кбайт).

  2. Верифицирующие анализаторы (validating parsers) - проверяют состоятельность документа, используя DTD. Они также строят структуру дерева документа, которая может быть передана приложению.

Просмотр XML-файла. Вплоть до четвертой версии основные производители браузеров (Microsoft, Netscape, Opera Software и др.) не обладали функциональной возможностью просмотра XML-документов (подобно просмотру HTML-публикации). Нельзя просто открыть XML-документ браузером и просмотреть его содержание. Поэтому в настоящее время XML-документ встраивается в HTML-публикацию.

Рассмотрим преобразование XML-документа в HTML-документ для просмотра в обычном браузере (рис. 7.2Рис. 07.02. Структура процесса преобразования XML-документа).

Различают статическое и динамическое преобразование.

Статическое преобразование осуществляется до того, как файл попадает на Web-сервер. Оно включает использование программы, которая соединяет XML-файл с таблицей стилей и создает HTML-файл, который в дальнейшем просматривается в браузере. Именно HTML-файл помещается на Web-сервер для обслуживания запросов. Примером такой программы является Cormorand XML Paser (http://webdev.wrox.co.uk/books/1525).

Однако статическое преобразование не позволяет использовать все возможности XML.

Динамическое преобразование XML-файлов позволяет предоставлять разным пользователям различные страницы. Существует несколько способов динамического преобразования, которые используют следующие программы для преобразования файлов с расширениями *.xml, *. css/xsl в HTML: MSXSL Command Line Utility; ActiveX Control; Java AppletJava Applet; программа JavaScriptJavaScript.

Язык JavaJava ориентирован на самые передовые технологии, связанные с сетями Internet. К сети InternetInternet подключены компьютеры самых разных типов. Создавая Web-сервер в сети Internet, разработчик стремится к тому, чтобы им могло пользоваться как можно большее число пользователей, работающих на различных аппаратных платформах (Pentium PC, Macintosh, рабочие станции Sun и т.д) и в различных операционных системах. Созданное на базе Java программное обеспечение отвечает таким требованиям.

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

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

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

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

Апплеты Java встраиваются в документы HTML, хранящиеся на Web-сервере. С помощью апплетов можно сделать страницы Web-сервера динамичными и интерактивными. Из соображений безопасности апплеты (в отличие от обычных приложений Java) не имеют доступа к файловой системе локального компьютера. Все данные для обработки они могут получить только от Web-сервера. Более сложную обработку данных можно выполнять, организовав взаимодействие между апплетами и расширениями Web-сервера: приложениями CGI и ISAPI.

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

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

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

Функциональные возможности языка Java

Кратко перечислим основные возможности языка JavaJava.

Компоненты в окне апплета. В окне апплета можно размещать следующие элементы управления Windows:

  • кнопки,

  • переключатели с независимой и зависимой фиксацией,

  • статические текстовые поля,

  • однострочные и многострочные поля редактирования текста,

  • списки,

  • полосы прокрутки.

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

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

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

Рисование в окне апплета. Апплет выполняет рисование в своем окне, используя методы класса Graphics, в котором полностью инкапсулированы особенности аппаратной платформы. Для окна апплета создается объект класса Graphics, ссылка на который передается методу Paint.

Растровые изображения Растровые изображения. Рисование простых и анимированных изображений является одним из самых распространенных применений апплетов. Библиотеки классов Java содержат простые в использовании средства, предназначенные для работы с растровыми изображениями форматов GIF и JPEG: за-грузки, масштабирования, создания на их базе анимационных изображений.

Анимация Анимация. Апплеты Java предоставляют пользователю возможность отображения небольших анимационных и видеороликов на страницах Web-сервера. Для этого необходимо подготовить и разместить в каталогах Web-сервера файлы отдельных кадров фильма в формате GIF или JPEG. Апплет Java загрузит эти изображения, после чего начнет их поочередное отображение в цикле. Этот цикл должен выполняться в отдельной задаче.

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

Звук. Звуковые возможности апплетов Java ограничиваются воспроизведением звуковых клипов, записанных только в файлах формата AU (фирма Sun). Однако в Internet существуют конверторы для данного формата (например, freeware программа GoldWave, доступная по адресу ftp.winsite.com).

Взаимодействие между апплетами. Апплеты, расположенные в одном и том же документе HTML, могут взаимодействовать между собой, используя ссылки на другие апплеты, которые можно получить через интерфейс AppletContext.

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

Реализация мультизадачности. Для создания мультизадачных приложений Java необходимо использовать класс java.lang.Thread. В этом классе определены все методы, необходимые для создания задач, управления их состоянием и син-хронизации.

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

  • стандартные потоки ввода и вывода;

  • потоки, связанные с локальными файлами;

  • потоки, связанные с файлами в оперативной памяти;

  • потоки, связанные с удаленными файлами.

Сетевые приложения. Существует два аспекта сетевого программирования на языке JavaJava: доступ к файлам на WWW-серверах и создание серверных и клиентских приложений с использованием сокетов. Доступ к файлам осуществляется через потоки типа 7d и позволяет, например, пересылать необработанные данные с сервера на машину пользователя, а там уже производить их обработку и представление. Создание каналов между приложениями Java с помощью сокетов открывает широкие возможности для обработки информации по схеме клиент-сервер.

Описание языка Java

Базовые типы данных. В языке Java определено восемь базовых типов данных. Для каждого базового типа данных отводится конкретный размер памяти. Этот размер не зависит от платформы, на которой выполняется приложение Java (табл. 7.5).

Таблица 7.5

Тип данных    Размер занимаемой области памяти     Значение по умолчанию
boolean 8 false
byte 8 0
char 16 ‘x0‘
short 16 0
int 32 0
long 64 0
float 32 0.0F
double 64 0.0D

Фактически размеры памяти, отведенные для хранения переменной, могут отличаться от приведенных выше. Например, для хранения переменной типа short может быть зарезервировано слово размером 32 бит. Так как в языке Java нет указателей, то нельзя адресоваться к элементам массива чисел по относительному смещению этих элементов в оперативной памяти.

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

Переменные типа boolean могут находиться только в двух состояниях - true и false, причем эти состояния нельзя соотнести с целыми значениями. Нельзя выполнить преобразование типа boolean, например, к типу int, так как компилятор выдаст сообщение об ошибке. Переменная типа byte занимает 8 бит памяти.

Что же касается типа char, то он используется для хранения символов в кодировке UNICODE. Эта кодировка позволяет хранить национальные наборы символов для интернациональных приложений, предназначенных для работы в Internet.

Переменные типа byte, short, int и long являются знаковыми.

Приложение Java может оперировать числами в формате с плавающей запятой, определенном в спецификации IEEE 754. Тип float позволяет хранить числа с одинарной точностью, а формат double - с двойной.

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

Библиотеки классов Java. Класс есть языковая конструкция, определяющая поля данных объектов определенного класса (instance variables) и их поведение (methods). Практически класс в JavaJava сам по себе не является объектом. Это лишь шаблон, который определяет, из каких частей будет состоять объект, созданный с помощью этого класса, и как он будет себя вести.

В языке Java все классы происходят от класса Object и наследуют его методы.

Некоторые библиотеки классов подключаются автоматически. Их называют встроенными. К таким относится, в частности, библиотека с названием java.lang. Другие библиотеки классов необходимо подключать в исходном тексте приложения Java явным образом с помощью оператора import.

Замещающие классы. Очень часто в приложениях вместо базовых типов переменных используются объекты встроенных классов, которые называются замещающими классами (wrapper classes). Ниже в табл. 7.6 перечислены названия этих классов и названия базовых типов данных, которые они замещают.

Таблица 7.6

Базовый тип данных Замещающий класс
boolean Boolean
Char Character
Int Integer
long Long
Float Float
double Double

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

Класс String. Строки в Java являются полноценными объектами. Они делятся на текстовые константы (Strings) и модифицируемые строки (StringBuffer). Компилятор позволяет явно определять текстовые литеры в программе подобно тому, как это делается в С++.

String hello = "Hello world!";

Ссылка hello инициируется объектом класса String на основе представления "Hello world!" в кодировке Unicode.

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

Хотя в языке JavaJava не допускается перезагрузка (переопределение) операторов, для объектов класса String и объектов всех произошедших от него классов сделана встроенная перезагрузка операторов "+" и "+=". С помощью этих операторов можно выполнять слияние текстовых строк, например:

System.out.println("x = " + x + '\n');

Здесь в качестве параметра функции println передается текстовая строка, составленная из трех компонентов: строки "x = ", числа x и символа перехода на следующую строку '\n'. Значение переменной x автоматически преобразуется в текстовую строку (что выполняется только для текстовых строк), и полученная таким образом текстовая строка сливается со строкой "x = ".

Подключаемые библиотеки классов. Для оценки возможностей набора классов Java кратко перечислим подключаемые библиотеки классов (более подробное описание этих классов приводится в справочной системе программы Java WorkShop).

    Библиотека классов java.net. Язык Java разрабатывался с ориентацией на создание сетевых приложений. Поэтому в состав данной библиотеки включены классы, с помощью которых можно работать с универсальными сетевыми адресами URL, передавать данные с использованием сокетов TCP и UDP, выполнять различные операции с адресами IP. Эта библиотека содержит также классы для выполнения преобразований двоичных данных в текстовой формат.

    Библиотека классов java.awt. Эта библиотека используется при создании пользовательского интерфейса с помощью апплетов JavaJava. Awt - это сокращение от Abstract Window Toolkit (инструментарий для работы с абстрактными окнами). Классы, входящие в состав библиотеки java.awt, предоставляют возможность создания пользовательского интерфейса способом, не зависящим от платформы, на которой выполняется апплет Java. Можно создавать обычные окна и диалоговые панели, кнопки, переключатели, списки, меню, полосы просмотра, однострочные и многострочные поля для ввода текстовой информации.

    Библиотека классов java.awt.image. При создании графических изображений и их обработке используется библиотека классов java.awt.image. Эта библиотека располагает широким набором классов и методов работы с графическими изображениями, в частности, в формате GIF.

    Библиотека классов java.applet. Эта библиотека классов используется при создании апплетов Java. Дополнительно в библиотеке классов java.applet определены интерфейсы для подключения апплетов к содержащим их документам и классы для проигрывания звуковых фрагментов.

    Библиотека классов java.util. Эта библиотека используется для создания таких структур, как динамические массивы, стеки и словари. Есть классы для работы с генератором псевдослучайных чисел, для деления строк на составляющие элементы (токены), для работы с календарной датой и временем.

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

    Библиотека классов java.awt.peer. Библиотека классов java.awt.peer служит для подключения компонентов Awt (например, кнопок, списков, полей редактирования текстовой информации, переключателей и т.д.) к реализациям, зависящим от платформы, в процессе создания этих компонентов.

Ссылки на объекты. Язык Java вместо указателей использует ссылки на объекты. Пользуясь этими ссылками, можно адресовать объекты по их имени, вызывая методы и изменяя значения данных объектов. При этом производится замена базовых типов данных на соответствующие замещающие классы. Например, вместо типа int используется класс Integer, вместо типа long - класс Long и т.д.

Инициализация таких объектов выполняется с помощью конструктора:

Integer nSomeValue;

nSomeValue = new Integer;

Первая строка создает неинициализированную ссылку с именем nSomeValue и типом Integer. При попытке использования такой ссылки возникнет исключение. Вторая строка создает объект класса Integer, вызывая конструктор. Этот конструктор определяет начальное значение. После выполнения оператора присваивания ссылка nSomeValue будет указывать на реальный объект класса Integer и ее можно будет использовать. Имя объекта nSomeValue типа Integer можно передавать функциям в качестве параметра, причем это будет ссылкой на объект.

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

Для создания массива можно воспользоваться квадратными скобками, расположив их справа от имени массива или от типа объектов, из которых составлен массив, например:

int nNumbers[];

или

int[] nAnotherNumbers;

Допустимы оба варианта, поэтому можно выбрать тот, который больше подходит.

При определении массивов в языке Java нельзя указывать их размер. Приведенные выше две строки не вызывают резервирования памяти для массива. Здесь просто создаются ссылки на массивы, которые без инициализации использовать нельзя.

Для того чтобы заказать память для массива, необходимо создать соответствующие объекты с помощью ключевого слова new, например:

int[] nAnotherNumbers;

nAnotherNumbers = new int[15];

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

int[] nColorRed = {255, 255, 100, 0, 10};

Динамическая инициализация выполняется с использованием индекса массива, например, в цикле:

int nInitialValue = 7;

int[] nAnotherNumbers;

nAnotherNumbers = new int[15];

for(int i = 0; i < 15; i++)

{

nAnotherNumbers[i] = nInitialValue;

}

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

Массивы могут быть многомерными и несимметричными.

Ниже приведен пример создания массива массивов. В нулевом и первом элементах создается массив из четырех чисел, а во втором - из восьми:

int[][] nDim = new int[5][10];

nDim[0] = new int [4];

nDim[1] = new int [4];

nDim[2] = new int [8];

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

Массивы в языке JavaJava являются объектами некоторого встроенного класса. Для этого класса существует возможность определить размер массива, обратившись к элементу данных класса с именем length, например:

int[] nAnotherNumbers;

nAnotherNumbers = new int[15];

for(int i = 0; i < nAnotherNumbers.length; i++)

{

nAnotherNumbers[i] = nInitialValue;

}

Создание классов. Для создания классов можно использовать ключевое слово class. В языке программирования С++ описание класса может быть отделено от его определения. Для Java это не так - описание класса недопустимо. Все методы должны быть определены внутри класса. Недопустимо также определение вложенных классов. В Java нет шаблонов, можно создавать классы только на базе других классов.

Объект класса создается при помощи ключевого слова new, однако нельзя удалить объект явным образом, так как ключевое слово delete языка программирования С++ в Java не используется.

При определении класса нельзя указать деструктор. Функции удаления объектов Java из памяти выполняет специальная система «сборки мусора».Внутри одного исходного файла можно определить только один общедоступный класс public. Все классы в Java наследуются от класса Object, поэтому для любого объекта можно использовать методы этого класса.

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

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

Если в базовом классе метод определен с ключевым словом final, его нельзя переопределить в дочернем классе, созданном на базе данного метода.

Методы не могут быть определены как in-line.

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

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

class Point extends Object {

Point() {

x = 0.0;

y = 0.0;

}

Point(double x, double y) {

this.x = x;

this.y = y;

}

public double x;

public double y;

Имя this в определении конструктора с аргументами используется для обозначения самого объекта, в методе которого мы находимся, в тех случаях, когда ссылка на этот объект не задается явно.

Переопределение операторов. В языке С++ можно переопределить операторы, такие как «+», «-», «++» и так далее. Язык JavaJava не допускает переопределения, что сделано для упрощения программирования. Тем не менее операторы «+» и «+=» перегружены по умолчанию для выполнения операции слияния текстовых строк класса String.

Интерфейсы. Под интерфейсом (interface) в Java понимается спецификация дополнительного набора методов, которые «обязан знать» объект. Идея заимствована из языка Objective C, где такая спецификация называется протоколом (protocol). Интерфейс не включает в себя модифицируемые переменные или выполняемые коды. Интерфейсы создаются при помощи ключевого слова interface таким же образом, что и классы. Однако в отличие от последних интерфейсы являются аналогом абстрактных базовых классов без полей данных и предназначены только для определений набора методов для решения каких-либо задач, например добавления компонентов в контейнеры, организации списков, сортировки и т.д.

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

Ссылки на методы класса. Так как в Java нет указателей, то нет и возможности ссылаться на методы с помощью оператора >. Для ссылки на метод класса используется только оператор «точка».

Оператор «::» также не определен в Java. Если необходимо вы-звать метод из базового класса, следует использовать ключевое слово super.

Наследование. С помощью ключевого слова extends можно унаследовать один класс (дочерний) от другого (базового).

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

Для ссылки на методы базового класса используется ключевое слово super.

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

Апплеты Java и их взаимодействие с HTML. Приложения Java могут выполняться под управлением специального интерпретатора, работающего в рамках отдельного процесса, либо под управлением виртуальной машины Java, встроенной в программу просмотра, такую, как Microsoft Internet ExplorerMS Internet Explorer или Netscape NavigatorNetscape Navigator. В последнем случае приложение называется апплетом. Апплет встраивается в документ HTMLHTML и выглядит как окно заранее заданного размера. В этом окне могут размещаться произвольные изображения или текст.

Двоичный файл с интерпретируемым кодом Java располагается на WWW-сервере. В документе HTML с помощью тега <APPLET> организуется ссылка на этот двоичный файл. Когда пользователь загружает документ HTML с апплетом, файл апплета переписывается с www-сервера на рабочую станцию пользователя. После этого программа просмотра начинает его выполнение.

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

Рассмотрим теперь формат тега <APPLET>, с помощью которого можно расширить возможности HTML-документа java-апплетами:

<applet

name="HelloApplet"

code="HelloApplet"

codebase="file:/e:/sun/vol3/src/HelloApplet"

width="500"

height="600"

align="Top"

alt="If you had a java-enabled

browser, you would see an applet here.">

</applet>

Тег <APPLET> используется в паре с тегом </APPLET> и имеет параметры, приведенные в табл. 7.7.

Дополнительно между операторами <APPLET> и </APPLET> можно задать параметры апплета. Для этого используется тег <PARAM>, располагаемый сразу за тегом <APPLET>, например:

<param name=ParamName1 value="Param 1">

<param name=ParamName4 value="Param 4">

Здесь через параметр Name передается имя параметра ап-плета, а через параметр Value - значение соответствующего параметра. Для получения значений параметров апплет должен использовать метод getParameter.

Пример апплета Java

Рассмотрим пример простейшего апплета Java и html-страницу, с которой он вызывается:

// HelloApplet.java Applet

// import java.applet.Applet; // для доступа к классу Applet

import java.awt.*; // подключение Abstract Window Toolkit

// основной класс нашего апплета, унаследованный от класса Applet

public class HelloApplet extends Applet

{

public String getAppletInfo() // обеспечение информации об апплете

{

return "HelloJava Applet";

}

public void paint(Graphics g) // обработчик процедуры рисования окна

{

g.drawString("Hello, Java world!",

20, 20);

}

}

//

// HelloAp.html

//

<html>

<head>

<title>HelloAp</title>

</head>

<body>

<hr>

<applet

code=HelloApplet.class

width=320

height=240

</applet>

<hr>

</body>

</html>

Безопасность

Сетевой пакет JavaJava включает в себя поддержку различных сетевых протоколов (FTP, HTTP, Telnet и т.д.), на уровне которых организована защита от вторжения по сети. Установка прав сетевого доступа в локальную систему считается специалистами весьма эффективной. Средствами JavaJava можно запретить сетевой доступ, разрешить доступ только к тому узлу, с которого был получен код, разрешить любой сетевой доступ и т.д.

JavaScriptJavaScript разработан фирмой Netscape и ориентирован на создание и обработку скриптов Web-страниц, а также используется для написания сценариев интерактивного поведения Web-страниц Всемирной Паутины (WWW - World Wide Web). В этом плане он является вложенным в язык HTMLHTML, но не дублирует его функциональные возможности. В результате все методы оформления Web-страниц осуществляются языком HTML, а JavaScript предоставляет возможность «динамизации» Web-публикаций и способствует снижению трафика в сети.

JavaScript напоминает язык JavaJava. Различие заключается в том, что Java разрабатывался как универсальный объектно-ориентированный язык, а JavaScript рассматривается как быстрое и простое в использовании средство расширения возможностей Web-страниц и Web-серверов.

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

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

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

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

Структурная схема исполнения скриптов JavaScript представлена на рис. 7.3Рис. 07.03. Структурная схема исполнения скриптов JavaScript.

Подключение скриптов к HTML-документу. Известно четыре способа подключения JavaScript-программ к HTML-документу:

  • использование тега <SCRIPT>;

  • объявление JavaScript-файла, содержащего текст программы;

  • определение JavaScript-выражения в качестве значения HTML-атрибутов;

  • объявление JavaScript-программы в качестве обработчика событий.

Использование тега <SCRIPT>. Тег <SCRIPT> - это элемент HTML, который может содержать любое число JavaScript-операторов:

<SCRIPT>

JavaScript-операторы…

</SCRIPT>

Web-страница может включать любое количество тегов <SCRIPT> в любом месте. В теге <SCRIPT> можно определить версию браузера, для которого предназначены операторы JavaScript:

    <SCRIPT LANGUAGE = "JavaScript"> определяет JavaScript для Navigator 2.0

    <SCRIPT LANGUAGE = "JavaScript1.1"> определяет JavaScript для Navigator 3.0 и т.д.

Операторы в пределах тега <SCRIPT> игнорируются, если браузер пользователя не имеет уровня поддержки JavaScript, указанного в признаке LANGUAGE.

Поскольку появился VBScript, признак LANGUAGE становится обязательным.

Таким образом, можно использовать признак LANGUAGE для написания программ, которые содержат особенности более высоких версий браузера Navigator, без ошибок при применении более низких версий Navigator.

Определение файла для JavaScript. Признак SRC тега <SCRIPT> позволяет определять файл как источник операторов JavaScript.

<SCRIPT SRC="MyProg.js">

JavaScript-операторы…

</SCRIPT>

JavaScript-операторы в пределах тега <SCRIPT> с признаком SRC игнорируются, если в файле нет ошибок, т.е. туда можно поместить операторы, сообщающие пользователю об ошибках, например:

Document.write("Ошибка выполнения файла MyProg.js")

Признак SRC может определить любой URL, относительный или абсолютный, например:

<SCRIPT SRC="http://www.usr.com/SomeProg.js">

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

Использование JavaScript-выражения в качестве значения HTML-атрибутов. При использовании JavaScript можно определить JavaScript-выражение как значение для тега HTML. Это позволяет создавать более гибкие HTML-страницы, потому что признаки одного HTML-элементHTML-элемента могут зависеть от ранее размещенных на странице элементов.

Для включения в текст HTML-тега JavaScript-объекта используют специальную конструкцию в виде последовательности из трех элементов:

    Символ "" (амперсанд)

    JavaScript-выражение, заключенное в фигурные скобки {}

    Символ ";" (точка с запятой)

Можно использовать JavaScript-объекты только там, где употребимо значение тега HTML. Например, положим, что в документе определена средствами JavaScriptJavaScript переменная barWidth, имеющая значение 50. Тогда горизонтальную линию на половину окна можно создать следующим образом:

<HR WIDTH="{barWidth};%" ALIGN="LEFT">

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

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

Одним из применений обработки событий является проверка правильности заполнения формы. Такая проверка позволяет:

  • снизить нагрузку на Web-сервер, поскольку некорректные данные будут уже отфильтрованы;

  • сократить задержки в случае ошибки пользователя, поскольку при проверке отсутствуют сетевые обращения;

  • упростить серверную программу.

Объекты в JavaScript. В языке JavaScript все элементы Web-страницы выстраиваются в иерархическую структуру. Каждый элемент предстает в виде объекта. И каждый такой объект может иметь определенные свойства и методы. В свою очередь, язык JavaScript позволяет управлять объектами Web-страницы, хотя для этого важно понимать иерархию объектов, на которые опирается разметка HTML. Рассмотрим простую HTML-страницу:

<html>

<head>

<title>My homepage

</head>

<body bgcolor=#ffffff>

<center>

<img src="home.gif" name="pic1" width=200 height=100>

</center>

<p>

<form name="myForm">

Name:

<input type="text" name="name" value=""><br>

e-Mail:

<input type="text" name="email" value=""><br><br>

<input type="button" value="Push me" name="myButton" onClick="alert('Yo')">

</form>

<p>

<center>

<img src="ruler.gif" name="pic4" width=300 height=15>

<p>

<a href="http://rummelplatz.uni-mannheim.de/~skoch/">My homepage</a>

</center>

</body>

</html>

В приведенную выше Web-страницу входят два рисунка, одна ссылка и некая форма с двумя полями для ввода текста и одной кнопкой. С точки зрения языка JavaScriptJavaScript окно Браузербраузера - это некий объект window. Объект также содержит в свою очередь некоторые элементы оформления, такие, как строка состояния. Внутри окна можно разместить документ HTML. Web-страница является не чем иным, как объектом document. Это означает, что объект document представляет в языке JavaScript загруженный на настоящий момент документ HTML. Все без исключения объекты HTML являются свойствами объекта document. Пример объекта HTML - ссылка или заполняемая форма.

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

Каждый объект иерархической структуры имеет свое имя. Следовательно, чтобы знать, как можно обратиться к первому рисунку на HTML-странице, необходимо сориентироваться в иерархии объектов. И начать нужно с самой вершины. Первый объект такой структуры называется document. Первый рисунок на Web-странице представлен как объект images[0]. Это означает, что для получения доступа к объекту необходимо записать его в JavaScript как document.images[0].

Если же, например, надо знать, какой текст ввел пользователь в первый элемент формы, то следует выяснить, как получить доступ к этому объекту. И снова анализ структуры начинают с вершины иерархии объектов. Затем прослеживается путь к объекту с именем elements[0] и последовательно записываются названия всех объектов, которые вошли в состав этой ветви. В итоге выясняется, что доступ к первому полю для ввода текста можно получить, записав: document.forms[0].elements[0].

Элемент, соответствующий полю для ввода текста, имеет свойство value, которое соответствует введенному тексту. На языке JavaScript можно записать строку:

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

Полученная строка заносится в переменную name. Следовательно, теперь можно работать с этой переменной. Например, можно создать выпадающее окно, воспользовавшись командой alert("Hi " + name). В результате, если пользователь введет в это поле слово 'Stefan', то по команде alert("Hi " + name) будет открыто выпадающее окно с приветствием 'Hi Stefan'.

При работе с большими Web-страницами процедура адресации к различным объектам по номеру может стать весьма запутанной. Во избежание подобной проблемы можно самим присваивать различным объектам уникальные имена, например:

<form.name="myForm">

Name:

<input type="text" name="name" value=""><br>

Эта запись означает, что объект forms[0] получает еще и второе имя - myForm. Точно так же вместо elements[0] можно записать name (последнее было указано в атрибуте name тега <input>). Таким образом, вместо name = document.forms[0].elements[0].value; можно записать name= document.myForm.name.value;

Это упрощает программирование на JavaScriptJavaScript, особенно в случае с большими Web-страницами, содержащими множество объектов. При написании имен необходимо следить за положением регистра - т.е. нельзя написать myform вместо myForm.

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

<form name="myForm">

<input type="text" name="input" value="bla bla bla">

<input type="button" value="Write"

onClick="document.myForm.input.value= 'Yo!'; ">

Кроме объектов window и document в JavaScript имеется еще один важный объект - location. В этом объекте представлен адрес загруженного HTML-документа. Например, если загружена страница с конкретным URL-адресом, то значение location.href будет соответствовать этому адресу.

В location.href можно записывать новые значения. В данном примере кнопка загружает в текущее окно новую страницу:

<form>

<input type=button value="Yahoo"

onClick="location.href='http://www.yahoo.com'; ">

</form>

Изображения (Image). Объект Image позволяет вносить изменения в графические образы, присутствующие на Web-странице. В частности, с его помощью создается Анимацияанимация.

В JavaScript все изображения представляются в виде двухмерного массива. Массив этот называется images и выступает в виде свойства объекта document. Каждое изображение на Web-странице получает порядковый номер, начиная с 0: 0, 1, 2 и т.д. Таким образом, к первому изображению можно адресоваться, записав document.images[0].

Объект Image имеет определенные свойства, к которым можно обращаться с помощью языка JavaScript. Например, можно определить размер изображения, обратившись к его свойствам width и height. То есть по записи document.images[0].width можно определить ширину первого изображения на Web-странице (в пикселах).

Как и в общем случае, предпочитают присваивать объектам типа изображения индивидуальные имена. Так, ниже приведен пример присвоения изображению имени:

<img src="img.gif" name="myImage" width=100 height=100>,

К этому изображению можно обращаться, записав: document.myImage или document.images["myImage"].,

Как и в случае тега <img>, атрибут src содержит адрес представленного изображения. В языке JavaScriptJavaScript имеется возможность назначать новый адрес изображению, уже загруженному в Web-страницу. В результате изображение будет загружено с этого нового адреса, заменив на Web-странице старый адрес. Например:

<img src="img1.gif" name="myImage" width=100 height=100>

В этом примере загружается изображение img1.gif, которое получает имя myImage. В следующей строке прежнее изображение img1.gif заменяется новым - img2.gif:

document.myImage.src= "img2.src";

При этом новое изображение всегда имеет тот же размер, что был у старого.

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

<a href="#"

onMouseOver="document.myImage2.src='img2.gif'"

onMouseOut="document.myImage2.src='img1.gif'">

<img src="img1.gif" name="myImage2" width=160 height=50 border=0></a>

Объект Image JavaScript дает возможность создавать достаточно сложные эффекты, способствующие улучшению дизайна Web-страницы.

Формы. Формы широко используются в Internet. Информация, введенная в форму, может отправляться по электронной почте на заданный адрес либо передаваться на Web-сервер. Перед передачей такой информации по сетям Internet ее можно проверить с помощью функциональных возможностей языка JavaScript.

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

<html>

<head>

<script language="JavaScript">

<!- Скрыть

function test1(form) {

if (form.text1.value == "")

alert("Пожалуйста, введите строку!")

else {

alert("Привет "+form.text1.value+"! Форма заполнена корректно!");

}

}

function test2(form) {

if (form.text2.value == "" ||

form.text2.value.indexOf('@', 0) == -1)

alert("Неверно введен адрес e-mail!");

else alert("OK!");

}

// ->

</script>

</head>

<body>

<form name="first">

Введите Ваше имя:<br>

<input type="text" name="text1">

<input type="button" name="buttonl" value="Проверка" onClick="test1(this.form)">

<P>

Введите Ваш адрес e-mail:<br>

<input type="text" name="text2">

<input type="button" name="button2" value="Проверка" onClick="test2(this.form)">

</body>

</html>

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

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

Фреймы. В общем случае окно браузера может быть разбито на несколько отдельных фреймов. Это означает, что фрейм определяется как некое выделенное в окне браузера поле в форме прямоугольника. Каждый из фреймов выдает на экран содержимое собственного документа (в большинстве случаев это документы HTML). Любому фрейму можно присвоить уникальное имя, воспользовавшись в теге <frame> атрибутом name. Такая возможность важна в языке JavaScriptJavaScript для доступа к фреймам.

При создании Web-страниц можно использовать несколько вложенных тегов <frameset>. Например (из документации, предоставляемой фирмой Netscape):

<frameset cols="50%,50%">

<frameset rows="50%,50%">

<frame src="cell.htm">

<frame src="cell.htm">

</frameset>

<frameset rows="33%,33%,33%">

<frame src="cell.htm">

<frame src="cell.htm">

<frame src="cell.htm">

</frameset>

</frameset>

Можно задать толщину границы между фреймами, воспользовавшись в теге <frameset> параметром border. Запись border=0 означает отсутствие какой-либо границы.

JavaScript организует все элементы, представленные на Web-странице, в некоторую иерархическую структуру, включая фреймы. В вершине иерархии находится окно браузера (browser window). Положим, оно разбито на два фрейма. Таким образом, окно, как объект, является родоначальником, родителем данной иерархии (parent), а два фрейма - соответственно его потомками (children). Этим двум фреймам можно присвоить уникальные имена - frame1 и frame2. С помощью этих имен можно обмениваться информацией с двумя указанными фреймами.

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

При решении этой задачи необходимо рассмотреть три случая:

  • главное окно/фрейм получает доступ к фрейму-потомку;

  • фрейм-потомок получает доступ к родительскому окну/фрейму;

  • фрейм-потомок получает доступ к другому фрейму-потомку.

С точки зрения объекта "окно" (window) два указанных фрейма называются frame1 и frame2. Существует прямая взаимосвязь между родительским окном и каждым фреймом. Так, если писать скрипт для родительского окна, то можно обращаться к этим фреймам, называя их по имени. Например:

frame2.document.write("Это сообщение передано от родительского окна.")

Окна. Еще одной функциональной возможностью языка JavaScriptJavaScript является открытие новых окон в браузере. Можно либо загружать в новое окно новые документы (HTML), либо (динамически) создавать новые материалы. Рассмотрим, как можно открыть новое окно, загрузить в него HTML-страницу и закрыть его.

Приведенный ниже скрипт открывает новое окно браузера и загружает в него определенную Web-страницу:

<html>

<head>

<script language="JavaScript">

<!- hide

function openWin() {

myWin= open("*.htm");

}

// ->

</script>

</head>

<body>

<form>

<input type="button" value="Открыть новое окно" onClick="openWin()">

</form>

</body>

</html>

В этом примере в новое окно с помощью метода open() записывается страница *.htm. Процессом создания окна можно управлять. Например, можно указать, должно ли новое окно иметь строку статуса, панель инструментов или меню. Кроме того, можно задать размер окна. Например, в следующем скрипте открывается новое окно размером 400x300 пикселов.

<html>

<head>

<script language="JavaScript">

<!- hide

function openWin2() {

myWin= open("bla.htm", "displayWindow",

"width=400,height=300,status=no,toolbar=no,menubar=no");

}

// ->

</script>

</head>

<body>

<form>

<input type="button" value="Открыть новое окно" onClick="openWin2()">

</form>

</body>

</html>

Это окно не имеет ни строки статуса, ни панели инструментов, ни меню. Свойства окна формулируются в строке "width=400, height=300, status=no, toolbar=no, menubar=no". Отметим, что в этой строке не следует помещать символы пробела.

Для закрытия окна с помощью языка JavaScript используют метод close().

Слои. Слои - одна из новых функциональных возможностей браузера Netscape Navigator 4.0. Она позволяет выполнять точное позиционирование таких объектов Web-страницы, как изображения; осуществлять перемещение объектов по Web-странице или делать объекты невидимыми.

Управление слоями осуществляется с помощью языка JavaScriptJavaScript. На момент написания этой работы пользоваться слоями можно только в Netscape Navigator 4.0Netscape Navigator 4.0.

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

Чтобы создать слой, необходимо использовать тег <layer> либо <ilayer>. Можно воспользоваться параметрами, приведенными в табл. 7.8.

Таблица 7.8

name="LayerName" Название слоя
left=xPosition Абсцисса левого верхнего угла
top=yPosition Ордината левого верхнего угла
z-index=layerIndex Номер индекса для слоя
width=layerWidth Ширина слоя в пикселах
clip="x1_offset, y1_offset, x2_offset, y2_offset" Задает видимую область слоя
above="layerName" Определяет, какой слой окажется внизу
below="layerName" Определяет, какой слой окажется вверху
Visibility=show|hide|inherit Видимость этого слоя
Bgcolor="rgbColor" Цвет фона — либо название стандартного цвета, либо RGB-запись
Background="imageURL" Фоновая картинка

Тег <layer> используется для тех слоев, которые можно точно позиционировать. Если же не указать положение слоя (с помощью параметров left и top), то по умолчанию он помещается в верхний левый угол окна. Тег <ilayer> создает слой, положение которого определяется при формировании документа.

Например, создадим два слоя. В первом разместим изображение, а во втором - текст. При этом текст должен визуализироваться на фоне изображения:

<html>

<layer name=pic z-index=0 left=200 top=100>

<img src="img.gif" width=160 height=120>

</layer>

<layer name=txt z-index=1 left=200 top=100>

<font size=+4><i> Layers-Demo </i></font>

</layer>

</html>

JavaScript позволяет обращаться к слоям с помощью конструкции document.layers["myLayer"], где myLayer - имя слоя.

Программы на JavaScript могут выполнять запись информации в строку состояния; с помощью функции Timeout (или таймера) можно запрограммировать компьютер на выполнение некоторых команд по истечении определенного времени; JavaScript предоставляет возможность использовать предопределенные объекты (Date, Array или Math) и т.д.

Таким образом, использование языка JavaScript позволяет:

  • Создавать или добавлять к HTML-документу скрипты JavaScript.

  • Производить отладку Web-страницы.

  • Осуществлять добавление Web-страницы к создаваемым Web-серверам.

PHPPHP - это язык написания сценариев, внедряемых в HTML-документ. Многое из синтаксиса данного языка заимствовано из C, Java и Perl с добавлением специфичных для PHP возможностей. Задача языка состоит в том, чтобы предоставить возможность Web-разработчикам создавать динамично изменяемые HTML-страницы. Язык PHP - это скрипт-язык (scripting language), встраиваемый в HTML, который интерпретируется и выполняется на сервере.

Первая используемая версия PHP cтала доступна в начале 1995 г. и была известна как Personal Home Page Tools. К середине 1995 г. появилась вторая версия, которая называлась PHP/FI Version 2. Приставка FI присоединилась из другого пакета Rasmusa, который ориентировался на обработку форм (Form Interpretator). PHP/FI компилировался внутри сервера Apache и использовал стандартный API Apache. PHP-скрипты оказались быстрее аналогичных CGI-скриптов, так как серверу не было необходимости порождать новый процесс. Язык PHP по возможностям приблизился к Perl, самому популярному языку для написания CGI-программ. Была добавлена поддержка множества известных баз данных (например, MySQL и Oracle). Интерфейс к GD-библиотеке позволял генерировать изображения «на лету». С этого момента началось широкое распространение PHP/FI. К 1996 г. PHP/FI был использован по крайней мере на 15000 Web-серверах Internet. К 1998 г. число Web-серверов, использующих PHP, возросло до 150000 cайтов.

В июне 1998 г. вышла новая версия, которая была названа PHP 3. К лету 1999 г. PHP 3 был включен в несколько коммерческих продуктов. По данным NetCraft на ноябрь 1999 г., PHP использовался более чем в 1 млн. доменов.

В декабре 1999 была выпущена новая версия PHP 4, в которой внутренний «движок» (Zend) был переписан. Производительность новой версии в десятки раз выше, чем у предыдущих.

Традиционно динамические WEB-страницы реализовались с использованием CGI-скриптов, написанных на Perl. Но CGI- скрипты очень плохо масштабируемы. Каждый новый вызов CGI требует от ядра порождения нового процесса, а это занимает процессорное время и тратит оперативную память. PHP предлагает другой вариант - он работает как часть Web-сервера и этим похож на ASP (Microsoft).

Синтаксис PHP аналогичен синтаксису C или Perl. В этом языке нет строгой типизации данных и нет необходимости в действиях по выделению/освобождению памяти. Программы, написанные на PHP, достаточно легкочитаемы. Написанный PHP-код легко зрительно прочитать и понять.

Рассмотрим некоторые функциональные особенности языка PHP.

Работа с базами данных. Одной из отличительных особенностей языка PHP является интеграция Web-страниц с базами данных. В настоящее время поддерживается достаточно широкий перечень баз данных в режиме работы в собственной системе команд и через ODBC: Oracle, Adabas D, Sybase, FilePro, mSQL, Velocis, MySQL, Informix, Solid, dBase, ODBC, Unix dbm, PostgreSQL.

Аутентификация пользователя средствами PHP. HTTP-аутентификация пользователя (клиента) в языке PHP доступна только при использовании модуля Apache, в который включен PHP-скрипт, использующий специальную функцию Header(). С ее помощью осуществляется отправка сообщения "Authentication Required" браузеру пользователя, открывающая диалоговое окно Username/Password, в котором пользователю предлагается заполнить поля username и password. После их заполнения сервером осуществляется вызов URL-адреса пользователя с дополнительными переменными, содержащими введенную информацию ($PHP_AUTH_USER, $PHP_AUTH_PW и $PHP_AUTH_TYPE). В данном случае может быть обеспечена только «основная» аутентификация. Ниже приведен фрагмент сценария, который производит аутентификацию пользователя:

<?php

if(!isset($PHP_AUTH_USER)) {

Header("WWW-Authenticate: Basic realm=\"My Realm\"");

Header("HTTP/1.0 401 Unauthorized");

echo "Text to send if user hits Cancel button\n";

exit;

}else { echo "Hello $PHP_AUTH_USER.<P>";

echo "You entered $PHP_AUTH_PW as your password.<P>";

}

?>

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

Загрузка файлов. PHP может принимать файлы, загруженные из любого браузера, отвечающего стандартам RFC-1867 (Netscape Navigator 3, Microsoft Internet ExplorerMicrosoft Internet Explorer 3 и выше). Эта функция предоставляет пользователю возможность загружать файлы. PHP-аутентификация и функции манипулирования файлами обеспечивают контроль над тем, кому позволять загружать файлы и какие операции можно выполнять с файлом, если он был загружен.

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

<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>

<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">

Send this file: <INPUT NAME="userfile" TYPE="file">

<INPUT TYPE="submit" VALUE="Send File">

</FORM> _

URL_ должен указать на php html файл. Cкрытое поле MAX_FILE_SIZE должно предшествовать полю ввода файла и означает максимально допустимый размер файла. Значение определяется в байтах. Для этого файла при успешной загрузке будут определены следующие переменные:

    $userfile - Временное имя файла, под которым файл за-гружается в машину сервера.

    $userfile_name - Исходное имя файла в системе отправителя.

    $userfile_size - Размер загруженного файла в байтах.

    $userfile_type - Тип MIME файла, если браузер предоставил эту информацию. Например, может быть "image/gif".

Элемент вышеупомянутых переменных "$userfile" - это любое значение поля Name тега INPUT TYPE=file, указанное в форме загрузки. В приведенном выше примере формы загрузки названы "userfile".

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

Например, с помощью переменной $file_size можно отбросить любые файлы, которые являются или слишком маленькими, или слишком большими. Эта же переменная ($file_type) используется для отбрасывания любых файлов, не соответствующих заданным критериям типа. В конечном итоге необходимо удалить файл из временного каталога или переместить его в другое место. Следует иметь в виду, что файл будет удален из временного каталога в конце запроса, если он не перемещен или переименован.

Создание GIF-файлов с помощью PHP. PHP может также использоваться для создания файлов GIF с изображением или потоками изображений GIF (Анимацияанимация). Для этого необходимо скомпилировать PHP с библиотекой функций изображений - GD. Ниже приведен пример создания GIF-файлов с помощью PHP:

<?php

Header("Content-type: image/gif");

$string=implode($argv," ");

$im = imagecreatefromgif("images/button1.gif");

$orange = ImageColorAllocate($im, 220, 210, 60);

$px = (imagesx($im)-7.5*strlen($string))/2;

ImageString($im,3,$px,9,$string,$orange);

ImageGif($im);

ImageDestroy($im);

?>

Этот пример вызывается со страницы тегом: <img src="button.php3?text">. Скрипт (button.php3) берет строку "text", накладывает сверху на основное изображение, которым в этом случае является " images/button1.gif ", и выводит возникающее в результате изображение. Это удобный способ не рисовать новые изображения кнопки каждый раз, когда необходимо изменить текст кнопки (пиктограммы). В результате кнопка-пиктограмма будет динамически сгенерирована.

HTTP Кукисы (Cookies). PHP поддерживает HTTP Cookie, как это определено в Netscape's Spec. Cookie - это механизм для сохранения данных в удаленном браузере, используемом для поддержки процедуры обмена или идентификации ответа пользователей. Кукисы можно устанавливать, используя функцию SetCookie(). Они являются частью HTTP-заголовка, так что функция SetCookie() должна вызываться прежде, чем браузеру послана какая-нибудь информация для вывода. Это ограничение, которое касается и функции Header().

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

SetCookie ("MyCookie[]", "Testing", time()+3600);

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

$Count++;

SetCookie ("Count", $Count, time()+3600);

SetCookie ("Cart[$Count]", $item, time()+3600);

Регулярные выражения. Регулярные выражения используются для сложного манипулирования строками в PHP. Функции, которые поддерживают регулярные выражения:

ereg()

ereg_replace()

eregi()

eregi_replace()

split().

Все эти функции принимают строку регулярного выражения как их первый параметр. Пример регулярных выражений:

ereg("abc",$string);

/* Возвращает 'истина', если "abc"

найдено в строке $string. */

ereg("^abc",$string);

/* Возвращает 'истина', если "abc"

найдено в начале строки $string. */

ereg("abc$",$string);

/* Возвращает 'истина', если "abc"

найдено в конце строки $string. */

eregi("(ozilla.[23]|MSIE.3)",$HTTP_USER_AGENT);

/* Возвращает 'истина', если браузер клиента

- Netscape или MSIE . */

ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)",$string,$regs);

/* Помещает три слова - $regs[1], $regs[2] и $regs[3],

разделенные пробелом. */

ereg_replace("^","<BR>",$string);

/* Устанавливает тег <BR> в начало строки $string. */

ereg_replace("$","<BR>",$string);

/* Устанавливает тег <BR> в конец строки $string. */

ereg_replace("\n","",$string);

/* Отсекает символ "возврат каретки" в строке $string. */

Функции языка PHP весьма разнообразны. Помимо указанных выше они включают: календарные функции, функции даты и времени, функции dBase, функции dbm, функции для работы с каталогами, функции динамической загрузки, функции запуска программы, функции работы с filePro, функции файловой системы, функции работы с HTTP, функции работы с Hyperwave, почтовые функции, математические функции, функции MySQL, сетевые функции, функции URL и т.д.

Особенности синтаксиса и грамматики PHP

Cчитается, что на синтаксис PHP повлияли концепции языков C, JavaJava и Perl.

Переход из HTML. Есть три способа выхода из HTML и перехода в «режим PHP-кода»:

  1. <? echo("простейший способ, инструкция обработки SGML\n"); ?>

  2. <?php echo("при работе с XML документами\n"); ?>

  3. <script language="php">

    echo ("некоторые редакторы (подобные FrontPage) не

    используют обрабатывающие инструкции ");

    </script>;

  4. <% echo("От PHP 3.0.4 можно факультативно применять ASP-теги"); %>

Разделение инструкций. Инструкции (утверждения) разделяются точкой с запятой (так же, как в C или Perl).

Закрывающий тег (?>) подразумевает конец утверждения, поэтому следующие записи эквивалентны:

<php

echo "Это тест";

?>

<php echo "Это тест" ?>

Типы переменных. PHP поддерживает переменные следующих типов:

    integer - целое,

    double - число с дробной частью,

    string - строковая переменная,

    array - массив,

    object - объектная переменная,

    pdfdoc - PDF-документ (только при наличии поддержки PDF),

    pdfinfo - PDF-инфо (только при наличии поддержки PDF).

Тип переменной обычно не устанавливается программистом. Он определяется PHP во время выполнения программы в зависимости от контекста, в котором данная переменная используется. Для указания типа переменной непосредственно можно использовать инструкцию cast либо функцию seettype ( ).

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

Определение типов переменных. Поскольку PHP определяет типы переменных и преобразует их (в общем) по мере необходимости, не всегда очевидно, какой тип данная переменная имеет в какой-то отдельный момент. Поэтому PHP включает несколько функций, которые позволяют определить текущий тип переменной: gettupe( ), is is_long(), is double( ), is string(), is array() и is object().

Приведение типа. Приведение типа работает в PHP во многом так же, как в C: название требуемого типа записывается в круглых скобках перед переменной, которая должна быть приведена к данному типу.

    $foo = 10; // $foo is an integer,

    $bar = (double) $foo; // $bar is a double,

Допускается следующее приведение типов:

    (int), (integer) - приведение к целому,

    (real), (double), (float) - приведение к типу double,

    (string) - приведение к строке,

    (array) - приведение к массиву,

    (object) - приведение к объектной переменной.

Заметим, что табуляция и пробелы допускаются внутри круглых скобок:

    $foo = (int) $bar;

    $foo = ( int ) $bar;

Изменение типа. PHP не требует явного определения типа при объявлении переменной, тип переменной определяется по контексту, в котором она используется. Если присваивается строковое значение переменной var, то var становится строкой. Если затем присвоить переменной var значение целого (числа), то она станет целым.

Примером автоматического преобразования типа в PHP может служить оператор сложения '+'. Если какой-либо из операндов является числом с дробной частью (тип double), то затем все операнды оцениваются как double и результат будет иметь тип double. Иначе эти операнды будут интерпретированы как целые (integers) и результат будет также иметь тип integer. Отметим, что при этом не меняются типы самих операндов, меняется только оценка этих операндов.

$foo = "0"; // $foo является строкой (ASCII 48)

$foo++; // $foo является строкой "1" (ASCII 49)

$foo += 1; // $foo сейчас является целым (2)

$foo = $foo + 1.3; // $foo сейчас имеет тип double (3.3)

$foo = 5 + "10 Little Piggies"; // $foo является целым (15)

$foo = 5 + "10 Small Pigs"; // $foo является целым (15)

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

Переменная string будет оценена как double, если она содержит любой из символов '.', 'e' или 'E'. Иначе она будет оценена как integer.

Данное значение задается начальной частью строковой переменной. Если строка начинается с допустимых цифровых данных, то это значение и используется. Иначе будет значение 0 (нуль). Допустимые цифровые данные - это конструкция из факультативного символа, следующего за одной или несколькими цифрами (содержащими факультативно десятичную точку), обозначающего экспоненту. Экспонента может обозначаться символом 'e' или 'E', который может следовать за одной или несколькими цифрами:

$foo = 1 + "10.5"; // $foo тип double (11.5)

$foo = 1 + "-1.3e3"; // $foo тип double (-1299)

$foo = 1 + "bob-1.3e3"; // $foo тип integer (1)

$foo = 1 + "bob3"; // $foo тип integer (1)

$foo = 1 + "10 Small Pigs"; // $foo тип integer (11)

$foo = 1 + "10 Little Piggies"; // $foo тип integer (11);

// строка содержит 'e'

Изменяемые переменные. Иногда бывает удобно давать переменным изменяемые имена. Такие имена могут изменяться динамически. Обычная переменная устанавливается так: $a = "hello";

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

$$a = "world";

С этой точки зрения, две переменные определены и сохранены в символьном дереве PHP: $a с содержимым "hello" и $hello с содержимым "world". Так, инструкция: echo "$a ${$a}"; осуществляет то же самое, что и инструкция echo "$a $hello"; а именно: обе они выводят hello world.

Чтобы использовать изменяемые переменные с массивами, необходимо решить проблему неоднозначности. Так, если пишется $$a[1], то синтаксическому анализатору необходимо знать, предполагается ли использовать $a[1] как переменную или $$a как переменную, а [1] как индекс этой переменной. Синтаксис для разрешения подобной неоднозначности: ${$a[1]} для первого случая и ${$a}[1] для второго.

Инициализация переменной. Для инициализации переменной в PHP ей присваивается значение. Для большинства переменных это именно так; для массивов и объектных переменных, однако, может использоваться несколько иной механизм.

Инициализация массивов. Массив может инициализироваться одним из двух способов: последовательным присвоением значений или посредством конструкции array (). При последовательном добавлении значений в массив осуществляется запись значения элементов массива с помощью пустого индекса. Каждое последующее значение будет добавляться в качестве последнего элемента массива.

$names[] = "Jill"; // $names[0] = "Jill"

$names[] = "Jack"; // $names[1] = "Jack"

Как и в языках C и Perl, элементы массива нумеруются начиная с 0 (а не с 1).

Манипуляции с массивом. PHP поддерживает как скалярные, так и ассоциативные массивы. Фактически между ними нет разницы. Можно создать массив, используя функции list() либо array(), или явно задавая значение каждого элемента массива:

$a[0] = "abc";

$a[1] = "def";

$b["foo"] = 13;

Можно также создать массив, добавляя в него значения:

$a[] = "hello"; // $a[2] == "hello";

$a[] = "world"; // $a[3] == "world".

Массив может сортироваться функциями asort(), arsort(), ksort(), rsort(), sort(), uasort(), usort() и uksort() в зависимости от типа сортировки.

Подсчет количества элементов массива осуществляется функцией count(). Перемещаться по массиву позволяют функции next() и prev(). Другим типовым способом перемещения по массиву является использование функции each().

Инициализация объектов. Для инициализации объектной переменной используется новое предписание для сопоставления данного объекта объектной переменной:

class foo {

function do_foo () {

echo "Doing foo.";

}

}

$bar = new foo;

$bar -> do_foo ();

Область переменной. Областью переменной является контекст, внутри которого она определена. В основном все переменные PHP имеют одну область. Однако внутри функций, определенных пользователем, представлена локальная область функции. Любая переменная, определенная внутри функции, по умолчанию ограничена локальной областью функции. Например:

$a = 1; /* глобальная область */

Function Test () {

echo $a; /* ссылка на переменную локальной области */

}

Test ();

Этот скрипт не выдаст что-либо на выходе, поскольку инструкция echo относится к локальной версии переменной $a, значение которой присваивается не внутри этой области. Можно заметить, что здесь имеется некоторое отличие от языка C в том, что глобальные переменные в C автоматически действуют и внутри функций, если только они не переписываются локальными определениями. Это может вызвать некоторые проблемы, так как по неосторожности можно изменить глобальную переменную. В PHP глобальные переменные должны быть продекларированы глобально внутри функции, если предполагается их использование в данной функции. Например:

$a = 1;

$b = 2;

Function Sum () {

global $a, $b;

$b = $a + $b;

}

Sum ();

echo $b;

Поскольку $a и $b декларируются глобально внутри функции, ссылки на данные переменные трактуются как ссылки на их глобальные версии. Нет ограничений на количество глобальных переменных, которыми можно манипулировать внутри функции.

Вторым способом доступа к переменным из глобальной области является использование специального определяемого PHP массива $GLOBALS. При этом предыдущий пример может быть записан так:

$a = 1;

$b = 2;

Function Sum () {

$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];

}

Sum ();

echo $b;

Массив $GLOBALS - ассоциативный массив, в котором имя глобальной переменной служит ключом, а значение этой переменной является значением элемента массива.

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

Function Test () {

$a = 0;

echo $a;

$a++;

}

Эта функция совершенно бесполезна практически, поскольку каждый раз при ее вызове она устанавливает $a в 0 и выводит "0". Выражение $a++, которое увеличивает значение переменной, также бесполезно, поскольку при выходе из функции переменная $a исчезает. Для придания дееспособности функции подсчета, которая не теряла бы нить текущего счета, переменная $a декларируется как статическая:

Function Test () {

static $a = 0;

echo $a;

$a++;

}

Каждый раз при вызове функции Test() она будет выводить значение $a и увеличивать его.

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

Function Test () {

static $count = 0;

$count++;

echo $count;

if ($count < 10) {

Test ();

}

$count-;

}

Переменные окружения. PHP автоматически создает переменные окружения, как и обычные переменные.

echo $HOME;

/* Показывает переменную окружения HOME,

если она установлена. */

Хотя при поступлении информации механизмы GET, POST и Cookie также автоматически создают переменные PHP, иногда лучше явным образом прочитать переменную окружения, для того чтобы быть уверенным в получении ее правильной версии. Для этого может использоваться функция getenv(). Для установки значения переменной окружения используется функция putenv().

Переменные вне PHP. Когда программой-обработчиком формы является PHP-скрипт, переменные этой формы автоматически доступны для данного скрипта PHP. Например, рассмотрим следующую форму:

<form action="foo.php3" method="post">

Name: <input type="text" name="name"><br>

<input type="submit">

</form>

При активизации формы PHP создаст переменную $name, значением которой будет то содержимое, которое было введено в поле Name: данной формы.

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

<form action="array.html" method="post">

Name: <input type="text" name="personal[name]"><br>

Email: <input type="text" name="personal[email]"><br>

Beer: <br>

<select multiple name="beer[]">

<option value="warthog">Warthog

<option value="guinness">Guinness

Если PHP-атрибут track_vars включен через установку конфигурации track_vars или директивой <?php_track_vars?>, тогда переменные, активизированные посредством методов POST или GET, будут также находиться в глобальных ассоциативных массивах $HTTP_POST_VARS и $HTTP_GET_VARS соответственно.

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

<input type=image src="image.gif" name="sub">

Когда пользователь нажимает кнопку мыши в поле такого рисунка, сопровождающая форма передается на сервер с двумя дополнительными переменными sub_x и sub_y. Они содержат координаты места нажатия кнопки мыши пользователем внутри поля данного рисунка. Можно отметить, что практически реальные имена переменных, передаваемые браузером, содержат точку вместо символа подчеркивания, но PHP конвертирует точку в элемент подчеркивания (underscore) автоматически.

Таким образом, язык РНР представляет собой инструмент для создания динамических Web-приложений. РНР обеспечивает поддержку доступа к серверам баз данных с Web-страниц. В частности, РНР работает с MySQL -сервером, который сейчас приобрел большую популярность.

Язык PerlPerl был создан в 1986 г. как инструмент для администрирования и конфигурирования системных ресурсов в сети, состтоящей из Unix-компьютеров. Аббревиатура Perl расшифровывается как практический язык для извлечения текстов и генерации отчетов (Рractical Extraction and Report Language). Этот язык первоначально создан для автоматического формирования отчетов из иерархии файлов системы оповещения об ошибках. Perl является интерпретируемым языком для сканирования текстовых файлов, извлечения из них информации и вывода на основе полученных данных текстовых отчетов. То есть программы Perl используются для выполнения сценариев Perl. Язык Perl является межплатформенным и обеспечивает удобную работу с текстом. Он используется в основном для выполнения рутинных задач, которые, однако, могут быть достаточно трудны или плохо переносимы, а также сложны для кодирования в С или ином используемом в ОС UNIX языке.

Данный язык в определенном плане является универсальным и подобен языку С и рассмотренным выше. Синтаксис и грамматика языка Perl и рассмотренных ранее объектно-ориентированных языков имеют сходство. Основная идея состоит в инкапсулировании данных и программ (называемых методами) в виде объектов. В результате каждый объект становится полуавтономным, приватные (внутренние) данные и методы обосабливаются так, чтобы они не создавали беспорядок в области данных. Объект взаимодействует с остальной частью программы с помощью публичных (доступных для вызова извне) методов. В Perl используются:

    Классы - пакеты, которые могут обеспечивать методы.

    Метод - подпрограмма, встроенная в класс или объект. Метод использует ссылку на объект или имя класса, передаваемое ему в качестве первого аргумента.

    Объект - ссылка на элемент данных. В отличие от других ссылок этот элемент знает, к какому классу он относится.

    Наследование - процесс порождения одного класса (дочернего или порожденного). В результате этого процесса дочерний класс может использовать методы родительского класса.

Эти конструкции являются важной частью языков объектно-ориентированного программирования, и Perl в частности.

Определенные функции языка Perl получили широкое распространение в связи с развитием компьютерной сети Internet. Поэтому при дальнейшем рассмотрении данного языка основное внимание уделим использованию функций Rerl для программирования в области WWW.

Как известно, в основе Web-страниц лежит текст. Web-серверы общаются с браузерами при помощи текстового протокола НТТР (Hypertext Transfer Protocol). Именно текстовая ориентация во многом обеспечила гибкость, широту возможностей и успех WWW. Взаимодействие приложений в Web строится по принципу клиент/сервер. Клиентские браузеры запрашивают документы у Web-серверов - таких, как Apache. Диалог браузера с сервером определяется протоколом НТТР. В основном сервер просто пересылает содержимое некоторого файла, однако иногда Web-сервер запускает другую программу для отправки документа, которая может представлять собой HTML-текст, графическое изображение или иной тип данных. Диалог сервера с программой определяется протоколом CGI (Common Gateway Interface), а запускаемая сервером программа называется CGI-программой или CGI-сценарием.

Сервер сообщает программе CGI, какая Web-страница была затребована, какие значения были переданы в HTML-формах, откуда поступил запрос, какие данные использовались при аутентификации и многое другое. CGI-программа может быть написана на любом из следующих языков: AppleScript, C++, Fortran, PHP, Perl, TCL, Visual Basic, языке командного интерпретатора UNIX (shell) и т.д. Поскольку при создании Web-страниц разработчики имеют дело с текстом, файлами, сетевыми коммуникациями и двоичными файлами, Perl подходит для Web-программирования.

Рассмотрим некоторые принципы Web-программирования на языке Perl. Ниже приведен пример простой CGI-программы:

#!/usr/bin/perl5

print "Content-type: text/html\n\n"

print "<HTML>\n<HEAD>\n<TITLE>Hi</TITLE>\n</HEAD>\n"

print "<BODY>\n<H1>Hi from Perl script!</H1>\n</BODY>\n"

print "</HTML>"

или:

#!/usr/bin/perl5

print <<END_of_Multiple_Text;

Content-type: text/html

<HTML>

<HEAD>

<TITLE>Hi</TITLE>

</HEAD>

<BODY>

<H1>Hi from Perl script!</H1>

</BODY>

</HTML>

END_of_Multiple_Text

Результат выполнения CGI-программы представлен на рис. 7.4Рис. 07.04. Пример визуализации простой программы в окне браузера.

При вызове этой программы она выдает на экран браузера один и тот же текст. В программе используется оператор языка Perl - print. Стоящий после оператора аргумент во втором примере носит название here-document. Он состоит из двух знаков << и слова, которое называют конечной лексемой. Это удобный способ взятия в кавычки строкового значения, занимающего несколько строк. Значение начинается со следующей строки программы и продолжается до строки, содержащей конечную лексему. Here-документы часто используют для создания HTML-документов.

Строка Content-type задает тип генерируемой выходной информации. Наиболее распространенными являются следующие типы:

    Content-type: text/plain - для простого текста;

    Content-type: text/html - для html-документа;

    Content-type: image/gif - для изображения в формате gif.

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

Модуль CGI.pm. Как известно, теги HTMLHTML позволяют создавать экранные формы. В этих формах пользователь вводит значения, передаваемые серверу. Формы состоят из элементов (widgets), например текстовых полей, флажков, кнопок, всплывающих меню. Поскольку правильно реализовать протокол CGI нелегко, рекомендуется использовать модуль CGI.pm, который содержит функции для обработки информации, полученной от сервера, и подготовки ответов, ожидаемых сервером. Программы CGI обычно возвращают HTML-код, поэтому в модуле CGI предусмотрены вспомогательные функции создания любых элементов HTML-страницы (от таблиц до элементов форм). Кроме того, использование модуля CGI.pm позволяет значительно сократить и упростить текст скрипта. Ниже приведен пример рассмотренной выше программы со всеми сокращениями, которые используются в CGI.pm:

#!/usr/bin/perl5

use CGI qw(:standard);

print header();

print start_html("Hi"), h1("Hi from Perl script!");

print end_html();

Вторая строка программы содержит вызов модуля CGI.pm с директивой standard. Это так называемая директива импорта - метка, которая обозначает группу импортируемых функций.

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

    :cgi - Импортировать все методы обработки аргументов, например param().

    :form - Импортировать все методы создания заполняемых форм, например text-field().

    :html2 - Импортировать все методы, которые генерируют стандартные элементы в HTML2.0.

    :html3 - Импортировать все методы, которые генерируют элементы, предложенные в HTML 3.0 (<table>, <super>, <sub>).

    :netscape - Импортировать все методы, которые генерируют расширения HTML, характерные для Netscape.

    :shortcuts - Импортировать все сокращения, генерируемые HTML ("html2" + "html3" + "netscape").

    :standard - Импортировать "стандартные" возможности: "html2", "form", "cgi".

    :all - Импортировать все имеющиеся методы. Полный список приведен в модуле CGI.pm.

В приведенном примере используются следующие функции:

    header() - возвращает строковое значение, содержащее строку Content-type с последующей пустой строкой;

    start_html(строка) - возвращает указанную строку как HTML-титул.

    h1(строка) - возвращает указанную строку как HTML-заголовок первого уровня.

    end_html() - возвращает строку "</BODY></HTML>"

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

#!/usr/bin/perl5

use CGI qw(:standard);

my $name = param("name");

print header();

print start_html("Hi"), h1("Hi from Perl script!");

if ($name) {if ($name eq "Jane") {

print p("Hello, Jane!");

print p("Would you like to look through e-mail today?");

print "<A HREF="http://www.mail.aport.ru/cgi-bin/login?

login = JaneRe passdwd = Revunk">Jane Revunkova's

E-mail</A>"; }

else {

print p("Hello, $name!");

print p("Would you like to get free e-mail today?");

print "<A HREF="http://mail.aport.ru">Free E-mail

Service on Aport.ru</A>"; } }

else

{ print hr, start_form;

print p("Please, enter your name: ", textfield("name",

"anonymus"));

print end_form, hr; }

print end_html();

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

В самом начале определяется переменная $name. Далее генерируются заголовок и начало страницы. Если бы переменная уже была определена, то выполнялась бы первая часть программы (после выражения if ($name)). Однако при вызове страницы значение переменной еще не определено, и поэтому выполняется вторая часть программы: появляется форма с полем ввода для имени пользователя и поставленным по умолчанию именем «anonymus».

Таким образом, если во время работы с браузером щелкнуть на ссылке, которая указывает на описанную выше программу, и если ссылка при этом не содержит в конце URL параметра ?whatever, то на экране появится изображение, представленное на рис. 7.5Рис. 07.05. Пример заполняемой формы.

Дальнейшие действия программы зависят от пользователя. Если в качестве имени будет введено значение "Jane", то после нажатия кнопки Подача запроса страница примет вид, приведенный на рис. 7.6Рис. 07.06. Результат выполнения программы.

В итоге программа поделена на две части. Первая часть отвечает за создание изображения управляющих элементов на форме до того, как определено имя пользователя, а вторая часть отвечает за формирование страницы при определенном имени пользователя. Вторая часть программы может визуализировать два режима, если пользователь - Jane или любой другой человек. В последнем случае в текстовое поле введено значение «John» (рис. 7.7Рис. 07.07. Второй вариант окна приглашения).

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

    textfield("name") - функция позволяет создать поле текстового ввода, причем значение, введенное пользователем в это поле, будет передано браузером Web-серверу в виде переменной с именем name;

    popup_menu("name", ['item1','item2',...'itemN']) - функция служит для создания выпадающего меню, пункты которого перечисляются в квадратных скобках после названия переменной, которой и будет присвоено значение, выбранное пользователем из выпадающего списка;

    submit("name") - создание кнопки передачи, при нажатии которой все данные, введенные пользователем, передаются браузером Web-серверу в виде переменных. Надпись на кнопке определяется параметром name;

    reset("name") - создание кнопки очистки формы, при нажатии которой все данные, введенные пользователем, стираются. Надпись на кнопке определяется параметром namе.

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

#!/usr/bin/perl5

use CGI qw(:standard);

my $name = param("name");

print header();

print start_html("Отдел распределения издательства "Открытые системы"), h1("Добpый день!"), h3("Вас пpиветствует компания Открытые системы.");

print p(hr);

if ($name) {

print p("Hello, $name!");

if ($name eq 'Открытые системы')

{ my $cost = 35;}

if ($name eq 'Сети')

{ my $cost = 35;}

if ($name eq 'СУБД')

{ my $cost = 25;}

if ($name eq 'Мир ПК')

{ my $cost = 55;}

if ($num > 0 $num < 10)

{ my $koef = 1;}

if ($num > 9 $num < 100)

{ my $koef = 0.9;}

if ($num > 99)

{ my $koef = 0.5;}

my $allcost = sprintf("%.2f", $koef*$cost*$num);

print p("Журнал $name в количестве $num экземпляров можно приобрести по цене $allcost"), hr;

}

else

{ print h4("Заказ журналов"), start_form;

print p("Название журнала :", popup_menu ("name",['Открытые системы', 'Сети', 'СУБД', 'Мир ПК']));

print p("Количество экземпляров :", textfield ("num"));

print p(submit("Заказать"),reset("Отменить"));

print end_form, hr; }

print end_html();

В результате работы этой программы в окне браузера визуализируется страница, представленная на рис. 7.8Рис. 07.08. Страница заказа журнала.

После нажатия кнопки Заказать, при условии, что поля формы будут заполнены, визуализируется сообщение о стоимости заказа. Для того чтобы проверить, все ли поля формы были заполнены, вместо $name в первое условие вставляют вызов функции param(), так как при вызове ее без аргументов функция возвращает имена всех полей, которые были заполнены. Если поля не будут заполнены полностью, пользователь возвратится в форму с полями ввода с расчетом на вторичный вызов программы.

Таким образом, с помощью языка Perl cоздаются CGI-программы, которые при своем выполнении генерируют HTML-коды. Эти коды воспринимаются браузерами и Web-серверами. В качестве альтернативы рассмотренному подходу предлагается Perl-программы непосредственно встраивать в Web-страницы в виде скриптов. Сообщается, что специально для написания скриптов был предложен язык PerlScript. Некоторые браузеры способны выполнять его (Microsoft Internet ExplorerInternet Explorer). PerlScript-программу можно внедрять в Web-страницу. PerlScript позволяет создавать формы, гиперссылки, маркированные списки, текстовые поля, кнопки с независимой и зависимой фиксацией, работать со скрытыми полями данных и т.д.

Язык VRMLVRML был задуман весной 1994 г. на первой ежегодной конференции World Wide Web в Женеве. Здесь в числе прочих обсуждались проблемы создания VR-интерфейсов для доступа к WWW и необходимость создания единого общего стандарта описания трехмерной сцены, включающей гиперсвязи по аналогии с HTMLHTML. Основными требованиями к языку являлись независимость от платформы, расширяемость и возможность работы по низкоскоростным каналам связи. Там же было предложено название VRML (Virtual Reality Markup Language). Впоследствии слово Markup было заменено словом Modeling, что отражает графическую природу языка. В качестве базы языка VRML был выбран урезанный формат текстового файла SGI Open Inventor, дополненный сетевыми возможностями. Формат Open Inventor позволял описать трехмерную сцену с графическими объектами, источниками света и текстурами.

В 1995 г. были разработаны библиотеки QvLib для обработки структуры файла VRML и подготовлена спецификация, допускающая представление трехмерных сцен и перемещение с одной сцены на другую (или любой другой документ WWW) при помощи использования гиперсвязей.

Поскольку первая версия языка была несовершенной, многие фирмы стали вводить собственные расширения в этот язык. Autodesk создает VRBL (Virtual Reality Behavior Language), WebFX - Сollision detection, Worlds Inc. - VRML+.

Была создана промежуточная версия VRML 1.1, в которой заложены основания для реализации простейшей анимации и звука.

В 1996 г. была предложена спецификация VRML 2.0, позволившая производить более быструю обработку VRML-файла и расширить функциональные возможности языка VRML. Появилась возможность задавать графический фон для сцены и использовать различные эффекты. В сцену был включен звуковой фон, в том числе и от пространственных источников звука (стандартная WAVE и MIDI-музыка).

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

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

Спецификация языка позволила разработчику использовать различные языки программирования (JavaJava, JavaScriptJavaScript и т.д.). Открытость и расширяемость в сочетании с возможностью сетевого взаимодействия языка VRML 2.0 подготовили почву для создания интерактивных VRML-миров в Internet.

В конце 1996 г. 35 компаний Internet-лидеров сформировали организацию VRML Consortium, нацеленную на развитие и формализацию VRML. Эта организация представила VRML как открытый стандарт для создания интерактивного 3D-содержания в World Wide Web.

Предложенный язык VRML 97VRML 97 в январе 1998 г. ISO (International Organization for Standardization) и IEC (International Electrotechnical Commission) был утвержден в качестве международного стандарта. Перед разработчиками был поставлен ряд задач:

  • создание специального формата и упрощение структуры VRML-файлов с целью уменьшения размера и увеличения скорости передачи этих файлов по сети;

  • создание интерфейса (External Authoring Interface) между VRML-мирами и внешними средами;

  • создание VRML-стандартов для анимированных персонажей и т.д.

VRML-компании, разрабатывающие средства создания 3D Web-миров, объединились в консорциум Web3D. На начало 1999 г. он включал более 60 организаций, связанных с 3D-графикой и заинтересованных в продвижении стандартов трехмерного Internet.

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

Язык VRML создавался как независимый от HTMLHTML, и для передачи файлов по Internet в нем предусмотрены те же самые протоколы. Поэтому концепции Internet и Web применимы и к VRML. Просмотр VRML-документов возможен с помощью VRML-браузера или HTML-браузера с дополнительным VRML-модулем. Унифицированный указатель ресурсов URL для VRML-документа выглядит так же, как указатель для Web-публикации, за исключением расширения. Для Web-документа используются расширения *.htm или *.html, а для VRML-документа - *.wrl, *.wrz или *.Flr.

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

Для сценариев VRML подходит язык JavaScriptJavaScript, но для узла сценария допускается применение и обычных языков программирования. Сценарии для миров VRML чаще всего составляются на языке JavaJava. Разработчики VRML предпочитают язык Java, потому что этот язык программирования ориентирован на InternetInternet. Большинство поставщиков VRML-продуктов включают в свои комплекты браузеры для работы с Java.

VRMLScriptVRMLScript - подмножество языка JavaScript, которое предусматривает непосредственно спецификация VRML 2.0. Хотя язык VRMLScript не пользуется такой широкой популярностью, как JavaScript, он достаточно полезен, в особенности потому, что предназначен специально для миров VRML.

Как и Web-страницы, миры VRML можно связывать друг с другом при помощи гиперсвязей. Эти связи предоставляют возможность перемещаться по WWW из «одного мира в другой».

В основе языка VRML лежат три основных понятия: форма, сцена и объект.

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

Сценой называется создаваемое трехмерное пространство. Любая сцена может включать две различные части: «статическую» и «мобильную». Статическая часть сцены образуется добавлением объемных фигур из галереи форм или удалением частей объема уже имеющихся в сцене фигур при операциях вычитания форм. Эта часть сцены представляется в виде набора отдельных граней, причем каждая грань принадлежит самой сцене, а не какому-либо телу в ней. Поэтому никакие фрагменты статической части сцены не могут быть перемещены или изменены в размерах независимо от других. Передвижение или деформирование всего виртуального мира целиком также не допускается программой (в полном соответствии с законами реального мира).

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

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

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

Каждая грань объекта в виртуальном мире имеет набор свойств, описывающих ее материал:

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

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

Прозрачность. Можно установить коэффициент прозрачности материала грани. Например, если прозрачность материала 50%, то грань станет полупрозрачной и в окне будут видны как ее материал, так и предметы, расположенные позади нее. Установка параметра прозрачности в 100% сделает грань невидимой. Подбором прозрачности грани можно имитировать стеклянные поверхности и другие элементы сцены.

Объекты, описываемые VRML-программой, называются узлами (nodes). При создании трехмерных объектов можно использовать встроенные узлы, такие, как конусы, цилиндры, кубы и сферы. Описав форму объекта, задают текстуру, освещенность, положение камеры и трансформацию объектов. Узлы также могут представлять собой программные блоки, а не пространственные объекты. Средства программирования поведения и отслеживания событий - это основные компоненты, которые делают миры VRML интерактивными. Возможно перемещение в трехмерном мире Web, представленном в VRML-браузере, с помощью визуальных средств управления (изображений-указателей направления), которые приводятся в действие с помощью мыши или клавиатуры. В некоторых браузерах возможно применение джойстиков для управления. При приближении к узлу с запрограммированным поведением он «оживает», используя методы анимации. Анимированный узел передает сведения о событии другому узлу. Узел, которому передано сообщение о событии, обрабатывает его. Такой узел называют «обработчиком событий» (event handler).

Чтобы обработчик событий смог выполнить свою задачу, он должен иметь доступ к системному времени. Для того чтобы синхронизировать время в мире VRML, используется датчик времени - особый тип узла. Указав промежутки времени, можно запрограммировать скорость изменения относительного положения объекта и тем самым «оживить» объект.

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

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

Особенности VRML

Язык VRML (Virtual Reality Modeling Language) предназначен для описания трехмерных изображений и оперирует с формами, сценами и объектами, описывающими геометрические фигуры и их расположение в пространстве.

VRML-файл представляет собой обычный текстовой файл, интерпретируемый браузером. Поскольку большинство браузеров не имеет встроенных средств поддержки Vrml, для просмотра Vrml-документов может использоваться вспомогательная программа - Vrml-браузер, например Live3D или Cosmo Player.

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

В VRML используется трехмерная декартова система координат.

Заголовок VRML-файла. VRML-документ представляет собой обычный текстовой файл. Для того чтобы VRML-браузер распознал файл с VRML-кодом, в начале файла ставится специальный заголовок - file header:

#VRML V97 ascii

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

Примитивы VRML. В VRML объекты создаются с помощью базовых примитивов: куб (прямоугольный параллелепипед), сфера, цилиндр, конус и т.д. Набор примитивов невелик, однако, комбинируя их, можно строить достаточно сложные трехмерные изображения. Рассмотрим некоторые из этих примитивов.

Куб. Возможные атрибуты (параметры): ширина (width), высота (height), глубина (depth).

Cube {

width 2 # ширина

height 3 # высота

depth 1 # глубина

}

Сфера. Атрибут сферы только один, это радиус (radius).

Sphere {

radius 1 # радиус

}

Конус. Возможные параметры: радиус основания (bottomRadius), высота (height), видимые части конуса (parts). Параметр parts может принимать значения ALL, SIDES или BOTTOM.

Cone {

parts ALL #видны и основание, и боковая поверхность конуса

bottomRadius 1 #радиус основания

height 2 #высота

}

Цилиндр. Для цилиндра можно задать атрибуты радиус (radius) и высота (height). Кроме того, с помощью параметра parts для цилиндра можно определить, будут ли отображаться основания цилиндра и его боковая поверхность. Параметр parts может принимать значения ALL, SIDES, BOTTOM или TOP.

Cylinder {

parts ALL #видны все части цилиндра

radius 1 #радиус основания

height 2 #высота цилиндра

}

Цвет и текстура. Цвет фигуры определяется с помощью объекта материал (Material).

Material {

ambientColor 0.2 0.2 0.2

diffuseColor 0.8 0.8 0.8

specularColor 0 0 0

emissiveColor 0 0 0

transparency 0

}

Параметры ambientColor, diffuseColor, specularColor и emissiveColor управляют цветами и указываются в базовых цветах RGB-модели (красный, зеленый и синий). Причем первая цифра определяет интенсивность красного цвета, вторая - зеленого, а третья - синего.

Например, куб синего цвета может быть описан следующим образом:

#VRML V97 ascii

Material {

diffuseColor 0 0 1

}

Cube {}

Параметр прозрачность (transparency) определяет степень прозрачности материала и может принимать значения от 0 до1. Причем максимальная прозрачность достигается при значении, равном единице. Ниже приведен пример с описанием двух цилиндров разных размеров, меньший из которых просвечивает сквозь другой:

#VRML V1.0 ascii

Material {

diffuseColor 0 0 1

transparency 0.7

}

Cylinder {

height 1

radius 1

}

Material {

emissiveColor 1 0 0

transparency 0

}

Cylinder {

height 0.8

radius 0.1

}

Для имитирования различных поверхностей в VRML существует объект Texture2.

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

#VRML V97 ascii

Texture2 {

filename «krp.gif»

image 0 0 0

wrapS REPEAT

wrapT REPEAT

}

Cube {

width 1

height 1

depth 1

}

Параметры wrapS и wrapT могут принимать значения REPEAT или CLAMP. Они управляют «натягиванием» текстуры по горизонтальной и вертикальной осям соответственно.

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

Translation {

translation 1 2 3 #т.е. соответственно x=1 y=2 z=3

}

Координаты, указываемые в Translation, не являются абсолютными. Фактически это координаты относительно предыдущего узла Translation. Поясним это на примере:

#VRML V1.0 ascii

Cube {

width 1

height 1

depth 1

}

# Этот куб по умолчанию располагается в центре

Translation {

translation 2 0 0

}

#Второй куб сдвинут вправо на 2

Cube {

width 1

height 1

depth 1

}

Translation {

translation 2 0 0

}

#Третий куб сдвинут вправо на два относительно 2-го!!!!

Cube {

width 1

height 1

depth 1

}

Третий куб не совпадает с первым, хотя в узле Translation указаны те же координаты.

В VRML принято следующее правило: узлы, модифицирующие свойства примитивов (Translation, Material и т.п.), действуют на все далее описанные примитивы. Чтобы ограничить область действия модифицирующих узлов, примитивы необходимо сгруппировать с помощью узла Separator.

Separator

{

другие узлы

}

Узел Separator работает как контейнер. Он может содержать любые другие узлы, и основным его предназначением является именно ограничение области действия узлов типа Translation и Material. Пример:

#VRML V1.0 ascii

Separator {

Cube {

width 1

height 1

depth 1

}

}# конец области действия узла Separator

Separator {

Translation {

translation 2 0 0

}

#Второй куб сдвинут вправо на 2

Cube {

width 1

height 1

depth 1

}

}# конец области действия узла Separator

Separator {

Translation {

translation 2 0 0

}

#Третий куб сдвинут вправо на два относительно 1-го.

Cube {

width 1

height 1

depth 1

}

}# конец области действия узла Separator

Хотя в примере описано три куба, видно только два, так как второй и третий совпадают.

Рекомендуется использовать узел Separator. Он не только избавит от ошибок, связанных с относительностью координат, но и сделает VRML-код более простым и понятным.

Вращение примитивов. Для вращения примитивов вокруг осей координат применяется узел Rotation.

Rotation {

rotation 0 1 0 1.57

}

Первые три цифры определяют, будет ли осуществлен поворот вокруг осей x, y и z соответственно, а четвертая задает угол вращения в радианах. В приведенном выше примере поворот осуществляется вокруг оси y на 90°.

Масштабирование. Узел Scale масштабирует фигуры по одному или нескольким измерениям. Три цифры, стоящие после параметра scaleFactor, определяют коэффициенты масштабирования относительно осей x, y и z.

Scale {

scaleFactor 1 1 1

}

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

Объект описывается одним из следующих способов:

DEF name

Cube {}

DEF name

Material {}

DEF name

Separator {

Сгруппированные узлы, описывающие фигуру и свойства материала

}

Для того чтобы вставить в VRML-файл ранее определенную фигуру, используется команда USE

Separator {

USE name

}

Рассмотрим пример создания VRML-файла, описывающего объект стул. При этом ножку стула опишем как объект LEG:

#VRML V1.0 ascii

Material { emissiveColor 1 0.5 0.5 }

Separator {

Translation { translation 1 1 1 }

DEF LEG #Определяем объект - ножку стула

Separator { # leg

Cylinder {

height 0.8

radius 0.1

}

} # определили ножку

}

Separator {

Translation { translation 0 1 1 }

USE LEG # используем определенный объект

}

Separator { # еще одна ножка

Translation { translation 1 1 0 }

USE LEG

}

Separator { # последняя ножка

Translation { translation 0 1 0 }

USE LEG

}

Separator { # сиденье

Translation { translation 0.49 1.5 0.5 }

Cube {

height 0.2

width 1.2

depth 1.2

}

}

Separator { # спинка

Translation { translation 0.49 2 0 }

Cube {

height 0.8

width 1.2

depth 0.2

}

}

Separator { # закругление спинки

Translation { translation 0.49 2.1 0 }

Rotation {

rotation 1 0 0 1.57

}

Cylinder {

radius 0.6

height 0.2

}

}

Как видно из примера, здесь не пришлось описывать каждую ножку в отдельности. В результате объем VRML-кода стал меньше.

Еще один способ уменьшения размеров VRML-файлов: вставлять фигуры из других файлов. Это позволяет создать узел WWWInline:

#VRML V1.0 ascii

Separator {

WWWInline {

name «»

bboxSize 0 0 0

bboxCenter 0 0 0

}

}

Параметр name - это путь к файлу, параметры bboxSize и bboxCenter не обязательны и показывают пользователю размеры и положение вставляемого объекта, пока объект подгружается.

Следует обратить внимание на две особенности VRML, незнание которых затруднит создание VRML-документов вручную.

Все описания узлов и параметров в VRML регистрозависимы. Если использовать буквы неправильного регистра, то VRML-браузер проигнорирует такое описание.

В VRML имеет огромное значение порядок описания узлов.

Просмотр трехмерных файлов VRML. VRML-файлы могут просматриваться непосредственно в Web-браузерах, которые теперь снабжаются модулями расширения для VRML. Браузер Navigator компании Netscape поставляется вместе с модулем Live3D, а в Internet Explorer входит модуль VRML Support. При помощи этих модулей можно просматривать VRML-файлы (версии 2.0), не устанавливая дополнительное программное обеспечение.

Наряду с этим имеются специальные браузеры, ориентированные на работу с VRML-файлами. Так, для WindowsWindows (и Windows NTWindows NT) существует около двадцати VRML-браузеров.

Рассмотреть все возможности языков разметки гипертекста, создания апплетов, скриптов и сценариев трехмерной графики не представляется возможным. Тем не менее даже из приведенного выше краткого анализа особенностей и функциональных возможностей программных языков, используемых в World Wide WebWWW, видно, каким большим шагом вперед стало их внедрение в технологии создания Web-страниц.

Языки программирования апплетов, скриптов и сценариев существенно расширяют возможности Web-разработчиков во всем, что касается управления и интерактивного взаимодействия с динамическими Web-страницами, а также их оформления. Языки JavaJava, JavaScriptJavaScript, PHP, Perl и язык моделирования виртуальной реальности VRML открывают новые горизонты в использовании технологий Мультимедиамультимедиа в электронных изданиях различного типа.

© Центр дистанционного образования МГУП