Вы находитесь на странице: 1из 1263

ПРОГРАММИРОВАНИЕ

для WEB
Библиотека профессионала
WEB
PROGRAMMING

MARTY HALL
LARRY BROWN

Prentk» Hall PTR, Upper Saddle River, N J 07458 Sun Microsystems Press
www.phptr.com A Prentice Hall Title
ПРОГРАММИРОВАНИЕ
для WEB
Б и б л и о т е к а профессионала

МАРТИ ХОЛЛ
ЛЭРРИ БРАУН

Москва • Санкт-Петербург • Киев


2002
ББК 32.973.26-018.2.75
Х72
УДК 681.3.07

Издательский дом "Вильяме"


Зав. редакцией С.Н. Тригуб

Перевод с английского и редакция В.В. Вейшмана

По общим вопросам обращайтесь в Издательский дом "Вильяме"


по адресу: info@williamspublishing.com, http://www.williamspublishing.com

Холл, Марти, Браун, Лэрри.


Х72 Программирование для Web. Библиотека профессионала.: Пер. с англ. —
М.: Издательский дом "Вильяме", 2002. — 1264 с.: ил. — Парал. тит. англ.
ISBN 5-8459-0237-1 (рус.)
В данной книге читатель найдет все необходимые сведения, позволяющие
создавать Web-страницы, включать в них исполняемый код, а также реализовать
программы, выполняющиеся на стороне сервера. В ней достаточно полно описа­
ны языковые конструкции, соответствующие спецификации HTML 4.0, приведе­
ны подробные сведения о языке Java, рассматривается создание сервлетов nJSP,
обработка XML-документов^ построение программ, выцолняющихся на стороне
клиента (аплетов иJavaScript-cцeнapиeв), и многие другие вопросы.

ББК 32.973.26-018.2.75
Все названия программных продуктов являются зарегистрированными торговыми марками со­
ответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы
то ни было форме и какими бы то ни было средствами, будь то электронные или механические,
включая фотокопирование и запись на магнитный носитель, если на это нет письменного разреше­
ния издательства Prentice Hall PTR.

Authoiized ti-anslation fiom the English language edition published by Prentice Hall PTR.
Copyiight © Sun Microsystem, Inc., 2001. All rights reseiTed. No pait of this book may be reproduced or
ti^ansmitted in any foiin or by any means, electionic or mechanical, including photocopying, recording or by any
infonnation storage retiieval system, without peiTnission from the Publisher.
Russian language edition published by Williams Publishing House according to the Agieement with
RM Enterprises International, Copyiight © 2002

ISBN 5-8459-0237-1 (рус.) © Издательский дом "Вильяме", 2001


ISBN 0-13-089793-0 (англ.) © Sun Microsystem, Inc., 2001
Оглавление

Оглавление

Введение 25

ЧАСТЬ I. ЯЗЫК HTML 33


Глава 1. Создание web-страниц с помощью HTML 4.0 34
Глава 2. Элементы блокового уровня HTML 4.0 54
Глава 3. Элементы текстового уровня HTML 4.0 82
Глава 4. Фреймы 110
Глава 5. Каскадные листы стилей 136

ЧАСТЬ П . П Р О Г Р А М М И Р О В А Н И Е Н А Я З Ы К Е JAVA 177


Глава 6. Общие сведения о языке Java 178
Глава 7. Объектно-ориентированное программирование на Java 206
Глава 8. Синтаксис Java 252
Глава 9. Аплеты и основные действия с графикой 310
Глава 10. Java 2d; графика в Java 2 358
Глава 11. События, связанные с мышью и клавиатурой 394
Глава 12. Диспетчеры компоновки 418
Глава 13. Компоненты awt 454
Глава 14. Основы Swing 542
Глава 15. Расширенные средства Swing 602
Глава 16. Использование потоков 664
Глава 17. Сетевое программирование 718

Ч А С Т Ь III. П Р О Г Р А М М Ы , В Ы П О Л Н Я Ю Щ И Е С Я
Н А СТОРОНЕ СЕРВЕРА 779
Глава 18. HTML-формы 780
Глава 19. Java на стороне сервера: сервлеты 816
Глава 20. JavaServer Pages 900
Глава 21. Аплеты как интерфейс к программам на стороне сервера 990
Глава 22. JDBC 1016
Глава 23. Обработка XML-документов 1050

Ч А С Т Ь rv^, J A V A S C R I P T 1099
Глава 24. JavaScript: динамически изменяющиеся Web-страницы 1100
Глава 25. Краткое руководство по JavaScript 1172
Предметный указатель 1254
в Содержание

Содержание

Введение 25

ЧАСТЬ 1. ЯЗЫК HTML 33


Глава 1. Создание web-страниц с помощью HTML 4.0 34
1.1. HyperText Markup Language 35
1.2. HTML 4.0 и другие стандарты HTML 37
1.3. Порядок публикации документа в Web 38
Создание документа 38
Размещение документа в Web 39
Проверка документа 41
1.4. Структура HTML-документа 41
Шаблон HTML-документа 42
Декларация DOCTYPE 43
1.5. Элемент HEAD — высокоуровневая информация.., 45
Обязательный элемент в составе HEAD 45
Необязательные элементы в составе HEAD 46
1.6. BODY -- основная часть документа 50
Глава 2. Элементы блокового уровня HTML 4.0 54
2.1. Заголовки 56
2.2. Основные элементы... 58
Основной абзац 58
Абзацы с сохранением пробелов 59
Цитирование с отступом 60
Адрес 61
2.3. Нумерованные, маркированные списки... 61
Нумерованные списки 61
Маркированные списки 64
Списки определений 65
2.4. Таблицы 66
Структура таблицы 66
Определение строк таблицы 71
Ячейки заголовков и ячейки данных 73
Группировка содержимого таблицы 75
2.5. Формы 78
2.6. Прочие элементы блокового уровня 78
Глава 3. Элементы текстового уровня HTML 4.0 82
3.1. Физические стили отображения символов 83
3.2. Логические стили отображения символов 88
3.3. Построение гипертекстовых ссылок 90
3.4. Встроенные изображения 94
Содержание

Анимационные GIF-файлы 94
Элемент IMG 94
3.5. Карты изображений на стороне клиента 98
3.6. Включение объектов в документ 101
Встроенные аплеты 101
Встроенные аудио- и видеофрагменты, а также объекты
в других форматах 104
Управляющие элементы ActiveX 104
Бегущая строка 106
3.7. Управление переводом строк 108
Глава 4. Фреймы 110
4.1. Шаблон документа с фреймами 112
4.2. Разбиение окна броузера на фреймы 113
4.3. Определение содержимого фреймов 118
Примеры 120
4.4. Определение фрейма ддя отображения документа 122
Зарезервированные имена фреймов 124
4.5. Разрешение типичных проблем... 125
Создание закладок для фреймов 125
Вывод фреймов на печать 126
Одновременное обновление нескольких фреймов 126
Запрет вывода документа в составе фрейма 129
Создание пустого фрейма 130
4.6. Встроенные фреймы 130
Глава 5. Каскадные листы стилей 136
5.1. Правила стилей 138
5.2. Внешние и локальные листы стилей 140
Внешние листы стилей 140
Элемент STYLE и листы стилей JavaScript 142
Встроенные правила стилей 142
5.3. Селекторы 143
HTML-элементы 143
Классы, определяемые пользователем 144
Идентификаторы, определяемые пользователем 145
Псевдоклассы якоря 146
5.4. Предшествование правил 146
5.5. Свойства шрифтов 147
5.6. Свойства для определения фона и переднего плана 153
5.7. Текстовые свойства 156
5.8. Свойства блоков с обрамлением 159
Границы 160
Обрамление 160
Заполненная область 162
Типы отображения блока 163
5.9. Изображения и плавающие элементы 163
5.10. Свойства списков 165
8 Содержание

5.11. Стандартные единицы для определения значений свойств 166


Единицы длины 166
Цвет 167
5.12. Слои 167
Определение слоев с помощью элементов LAYER и ILAYER 168
Работа со слоями посредством листов стилей 172
5.13. Резюме 176

Ч А С Т Ь П . П Р О Г Р А М М И Р О В А Н И Е Н А Я З Ы К Е JAVA 177
Глава 6. О б щ и е с в е д е н и я о я з ы к е Java 178
6.1. Возможности Java 180
Средства сетевого взаимодействия и работа в Web 180
Кроссплатформенная поддержка Java 183
П р о с т о т а Java 186
Объектно-ориентированные средства Java 186
Стандартные библиотеки Java 187
6.2. Java: м и ф ы и реальность 188
Java предназначен исключительно для Web 189
Кроссплатформенная поддержка Java 189
Простота Java 190
Java — объектно-ориентированный язык (для тех,
кто придерживается соответствующего подхода) 191
Java — язык для разработки различных типов программ 191
6.3. Версии Java 192
Какой версии отдать предпочтение 193
О с н о в н ы е сведения о Java 194
6.4. Начинаем работу 194
Установка Java 195
Инсталляция броузера с поддержкой Java 196
Доступ к документации по Java API 196
Установка интегрированного пакета разработки
(необязательное действие) 197
Создание и запуск Java-программы 198
6.5. Несколько простых Java-программ 198
П р и л о ж е н и е Hello, World 199
П а р а м е т р ы командной строки 199
Аплет Hello, World 200
Параметры, передаваемые аплету 202
Глава 7. О б ъ е к т н о - о р и е н т и р о в а н н о е п р о г р а м м и р о в а н и е на Java 206
7.1. П е р е м е н н ы е экземпляра 207
7.2. Методы 210
7.3. Конструкторы и ссылка this 211
Статические инициализационные блоки 214
7.4. Деструкторы 214
7.5. Переопределение 215
7.6. Подготовка классов к повторному использованию 218
Содержание 9

7.7.Javadoc 223
Дескрипторы javadoc 224
Параметры командной строки javadoc 227
7.8. Наследование 230
7.9. Интерфейсы и абстрактные классы 233
7.10. Пакеты, CLASSPATH и JAR-архивы 242
Переменная окружения CLASSPATH 245
7.11. Модификаторы 247
Модификаторы области видимости 248
Прочие модификаторы 249
Глава 8. Синтаксис Java 252
8.1. Синтаксические правила 253
8.2. Простые типы 255
Преобразование простых типов 257
8.3. Операторы, условные операторы и циклы 258
Арифметические операторы 258
Условные операторы 259
Циклы 265
8.4. Класс Math 268
Константы 268
Методы общего назначения 268
- Тригонометрические методы 270
Biglnteger и BigDecimal 270
8.5. Ввод и вывод 271
Вывод в стандартный выходной поток 272
Вывод в стандартный поток ошибок 273
Чтение из стандартного входного потока 274
8.6. Выполнение программ, отличных от Java 274
8.7. Ссылки 280
Соглашения по передаче параметров 282
Оператор instanceof 283
8.8. Работа со строками 284
Методы класса String 285
Конструкторы 290
8.9. Массивы 291
Создание массива в два этапа 292
Создание массива в один этап 292
Многомерные массивы 294
8.10. Векторы 295
Конструкторы 295
Методы 295
8.11. Пример создания простого бинарного дерева 297
8.12. Исключения 302
Обработка исключения 302
Использование нескольких блоков catch 304
Выражение finally 305
10 Содержание

Использование ключевого слова throws и явная генерация


исключений 306
Необрабатываемые исключения 307
Глава 9. Аплеты и основные действия с графикой 310
9.1. Что такое аплеты 311
9.2. Создание аплета 312
Шаблон аплета 312
Шаблон HTML-файла 313
9.3. Пример аплета 314
Автоматическое обновление информации в окне аплета 316
Повторная загрузка аплета в процессе разработки 316
Отображение данных, выведенных в стандартный выходной поток 317
9.4. Жизненный цикл аплета 318
9.5. Прочие методы аплета 319
9.6. Элемент APPLET 325
9.7. Чтение параметров 327
Пример чтения параметров аплетом 328
9.8. HTML-элемент OBJECT 330
9.9. JaVa Plug-In 332
9.10. Графические приложения 334
9.11. Графические операции 335
Операции рисования 336
Работа с цветом и со шрифтом 339
Режимы рисования 339
Координаты и области отсечения 340
9.12. Вывод изображений 340
Загрузка аплетом изображений, заданных с помощью
относительного URL 341
Загрузка аплетом изображений, заданных
с помощью абсолютного URL 343
Загрузка изображений приложениями 345
9.13. Предварительная загрузка изображений 347
9. J4. Управление загрузкой изображений... 351
9.15. Резюме 357
Глава 10. Java 2d: графика в Java 2 358
10.1. Общие сведения о Java 2D 360
Методы класса Graphics2D 362
10.2. Отображение форм 365
Классы Shape 366
10.3. Стили рисования 370
Классы рисования 370
Заполнение контура изображением 373
10.4. Рисование прозрачных форм 376
10.5. Использование локальных шрифтов 378
10.6. Стили пера 381
Атрибуты пера 381
Содержание 11

10.7. Преобразование координат 386


Н е л и н е й н о е масштабирование 389
10.8. П р о ч и е возможности Java 2D 390
Глава 11. С о б ы т и я , с в я з а н н ы е с м ы ш ь ю и клавиатурой 394
11.1. Поддержка событий... 396
Отображение кругов 397
11.2. Поддержка событий путем... 399
11.3. Обработка событий с помощью... 400
11.4. Обработка событий с помощью... 402
11.5. Стандартные обработчики событий 403
11.6. Низкоуровневая обработка событий 409
11.7. Поле редактирования с проверкой о р ф о г р а ф и и 412
11.8. "Чертежная доска" 414
М о д и ф и ц и р о в а н н ы й вариант "чертежной доски" 416
11.9. Резюме 417
Глава 12. Д и с п е т ч е р ы к о м п о н о в к и 418
12. 1. Д и с п е т ч е р компоновки FlowLayout 420
Конструкторы FlowLayout 421
Методы FlowLayout 421
12.2. Д и с п е т ч е р компоновки BorderLayout 422
Конструкторы BorderLayout 424
Методы BorderLayout 424
12.3. Д и с п е т ч е р компоновки GridLayout 425
Конструкторы GridLayout 425
Методы GridLayout 427
12.4. Д и с п е т ч е р компоновки CardLayout 427
Конструкторы CardLayout 431
Методы CardLayout 431
12.5. Д и с п е т ч е р компоновки GridBagLayout 432
Объект GridBagConstraints 433
П р и м е р использования GridBagLayout 434
Конструктор GridBagLayout 438
Методы GridBagLayout 438
12.6. Д и с п е т ч е р компоновки BoxLayout 439
Конструктор BoxLayout 442
Методы BoxLayout 442
12.7. Размещение компонентов вручную 443
12.8. Э ф ф е к т и в н о е использование диспетчеров компоновки 444
Использование вложенных контейнеров 445
Отключение диспетчеров компоновки для некоторых контейнеров 448
Резервирование пустого пространства вокруг компонентов 449
Глава 13. К о м п о н е н т ы awt 454
13.1. Класс Canvas 456
Создание и использование объектов Canvas 457
П р и м е р компонента, созданного с помощью Canvas 457
12 Содержание

13.2. Класс C o m p o n e n t 460


13.3. "Легковесные" компоненты в Java 1.1 466
13.4. Класс Panel 469
Диспетчер компоновки по умолчанию: FlowLayout 469
Создание и использование панелей 470
П р и м е р использования Panel для группировки компонентов 470
13.5. Класс Container 472
13.6. Класс Applet 474
13.7. Класс ScrollPane 474
Создание и использование ScrollPane 474
П р и м е р объекта ScrollPane, включающего панель,
которая содержит 100 кнопок 474
13.8. Класс Frame 475
Диспетчер компоновки по умолчанию: BorderLayout 476
Создание и использование объектов Frame 476
Примеры использования объектов Frame 477
Закрытие окон Frame 479
Меню 480
Методы класса Frame 481
13.9. Сериализация окон 482
Запись окна на диск 483
Чтение окна с диска 483
П р и м е р окна Frame, допускающего сохранение на диске 484
13.10. Класс Dialog 486
Создание и использование окна Dialog 487
П р и м е р диалогового окна: подтверждение завершения программы 487
13.11. Класс FileDialog 489
П р и м е р отобрг1жения файлов с помощью компонента TextAiea 489
13.12. Класс Window 491
Диспетчер компоновки по умолчанию: BorderLayout 491
Создание и использование объекта Window 491
13.13. Обработка событий управляющих элементов 492
Децентрализованная обработка событий 493
Централизованная обработка событий 495
13.14. Класс Button 496
Конструкторы 496
П р и м е р аплета с тремя кнопками 497
Методы класса Button 498
Поддержка действий с кнопками 498
13.15. Класс Checkbox 501
Конструкторы 501
П р и м е р создания флгьжков опций 502
Методы Checkbox 503
Поддержка событий Checkbox 503
13.16. Переключатели опций 504
Конструкторы 504
П р и м е р использования флажков и переключателей опций 505
Содержание 13

Методы классов CheckboxGroup и Checkbox 506


Поддержка событий CheckboxGroup 506
13.17. Элемент Choice 507
Конструктор 507
П р и м е р раскрывающегося списка 507
Методы класса Choice 508
Поддержка событий, связанных с объектом Choice 509
13.18. Элемент List 510
Конструкторы 511
П р и м е р ы элементов List 511
Методы класса List 512
Поддержка событий элемента List 514
13.19. Класс TextField 518
Конструкторы 519
П р и м е р создания полей редактирования 519
Методы TextField 520
Методы класса TextComponent 520
Обработка событий, связанных с элементом TextField 523
13.20. Класс TextArea 523
Конструкторы 523
П р и м е р ы текстовых областей 524
Методы классаTextAiea 525
Поддержка событий TextArea 526
13.21. Класс Label 526
Конструкторы 526
П р и м е р использования объектов Label 527
Методы класса Label 527
Поддержка событий Label 528
13.22. Полосы прокрутки и л и н е й н ы е регуляторы 530
Конструкторы 530
П р и м е р ы линейных регуляторов 531
Методы Scrollbar 532
Поддержка событий Scrollbar 534
13.23. Контекстные меню 535
Конструкторы 536
П р и м е р использования раскрывающегося меню 536
Методы класса P o p u p M e n u 538
Поддержка событий, связанных с раскрывающимися меню 539
Глава 14. О с н о в ы Swing 542
14.1. Общие сведения о Swing 544
Различия между Swing и AWT 544
14.2. Компонент JApplet 552
14.3. Компонент J F r a m e 553
14.4. Компонент JLabel 555
Новые средства: изображения, рамки и HTML-содержимое 555
Конструкторы JLabel 556
14 Содержание

Методы JLabel 557


14.5. Компонент JButton 559
Н о в ы е возможности: пиктограммы, выравнивание
и "горячие клавиши" 559
HTML-код для создания надписей на кнопках 560
Конструкторы JButton 561
Методы классов J B u t t o n и AbstractButton 561
14.6. Компонент JPanel 563
Конструкторы JPanel 564
Новая возможность: обрамление 564
Методы класса BorderFactory 564
14.7. Компонент JSlider 567
Н о в ы е возможности: разметка шкалы 568
Конструкторы JSlider 568
Методы класса JSlider 569
14.8. Компонент JColorChooser 571
Конструкторы 572
Методы класса JColorChooser 572
14.9. Внутренние окна 575
Конструктор J I n t e r n a l F r a m e 575
Методы класса JInternalFrame 575
14.10. К о м п о н е н т J O p t i o n P a n e 578
Методы класса J O p t i o n P a n e 579
14.11. Компонент JToolBar 583
Конструкторы JToolBar 584
Методы JToolBar 585
14.12. Компонент JEditorPane 589
Переход по гипертекстовым ссылкам 590
Конструкторы JEditorPane 590
Методы J E d i t o r P a n e 591
Реализация простого Web-броузера 592
Поддержка H T M L и JavaHelp 595
14.13. П р о с т ы е Swing-компоненты 595
Компонент JCheckBox 595
Компонент JRadioButton 597
Компонент JTextField 598
Компонент JTextArea 598
Компонент JFileChooser 598
Глава 15. Р а с ш и р е н н ы е с р е д с т в а Swing 602
15.1. Использование произвольных моделей данных
и средств просмотра 604
15.2. Компонент JList 604
JList как ф и к с и р о в а н н ы й набор пунктов 605
Компонент JList с изменяемым набором пунктов 609
Использование JList с произвольной моделью данных 612
JList и средства визуализации, определяемые разработчиком 617
Содержание 15

15.3.JTree 621
Простой объект J T r e e 621
Методы класса J T r e e 625
Обработка событий J T r e e 625
15.4.JTable 634
Простой способ создания JTable 634
Модели данных, используемые компонентом JTable 638
Визуализация ячеек таблицы 643
Обработка событий таблицы 645
15.5. Вывод на печать Swing-компонентов 649
Основы вывода на печать 649
Двойная буферизация и вывод на печать 651
Универсальная программа печати 652
Вывод на печать в JDK 1.3 656
15.6. Потоки Swing 658
Методы класса SwingUtilities 660
Глава 16. И с п о л ь з о в а н и е п о т о к о в 664
16.1. Запуск потоков 666
Выполнение действий в отдельном объекте Thread 666
Выполнение действий в классе, реализующем и н т е р ф е й с Runnable 668
16.2. Возникновение "гонок" 671
16.3. Синхронизация 673
Синхронизация фрагмента кода 673
Синхронизация метода 674
Ошибки, допускаемые п р и использовании синхронизации 675
16.4. Создание многопотоковых методов 677
16.5. Методы класса T h r e a d 681
Конструкторы 681
Константы 682
Методы 683
Остановка выполнения потока 688
16.6. Группы потоков 690
Конструкторы 690
Методы 690
16.7. Многопотоковая графика и двойная буферизация 692
Вывод графики в теле метода paint 693
Реализация динамической части изображения в виде отдельного
компонента 696
Рисование за пределами метода paint 696
Переопределение метода u p d a t e и использование метода
paint для инкрементного рисования 699
Использование двойной буферизации 703
16.8. Анимационные изображения 708
16.9. Таймеры 712
Конструктор 715
Методы класса Timer 716
16.10. Резюме 717
16 Содержание

Глава 17. С е т е в о е п р о г р а м м и р о в а н и е 718


17.1. Реализация клиента 720
П р и м е р универсального сетевого клиента 722
17.2. Разбор строк с помощью класса StringTokenizer 725
Класс StringTokenizer 726
Конструкторы 726
Методы 726
П р и м е р интерактивной программы разбора 727
17.3. П р и м е р клиента, предназначенного... 728
17.4. П р и м е р клиент-программы... 731
Класс, предназначенный для получения ресурса с указанного узла 732
Класс, предназначенный для получения ресурса по заданному URL 733
Выходные данные UrlRetriever 734
17.5. Класс URL 735
Получение ресурса по указанному URL 735
Методы класса URL 736
17.6.WebClient... 738
17.7. Реализация сервера 745
П р и м е р универсального сервера 747
Взаимодействие NetworkClient и NetworkSei'ver 750
17.8. П р и м е р простого HTTP-сервера 751
Сервер, выполняющийся в многопотоковом режиме 754
17.9. RMI: Remote Method Invocation 756
Создание RMTпpилoжeния 757
П р о с т о й пример использования RMI 758
Сервер, выполняющий численное интегрирование 762
Ч е т ы р е класса, необходимых для реализации примера 763
Компиляция и запуск примера 768
Конфигурация средств RMI для использования в корпоративной
системе 769
Компиляция и запуск примера для использования
в корпоративной системе 772
П р и м е р RMI-аплета 774

Ч А С Т Ь III. П Р О Г Р А М М Ы , В Ы П О Л Н Я Ю Щ И Е С Я
Н А С Т О Р О Н Е СЕРВЕРА 779
Глава 18. H T M L - ф о р м ы 780
18.1. Передача данных с помощью HTML-форм 781
18.2. Элемент FORM 785
18.3. Управляющие элементы для обработки текста 790
Поля редактирования 790
Поле ввода пароля 792
Текстовые области 792
18.4. Кнопки 794
Кнопка Submit 795
Кнопка Reset 797
Содержание 17

Кнопки JavaScript 798


18.5. Флажки и переключатели опций 799
Флажки опций 799
Переключатели опций 800
18.6. Раскрывающиеся списки и окна списков 802
18.7. Управляющий элемент... 805
18.8. Карты изображений на стороне сервера 806
IMAGE — стандартные карты изображений на стороне сервера 807
ISMAP — альтернативные карты изображений на стороне сервера 809
18.9. Скрытые поля 811
18.10. Группировка и н т е р ф е й с н ы х элементов 812
18.11. Порядок выбора элементов 813
Глава 19. Java на с т о р о н е с е р в е р а : с е р в л е т ы 816
19.1. Преимущества сервлетов... 818
Эффективность 818
Простота использования 819
Богатые возможности 819
Переносимость 819
Защита 819
Низкая стоимость 820
19.2. Инсталляция и настройка сервера 820
Программное обеспечение для поддержки сервлетов и JSP 820
Док}т^1ентация, необходимая для разработки сервлетов и JSP 822
И н ф о р м а ц и я о расположении файлов классов 822
О ф о р м л е н и е классов в виде пакета 822
Настройка сервера 823
Компиляция и установка сервлетов 823
Обращения к сервлетг1м 824
19.3. Базовая структура сервлета 824
Сервлет, генерирующий текстовое сообщение 825
Сервлет, генерирующий HTML-код 826
Простые \пгилиты для создания HTML-кода 828
19.4. Ж и з н е н н ы й цикл сервлета 830
Метод init 830
Метод service 831
Методы doGet, doPost и doXxx 832
И н т е р ф е й с SingleThreadModel 832
Метод destroy 833
19.5. П р и м е р использования инициализированных параметров 833
19.6. Запрос клиента: данные ф о р м ы 836
Получение данных ф о р м ы CGI-программами 836
Получение данных ф о р м ы сервлетами 836
П р и м е р получения значений трех параметров 837
Фильтрация данных, полученных в составе запроса 839
19.7. Запрос клиента: заголовок HTTP-запроса 840
Чтение полей заголовка сервлетами 841
18 Содержание

Создание таблицы, содержащей полученные поля заголовка 843


Поля заголовка, определенные в протоколе H T T P 1.1 845
Передача сжатых Web-страниц 848
19.8. Аналоги стандартных CGI-переменных 850
19.9. Ответ сервера: коды состояния 853
Установка кода состояния 853
Коды состояния H T T P 1.1 855
И н т е р ф е й с к различным поисковым серверам 860
19.10. Ответ сервлета: поля заголовка 864
Установка полей заголовка 865
Поля заголовка в составе ответа сервера 866
Постоянное состояние сервлета и автоматическая перезагрузка
Web-страниц 871
19.11. Cookie 880
Преимущества использования cookie 880
Проблемы, возникающие при использовании cookie 882
Средства API, предназначенные для работы с cookie 883
П р и м е р ы установки и чтения cookie 886
Вспомогательные средства для работы с cookie 889
Создание cookie с большим временем жизни 890
19.12. Поддержка сеанса 890
Необходимость поддержки сеанса 891
Модификация URL 891
API поддержки сеанса 892
Завершение сеанса 896
Сервлет, реализующий счетчик обращений клиента 897
Глава 20. JavaServer P a g e s 900
20.1. Общие сведения oJSP 901
20.2. Преимущества JSP 903
Преимущества JSP перед ASP и ColdFusion 903
Преимущества JSP перед Р Н Р 903
Преимущества JSP перед сервлетами 903
Преимущества JSP перед SSI 904
Преимущества JSP перед JavaScript 904
20.3. Элементы сценариев JSP 904
Выражения 905
Скриптлеты 908
Декларации 910
Предопределенные переменные 912
20.4. Директива page 913
Атрибут import 914
Атрибут сontentType 916
Атрибут isThreadSafe 917
Атрибут session 918
Атрибут buffer 918
Атриб)т autoflush 919
Содержание 19

Атрибут extends 919


Атрибут info 919
Атрибут errorPage 919
Атрибут isErrorPage 920
Атрибут language 920
XML-представление директив 920
20.5. Включение файлов и аплетов в состав JSP-документов 920
Директива include: включение файлов на этапе преобразования доку­
мента 921
Включение файлов в момент запроса 923
Включение аплетов, использующих Java Plug-In 925
Элемент jsp:fallback 929
20.6. Использование JavaBeans с JSP 932
Использование JavaBeans 933
П р и м е р класса StringBean 935
Установка свойств beans 937
Совместное использование компонентов bean 942
20.7. Определение новых JSP-дескрипторов 946
Компоненты, предназначенные для создания библиотеки дескрипторов 946
Определение простого дескриптора 949
Поддержка атрибутов дескриптора 953
Поддержка тела дескриптора 956
Необязательные данные в составе дескриптора 961
Обработка тела дескриптора 964
Многократная обработка тела дескриптора 968
Использование вложенных дескрипторов 970
20.8. Интеграция сервлетов и JSP 977
Перенаправление запросов 978
П р и м е р : интерактивный агент по обслуживанию туристов 981
Перенаправление запросов JSP-документами 988
Глава 21. А п л е т ы как и н т е р ф е й с к программам на с т о р о н е с е р в е р а 990
21.1. Передача данных с использованием запроса GET 992
21.2. И н т е р ф е й с к нескольким поисковым серверам 993
21.3. Использование запроса GET... 997
Ч т е н и е двоичных и ASCII-данных 997
Ч т е н и е сериализованных структур данных 999
21.4. Программа просмотра запросов... 1001
21.5. Использование запроса POST... 1007
21.6. Аплет, к о т о р ы й передает данные методом POST 1009
21.7. Взаимодействие без участия HTTP-сервера 1014
Глава 22. J D B C 1016
22.1. Основные этапы работы с JDBC 1017
Загрузка драйвера 1018
Определение URL для соединения 1019
Установление соединения 1019
Создание объекта Statement 1020
20 Содержание

Выполнение запроса 1020


Обработка результатов 1020
Закрытие соединения 1021
22.2. П р и м е р использования JDBC 1022
22.3. Вспомогательные классы для работы с JDBC 1027
22.4. Применение класса DatabaseUtilities 1035
22.5. Интерактивная программа просмотра запросов 1039
Код Q u e lyVie we г 1041
22.6. Заранее подготовленные выражения 1046
Глава 23. О б р а б о т к а XML-документов 1050
23.1. Разбор XML-документа посредством DOM Level 2 1052
Инсталляция и настройка 1052
Разбор 1053
23.2. П р и м е р использования DOM... 1055
23.3. Разбор XML-документов посредством SAX 2.0 1064
Инсталляция и настройка 1065
Разбор 1066
23.4. П р и м е р использования SAX: вывод общих сведений... 1067
23.5. П р и м е р использования SAX: подсчет заказов на книги 1073
23.6. Преобразование XML посредством XSLT 1077
Инсталляция и настройка 1078
Преобразование 1079
23.7. П р и м е р использования XSLT: редактор документов 1082
23.8. П р и м е р использования XSLT... 1090

Ч А С Т Ь rV^. J A V A S C R I P T 1099
Глава 24. JavaScript: д и н а м и ч е с к и и з м е н я ю щ и е с я Web-страницы 1100
24.1. Динамическая генерация HTML-документов 1103
Обеспечение совместимости с различными броузерами 1107
24.2. Обработка событий 1108
24.3. Синтаксис JavaScript 1109
Динамическая поддержка типов 1110
Объявление функций 1110
Объекты и классы 1111
Массивы 1116
24.4. Использование JavaScript при создании Web-страниц 1117
Определение размеров окна броузера 1117
Определение наличия дополнительных модулей 1120
24.5. Использование JavaScript для изменения... 1122
Динамическое изменение изображений 1122
Работа со слоями 1128
24.6. Использование JavaScript для проверки HTML-форм 1131
Индивидуальная обработка элементов ф о р м ы 1133
Проверка данных перед передачей на сервер 1135
24.8. Использование JavaScript для работы с фреймами 1144
Отображение во фрейхме ресурса с заданным URL 1144
Содержание 21

Получение фреймом фокуса ввода 1147


24.9. Обращение к Java из JavaScript 1148
Непосредственный вызов методов Java 1148
Использование аплетов для выполнения операций в JavaScript-сценариях 1150
Управление аплетами из JavaScript-сценария 1153
24.10. Доступ к средствам JavaScript из Java 1157
Определение цвета фона Web-страницы 1159
Аплет, проверяющий данные ф о р м ы 1160
Методы классаJSObject 1169
Глава 25. К р а т к о е р у к о в о д с т в о п о JavaScript 1172
25.1. Объект Array 1173
Конструкторы 1173
Свойства 1174
Методы 1174
Обработчики событий 1177
25.2. Объект Button 1177
Свойства 1177
Методы 1177
Обработчики событий 1178
25.3. Объект Checkbox 1178
Свойства 1179
Методы 1179
Обработчики событий 1180
25.4. Объект Date 1180
Конструкторы 1180
Свойства 1181
Методы 1181
Обработчики событий 1183
25.5. Объект Document 1183
Свойства 1183
Методы 1186
Обработчики событий 1186
25.6. Объект Element 1186
Свойства 1186
Методы 1187
Обработчики событий 1188
25.7. Объект FileUpload 1188
Свойства 1189
Методы 1189
Обработка событий 1189
25.8. Объект Form 1190
Свойства 1190
Методы 1190
Обработчики событий 1191
25.9. Объект Function 1191
Конструктор 1191
22 Содержание

Свойства 1191
Методы 1192
Обработчики событий 1192
25.10. Объект H i d d e n 1192
Свойства 1193
Методы 1193
Обработчики событий 1193
25.11. Объект History 1193
Свойства 1193
Методы 1194
Обработчики событий 1194
25.12. Объект Image 1194
Конструктор 1194
Свойства 1195
Методы 1196
Обработчики событий 1196
25.13. Объект JavaObject 1196
25.14. Объект JavaPackage 1197
25.15. Объект Layer 1197
Конструкторы 1197
Свойства 1197
Методы 1199
Обработчики событий 1200
25.16. Объект Link 1200
Свойства 1201
Методы 1202
Обработчики событий 1202
25.17. Объект Location 1202
Свойства 1202
Методы 1203
Обработчики событий 1204
25.18. Объект Math 1204
Свойства 1204
Методы 1205
Обработчики событий 1206
25.19. Объект MimeType 1207
Свойства 1207
Методы 1207
Обработчики событий 1207
25.20. Объект Navigator 1208
Свойства 1208
Методы 1210
Обработчики событий 1210
25.21. Объект N u m b e r 1210
Конструкторы 1211
Свойства 1211
Методы 1211
Содержание 23

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


25.22. Объект Object 1213
Конструкторы 1213
Свойства 1214
Методы 1214
Обработчики событий 1214
25.23. Объект Option 1214
Конструкторы 1214
Свойства 1215
Методы 1215
Обработчики событий 1215
25.24. Объект Password 1215
Свойства 1216
Методы 1216
Обработчики событий 1216
25.25. Объект Plugin 1217
Свойства 1217
Методы 1218
Обработчики событий 1218
25.26. Объект Radio 1218
Свойства 1218
Методы 1219
Обработчики событий 1219
25.27. Объект RegExp 1219
Конструкторы 1219
Свойства 1221
Методы 1222
Обработчики событий 1223
Специальные символы в составе регулярных выражений 1223
25.28. Объект Reset 1225
Свойства 1225
Методы 1225
Обработчики событий 1226
25.29. Объект Screen 1226
Свойства 1226
Методы 1227
Обработчики событий 1227
25.30. Объект Select 1227
Свойства 1228
Методы 1229
Обработчики событий 1229
25.31. Объект String 1230
Конструктор 1230
Свойства 1230
Методы 1230
Обработчики событий 1235
25.32. Объект Submit 1235
24 Содержание

Свойства 1235
Методы 1236
Обработчики событий 1236
25.33. Объект Text 1237
Свойства 1237
Методы 1237
Обработчики событий 1238
25.34. Объект Textarea 1238
Свойства 1238
Методы 1239
Обработчики событий 1239
25.35. Объект Window 1240
Свойства 1240
Методы 1244
Обработчики событий 1249
П р е д м е т н ы й указатель 1254
Введение 25

ВВЕДЕНИЕ

В конце 1995 г. Марти Холл предложил новый курс для студентов, изучающих ком­
пьютерные науки в университете Джонса Хопкинса. В нем он рассмотрел основные
вопросы, имеющие о т н о ш е н и е к поддержке Web, с точки зрения Java-технологии.
Предполагалось, что слушатели курса будут изучать HTML, Java, HTTP, CGI-
программирование и JavaScript и участвовать в выполнении простых учебных проек­
тов. Вряд ли Марти представлял себе, какая судьба ожидает его курс. Появление пер­
вой части курса летом 1996 г. совпало со всплеском популярности Java. Аудитория бь.
ла переполнена, а число желающих, записавшихся в очередь, намного превышало ко­
личество мест в аудитории. Марти не успевал отвечать на т е л е ф о н н ы е звонки
студентов, пытавшихся доказать, что именно они непременно должны быть слушате­
лями нового курса. От п р е д п р и я т и й приходили заявки на материалы курса. Успех был
абсолютный.
В дальнеР1шем, когда Марти занимался поисками материала для продолжения кур­
са, он обнаружил, что, несмотря на обилие печатных изданий по каждому из рассмат­
риваемых вопросов, для того, чтобы полностью охватить материал курса, понадобит­
ся четыре или даже пять книг. В своей повседневной деятельности Марти постоянно
приходилось обращаться к огромному количеству собранных им публикаций. Напра­
шивалось решение объединить основной материал, необходимый профессиональ­
ным программистам, в одной книге.
Такова была предыстория первого издания книги Программирование для Web. Как и
следовало ожидать, она была очень популярна, но соответствующие технологии раз­
вивалось чрезвычайно быстро. Вместо HTML 3.2 в броузерах была реализована под­
держка HTML 4.0, была создана платформа Java 2, где появились средства, позволяю­
щие повышать э ф ф е к т и в н о с т ь программ, и новые графические библиотеки. Это да­
вало возможность создавать профессиональные коммерческие приложения. Раз­
работка JSP 1.0 стимулировала интерес и к сервлетам, и к JSP, как альтернативе не
только традиционным CGI-программам, но также ASP и ASP и ColdFusion. Появился
язык XML. П о с т е п е н н о область применения Java переместилась с персональных ком­
пьютеров на серверы.
По мере развития технологии стало ясно, что необходимо новое издание книги,
однако объем работы, требуемый для этого, был не по силам одному Марти. В про­
цесс подготовки нового издания включился Л э р р и Браун, обладающий огромным
опытом разработки и преподавания в области Java-пограмм и Web-технологий. Его
знания по вопросам Java Foundation Classes и созданию многопотоковых программ,
26 Введение

RMI и XML пришлись очень кстати. Вместе Марти и Л э р р и переработали сущест­


вующий материал, написали главы, посвященные HTML 4, C S S / 1 , H T T P L I и плат­
ф о р м е Java, заменили главы по CGI вопросами создания сервлетов и JSP, а также
включили новые разделы, в которых описали средства Swing и Java 2D. Кроме того,
они уделили внимание обработке XML-документов с помощью JAXP, DOM Level 2,
SAX 2.0 и XSLT. Работы было так много, что не хватало времени на сон.
Марти и Л э р р и искренне надеются, что результаты их работы окажутся полез­
ными для вас.

Реальный код для настоящих программистов


Данная книга предназначена для профессиональных разработчиков. Если вы хо­
тите узнать, как запустить броузер и получить список популярных Web-узлов, вы об­
ратились не по адресу. Если же вы программист и вас интересуют языки H T M L и
XML, Java-аплеты и сервлеты, JavaServer Pages и JavaScript, вы быстро найдете нужный
вам материал. Здесь описаны подходы к р е ш е н и ю часто встречающихся задач и опас­
ности, подстерегающие программиста на этом пути. В книгу включены п р и м е р ы , ил­
люстрирующие материал, в частности в ней содержатся коды более 250 Java-классов.
Мы постарались очень подробно описать часто используемые средства, кратко обсу­
дить вопросы, которые возникают реже, а получить "слишком специальные" сведения
читатель может в документации по API (доступной в электронном виде).
Приступая к работе, имейте в виду, что еще никто не стал великим программистом
лишь от того, что читал книги. Вам надо писать программы, и чем больше вы это бу­
дете делать, тем лучше. В кг1ЖДой главе мы сначала предлагаем простой п р и м е р , а за­
тем подробно рассматриваем необходимые вопросы на более сложных примерах.
Пропускайте разделы и целые главы, содержащие материал, для которого вы не ви­
дите применения, а затем возвращайтесь к ним по мере надобности.
Поступая так, как мы советуем, вы вскоре расширите свой кругозор и начнете уве­
р е н н о ориентироваться в решении проблем, возникающих перед программистами.
Вы сможете находить компромисс между требованием включать в Web-страницы но­
вые средства и необходимостью обеспечивать переносимость документов. Вы сможе­
те работать с фреймами, листами стилей и прочими возможностями, предоставляе­
мыми HTML 4.0. Вы научитесь создавать независимые переносимые графические
приложения. Вас не будет пугать задача создания Web-интерфейса к к о р п о р а т и в н о й
базе данных с помощью JDBC. Вы сможете обеспечить взаимодействие по сети с уда­
ленными приложениями. Вам станет ясно, как выполняется распараллеливание вы­
числений, как можно реализовать р е ш е н и е подзадачи в отдельном потоке или даже
на другом компьютере с использованием RML Вы научитесь оценивать, для решения
каких задач лучше подходят сервлеты, а для каких —JSP. Вы разберетесь в особенно­
стях протокола H T T P L1 так, что сможете использовать его для повышения эффек­
тивности работы ваших программ. Вы сможете реализовывать сложные программы
на стороне сервера, используя для этого компоненты JavaBeans и библиотеки деск­
р и п т о р о в JSP. Вы научитесь использовать JavaScript-сценарии для проверки содержи­
мого HTML-форм или для поддержки движущихся изображений. Ваш профессио­
нальный уровень повысится и, надеемся, существенно.
Введение 27

Структура книги
Данная книга разделена на четыре части, посвященные HTML, программированию
на языке Java, написанию программ, выполняющихся на стороне сервера и JavaScript.

Часть L Язык HTML


Для создания Web-страниц используется HTML (HyperText Markup Language).
HTML-документ включает обычный текст, предназначенный для отображения, и деск­
рипторы, описывающие содержимое Web-страницы. Дескрипторы интерпретируются
Web-броузерами, например Netscape Navigator и Microsoft Internet Explorer, при форма­
тировании Web-страниц. В данной части рассматриваются следующие вопросы.

• HTML 4.01. Элементы, определяемые последним из официальных HTML-


стандартов. Гипертекстовые ссылки, ш р и ф т ы , изображения, таблицы, карты
изображений на стороне клиента и др.
• Основные расширения Netscape и Internet Explorer. Перенаправление стра­
ниц, использование цветов и ш р и ф т о в , встроенные аудио-, видео- и ActiveX-
компоненты.
• Фреймы. Разбиение окна на прямоугольные области и связывание этих облас­
тей с HTML-документами. Фреймы без обрамления. Плавающие ф р е й м ы . Ука­
зание ф р е й м о в в гипертекстовых ссылках.
• Каскадные листы стилей. Листы стилей первого уровня для поддержки
ш р и ф т о в , цветов, изображений, ф о р м а т и р о в а н и я текста, организации отсту­
пов и др.

Часть IL Программирование на языке Java


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

• Средства Java. Ч т о отличает Java от других языков программирования? М и ф ы


о Java, и как обстоят дела в реальности.
• Объектно-ориентированное программирование на языке Java. П е р е м е н н ы е ,
методы, конструкторы, интерфейсы. Объявление класса и модификаторы. Па­
кеты, переменная окружения CLASS PATH и JAR-файлы.
• Синтаксис Java. П р о с т ы е типы, о п е р а т о р ы , строки, векторы, массивы, ввод-
вывод и класс Math.
• Графика. Аплеты. Приложения. Поддержка цвета и шрифтов. Область отсече­
ния. Загрузка и вывод изображений. Java Plug-In.
• Java 2D. Создание профессиональной высококачественной 2В-графики. Соз­
дание ф о р м , повторение изображений, использование локальных ш р и ф т о в ,
создание прозрачных ф о р м и преобразование координат.
28 Введение

• События, связанные с мышью и клавиатурой. Обработка событий. Типы со­


бытий. Высокоуровневые и низкоуровневые обработчики событий. Внутрен­
ние классы. Анонимные классы.
• Диспетчеры компоновки. FlowLayout, BorderLayout, GridLayout,
C a r d L a y o u t , G r i d B a g L a y o u t и B o x L a y o u t , Размещение компонентов вруч­
ную. Э ф ф е к т и в н о е использование диспетчеров компоновки.
• Компоненты AWT. C a n v a s , P a n e l , A p p l e t , S c r o l l P a n e , F r a m e , D i a l o g ,
F i l e D i a l o g и Window. Компонеьггы и контейнеры. Кнопки, флажки опций,
переключатели опций, списки, поля редактирования, текстовые области, ста­
тический текст, полосы прокрутки и раскрывающиеся меню. Загрузка и сохра­
нение окон с использованием сериализации объектов.
• Основные компоненты Swing. Создание аплетов и п р и л о ж е н и й с использова­
нием Swing. Изменение стиля интерфейса. Добавление обрамления к компо­
нентам. Использование H T M L при ф о р м и р о в а н и и статического текста и над­
писей на кнопках. Окна с сообщениями. Создание дочерних окон в приложе­
нии. Реализация Web-броузера средствами Swing.
• Расширенные средства Swing. J L i s t , J T r e e и J T a b l e . Использование произ­
вольных моделей данных и средств визуализации. Вывод компонентов Swing на
печать. Обновление компонентов Swing в многопотоковых программах.
• Создание многопотоковых программ. Создание потоков в отдельных или су­
ществующих объектах. Синхронизация доступа к разделяемым ресурсам. Груп­
пировка потоков. Вывод графики в многопотоковых программах и двойная бу­
феризация. Анимационные изображения. Управление таймерами.
• Сетевое программирование. Использование гнезд клиентами и серверами.
Класс URL. Универсальный сервер. Создание простого HTTP-сервера. Вызов
удаленных объектов средствами RMI.

Часть III. Программы, выполняющиеся на стороне


сервера
Программы, выполняющиеся на Web-сервере, могут генерировать динамические
документы на основе данных, передаваемых клиентами. Сервлеты можно рассматри­
вать как Java-альтернативу CGI-программам, а JSP — как альтернативу Active Server
Pages и ColdFusion. В данной части рассматриваются следующие вопросы.

• HTML-формы. Передача данных, введенных посредством HTML-форм. Эле­


менты, предназначенные для ввода текста. Кнопки. Флажки и кнопки выбора
опций. Карты изображений на стороне сервера. Скрытые поля. Порядок пе­
редачи фокуса.
• Java-сервлеты. Преимущества сервлетов перед другими технологиями. Жиз­
ненный цикл сервлета. Инициализированные параметры сервлетов. Получе­
ние данных ф о р м ы . Использование полей заголовка запроса и ответа, а также
кодов состояния H T T P L L Обработка записей cookie сервлетами. Поддержка
сеанса взаимодействия.
Введение 29

• JavaServer Pages (JSP). Преимущества JSP. Выражения, скриптлеты и деклара­


ции. Использование компонентов JavaBeans в JSP. Создание библиотек деск­
р и п т о р о в JSP. Сервлеты и JSP.
• Использование аплетов в качестве интерфейса при взаимодействии с
сервлетами. Передача данных GET и POST. НТТР-туннелирование. Использо­
вание сериализации объектов для передачи сложных структур данных между
аплетом и сервлетом. Отказ от использования HTTP-сервера.
• Java Database Connectivity (JDBC). Семь основных этапов соединения с базой
данных. Вспомогательные средства, облегчающие работу с JDBC. Представле­
ние результатов обращения к базе данных в текстовом виде и HTML-формате.
Средство просмотра запросов. Предварительно скомпилированные запросы.
• Обработка XML-документов средствами Java. Представление XML-документа
с помощью Document Object Model (DOM) Level 2. Обработка событий, связан­
ных с разбором XML-документа, посредством Simple API for XML Parsing (SAX)
2.0. Преобразование XML с помощью XSLT. Зависимость Java API for XML
Processing (JAXP) от производителя.

Часть IV. JavaScript


JavaScript — это язык, предназначенный для написания сценариев, встраиваемых в
Web-страницы. Сценарий интерпретируется при загрузке страницы. В последней
части данной книги рассматриваются следующие вопросы.

• Синтаксис JavaScript. Поля, методы, функции, строки, объекты, массивы и ре­


гулярные выражения.
• Настраиваемые Web-страницы. Адаптация под различные броузеры, реализа­
ции JavaScript и размеры экрана.
• Создание динамических Web-страниц. Анимационные изображения. Дейст­
вия со слоями. Обработка пользовательских событий.
• Проверка HTML-форм. Проверка изменяющихся компонентов ф о р м ы . Тес­
тирование данных, передаваемых на сервер.
• Поддерлска cookie. Чтение и установка значений. Объект C o o k i e .
• Управление фреймами. Передача результатов заданному фрейму. Запрет ис­
пользования фреймов при о т о б р а ж е н и и док)'ментов. Обновление нескольких
ф р е й м о в . Передача фокуса фрейму.
• Интеграция Java и JavaScript. Классы L i v e C o n n e c t и JSOb j e c t .
• Справочные материалы по JavaScript. Основные классы, определенные в
JavaScript 1.2. Поля, методы и обработчики событий. Document, Window, Form,
E l e m e n t , S t r i n g , Math, RegExp и п р о ч и е объекты.
30 Введение

Соглашения, принятые в книге


Программы, фрагменты программ и результаты их выполнения, а также иденти­
фикаторы, встречающиеся в тексте программы, выделены в данной книге моноши­
ринным ш р и ф т о м . Так, например. A p p l e t означает имя специального класса, ис­
пользуемого для создания аплетов.
Данные, вводимые пользователем, отображаются полужирным шрифтом. Для
ввода командной строки предлагается либо универсальное приглашение ( P r o m p t > ) ,
либо приглашение, специфическое для конкретной о п е р а ц и о н н о й системы (Unix>).
В приведенном ниже примере показаны данные, полученные при выполнении ко­
манды J a v a S o m e P r o g r a m .

Prompt> Java SomeProgram


Some O u t p u t
Стандартные способы решения задач кратко описаны во фрагментах текста,
оформленных так, как показано ниже.

М е т о д и к а профессионалов

Обратите особое внимание на фрагменты текста, помеченные как


"Методика профессионалов". Здесь описываются очень часто ис­
пользуемые подходы.

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

Web-узел
Материалы, имеющие отношение к данной книге, хранятся на Web-узле
http://www.corewebprogramming.com/
П о этому адресу вы найдете следующую информацию.

• Документированные исходные коды всех примеров, приведенных в книге. Эти


коды можно копировать и использовать без ограничений.
• Интерактивные версии всех HTML-страниц, Java-аплетов и сценариев JavaScript.
• Ссылки на все URL, упомянутые в книге.
• И н ф о р м а ц и я об условиях приобретения данной книги.
• Сообщения о курсах по Java.
• Дополнительная и н ф о р м а ц и я по данной книге.
• Инструментальные средства Ronco.
Об авторах 31

06 авторах
Марти Холл работает старшим научным сотрудником лаборатории прикладной фи­
зики исследовательского центра при университете Джонса Хопкинса и ведет курсы по
распределенным вычислениям и Web-технологии. Иногда он также проводит курсы на
предприятиях по использованию сервлетов, JavaSen^er Pages, а также по другим темам,
связанным с Web-технологиями. Он автор книг Core Servlets and JavaServer Pages, a также
первого издания книги Программирование для Web. С Марти можно связаться по адресу

Research and Technology Development Center


TheJohns Hopkins University Applied Physics Laboratory
11100Johns Hopkins Road
Laurel, MD 20723
hall@corewebprogramming. com
Л э р р и Браун работает старшим инженером в военно-морском исследовательском
центре и занимается разработкой Web-технологий для предприятий. О н также явля­
ется сотрудником факультета компьютерных наук университета Джонса Хопкинса,
где читает лекции по созданию программ, работающих на стороне сервера, распре­
деленному Web-программированию и разработке и н т е р ф е й с о в на базе Java. С Л э р р и
можно связаться по следующему адресу:
Naval Surface Warfare Center, Carderock Division
9500 MacArthur Boulevard
West Bethesda, MD 20817
brown@corewebprogramming. com
32 Благодарности

Благодарности
В подготовке книги к печати принимали участие очень многие. Без их помощи мы
вряд ли смогли бы выпустить даже первую часть. Д о н Олдридж, (Don Aldridge), Крис
Беннет (Chris B e n n e t t ) , Камил Белл ( С а т Ш е Bell), Пит Кларк (Pete Clark), Мария
Димеленте (Maria D i m a l a n t a ) , Нгуен-Хоа Дай ( N g u y e n - K h o a Duy), Дениз Еванс
(Denise E v a n s ) , Эми Карлсон (Amy K a r l s o n ) , Пол МакНеми (Paul M c N a m e e ) , Тодди
Норам (Toddi N o r u m ) , Уолтер Паскуинни (Walter P a s q u i n n i ) , Рич Слайвзек (Rich
Slywczak), Боб Т и н к е р (Bob Tinker) и Ким Топли (Kim Topley) указали нам на наши
ошибки и помогли советами. Без их участия данная книга вряд ли могла бы иметь ус­
пех. Мэри Лоу Н о р (Магу Lou Nohr) затратила много времени на расстановку недос­
тающих запятых и поис других ошибок. Благодаря ей текст книги стал таким, каким
вы его видите. Ванесса Мур ( V a n e s s a Moore) руководила подготовкой последней
версии. Ее работа осложнялась тем, чтоб н е к о т о р ы е изменения приходилось вносить
буквально в последний момент. Благодаря усилиям Ральфа Семмела ( R a l p h S e m m e l )
и Джулии Вессел ( J u l i e Wessel) был обеспечен гибкий график работы. Грег Д о н ч
(Greg D o e n c h ) из P r e n t i c e Hall всячески поощрял нашу работу над вторым издани­
ем. Всем перечисленным выше мы выражаем искреннюю благодарность.
Я, Марти, в особенности благодарен B . J . , Линдси и Натану за их понимание и
поддержку. Я, Л э р р и , благодарю Ли за поддержку и т е р п е н и е в те долгие дни, кото­
р ы е я проводил за компьютером.
Господь наградил нас обоих прекрасными семьями.

От издательства
Вы, читатель этой книги, и есть главный ее критик и комментатор. Мы ценим ва­
ше мнение и хотим знать, что было сделано нами правильно, что можно было сделать
лучше и что еще вы хотели бы увидеть изданным нами. Нам интересно услышать и
любые другие замечания, которые вам хотелось бы высказать в наш адрес.
Мы ждем ваших комментариев и надеемся на них. Вы можете прислать электрон­
ное письмо или просто посетить наш Web-сервер, оставив свои замечания, — одним
словом, любым удобным для вас способом дайте нам знать, нравится или нет вам эта
книга, а также выскажите свое мнение о том, как сделать наши книги более подходя­
щими для вас.
Посылая письмо или сообщение, не забудьте указать название книги и ее авторов,
а также ваш e-mail. Мы внимательно ознакомимся с вашим мнением и обязательно уч­
тем его при отборе и подготовке к изданию последующих книг. Наши координаты:
L-mail: i n f o @ w i l l i a i n s p u b l i s h i n g . com
WWW: h t t p : //www. w i l l i a m s p u b l i s h i n g . com
^:jzjs:-r±

ЯЗЫК HTML
Глава 1. Создание \/\/еЬ'Страниц с помощью HTML 4.0
Глава 2. Элементы блокового уровня HTML 4.0
Глава 3. Элементы текстового уровня HTML 4.0
Глава 4. Фреймы
Глава 5. Каскадные листы стилей
СОЗДАНИЕ
WEB-СТРАНИЦ
С ПОМОЩЬЮ
HTML 4.0

В ЭТОЙ главе...

• Общие сведения о HyperText Markup Language.


• HTML 4.0 и другие спецификации языка HTML.
• Проверка HTML-документов.
• Создание и публикация Web-страницы.
• Структура HTML-документа.
J~1y\ZJSJZJ

еред вами первая из пяти глав, посвященных HTML (HyperText Markup Lan­

П guage— язык разметки гипертекста). Прочитав их, вы познакомитесь с техно­


логиями, которые используются при создании Web-страниц. В первой главе
представлена структура HTML-документа, а в остальных четырех — дополнительные
сведения, которые позволят вам создавать профессиональные Web-страницы. В част­
ности, вы узнаете об элементах блокового уровня, элементах текстового уровня и о
каскадных листах стилей. В остальной части книги будут описаны Java-аплеты, гнезда
(socket), взаимодействие с базами данных, Java-сервлеты, JavaSetrver Pages (JSP) и об­
работка XML-документов. Эти технологии чрезвычайно важны для разработки высо­
кокачественных Web-узлов.
В данной главе мы рассмотрим историю возникновения HyperText Markup Language
и основные действия, необходимые для того, чтобы создать и опубликовать Web-
страницу. Затем мы сосредоточим внимание на общей структуре Web-страницы, опи­
шем основные HTML-элементы, обязательные для каждого документа, и обсудим уста­
новки, оказывающие влияние на документ в целом. Наконец, мы расскажем, как можно
проверить, соответствует ли готовая Web-страница стандарту HTML, и как включить в
документ информацию, предназначенную для использования поисковыми серверами.

1.1. HyperText Markup Language


Для создания Web-страниц используется HyperText Markup Language. Документ,
созданный на языке HTML, содержит обычный текст и дескрипторы, предназначен­
ные для разметки текста. С помощью дескрипторов можно описать внешний вид тек­
ста (например, указать, что некоторый фрагмент должен отображаться красным цве­
том) или его расположение на странице (например, задать размещение данных в
третьей и четвертой строках таблицы). Однако чаще всего дескрипторы описывают
содержимое документа (скажем, можно указать, что определенный фрагмент текста
является заголовком) и предоставляют броузеру решать, как именно следует размес­
тить текст на странице. В листинге L1 содержится HTML-код Web-страницы, пред-
36 Глава 1 . Создание Web-страниц с помощью HTML 4.0

ставленной на рис. 1.1. Если этот код непонятен вам, не беспокойтесь; элементы язы­
ка HTML мы детально обсудим в последующих главах. Однако даже с первого взгляда
можно заметить некоторые особенности HTML-документа. Так, например, из данно­
го листинга видно, что в нем содержится текст документа и набор дескрипторов, за­
ключенных в угловые скобки. Некоторые (но не все) языковые элементы представ­
ляют собой пары дескрипторов <ИМЯ> и </ИМЯ>.
На рис. 1.1 показано, как отображается Web-страница в окне конкретного броузера
(Internet Explorer 5.0), выполняющегося в операционной среде Windows 2000 Profes­
sional. Основные установки для данного броузера (начертание, размер и цвет символов)
заданы пользователем. Характеристики отображения, не указанные пользователем, оп­
ределяет сам броузер. Если Web-страница должна отображаться в броузерах различных
типов, попытки автора жестко задать внешний вид документа, как правило, заканчива­
ются неудачей. В главе 5 вы познакомитесь с каскадными листами стилей, которые пре­
доставляют авторам дополнительные возможности по управлению отображением Web-
страниц. Однако даже в этом случае автор не имеет полного контроля над внешним ви­
дом своих документов.

•а«е for lewrencc! М. шпнмш ~9тсжттк тттасштттш ..JOJJcj


Ele £dft ilew Favorites look jjelp
^ - *4 - : ^ ^ ^ -^Search JJFuvorte* ^Hetory -Ji' ^ Щ - J

d
Home Page for Lawrence M. Brown
Senior Network Engineer
Naval Surface Waifai-e Center
9500 MacArthor Boulevard
West Bethesda. Maryland. MD 20817-5700
email: lan7@corewebpro.eyttrmx^^ com
CAKOf KOcii^^oiYiSfON JNSI^f\/C^ Phone: (30 \) 277-4648

This IS my personal home page For more specific programmmg-related resoxirces pages, please see

'ёЗ

Рис. 1.1. Документ, код которого приведен в листинге 1.1, отоб­


ражается в окне броузера Internet Explorer 5.0, выполняющегося в
среде Windows 2000

Листинг 1.1. HTML-код простой \Л/еЬ-страницы

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<Title>Home Page for Lawrence M. Brown</Title>
</HEAD>
<BODY BGCOLOR="WHITE">
<H1 ALIGN="CENTER">Home Page for Lawrence M. Brown</Hl>
<HR>
<IMG SRC="images/navsea-nswc.gif" WIDTH=300 HEIGHT=117
HSPACE=10 VSPACE=5 ALIGN="LEFT" ALT="NSWC Logo">
Senior Network Engineer<BR>
<A HREF="http://www.dt.navy.mil/">
1 . 2 . HTML 4 . 0 и д р у г и е стандарты HTML 37

Naval Surface Warfare Center</A><BR>


9500 MacArthor Boulevard<BR>
West Bethesda, Maryland, MD 20817-5700<BR>
< I > e m a i l : < / I > <A H R E F = " m a i l t o : l a r r y @ c o r e w e b p r o g r a i r a n i n g . с о ш " >
larry@corewebprogramming.com</A><BR>
<I>Phone:</I> (301) 277-4648<BR CLEAR="ALL">
<P>
T h i s i s my p e r s o n a l home p a g e . For more s p e c i f i c
programming-related resources pages, please see:
< ! - - О с т а л ь н а я ч а с т ь Web-страницы з д е с ь не п р и в о д и т с я —>
</BODY>
</HTML>

На з а м е т к у

Попытки явно задать внешний вид документов, которые должны


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

П р и разработке Web-страниц могут возникнуть дополнительные трудности, свя­


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

1.2. HTML 4.0 и другие стандарты HTML


Помимо проблем, связанных с отображением в различных броузерах, авторы Web-
страниц должны принимать во внимание изменения в спецификации HTML. До января
1997 г. широко использовался стандарт HTML 2.0, разработанный W3C (World Wide
Web Consortium). Спецификация HTML 2.0 описывала возможности, типичные для
броузеров, созданных в середине 1994 г. Еще до того, как была опубликована HTML 2.0,
проводились работы по созданию спецификации нового поколения. Вначале эта спе­
цификация называлась HTML+, а затем получила название HTML 3.0. Однако основные
производители Web-броузеров не стали поддерживать эту спецификацию. В качестве
промежуточного варианта при переходе к новому стандарту была предложена специ­
фикация HTML 3.2 (в процессе разработки она имела кодовое название "Wilbur").
HTML 3.2 уместнее было бы назвать HTML 2.3, поскольку в ней были учтены не все
средства HTML 3.0. Наконец, в декабре 1997 г. появился стандарт HTML 4.0.
Следует заметить, что современные броузеры не поддерживают H T M L 4.0 в пол­
ном объеме. Наиболее соответствуют данной спецификации Netscape 4.0 и последую­
щие версии, а также Internet Explorer 4.0 и более поздние версии (реализации 3.x
данных броузеров поддерживали только HTML 3.2). П о сравнению с HTML 3.2 в
HTML 4.0 были внесены следующие изменения.
• Дополнительные возможности поддержки ф р е й м о в .
• Рекомендации по использованию листов стилей вместо непосредственного
форматирования элементов и атрибутов.
38 Глава 1 . Создание Web-страниц с помощью HTML 4.0

• Улучшенные средства выравнивания ячеек в таблицах и возможность группи­


ровки строк и столбцов.
• Поддержка событий, связанных с мышью и клавиатурой.
• Поддержка различных языков.
• Дополнительная поддержка невизуальных броузеров.
После п р и н я т и я в 1997 г. H T M L 4.0 в качестве стандарта была предложена специ­
ф и к а ц и я H T M L 4.01, в которой были исправлены незначительные ошибки предыду­
щей спецификации и добавлены н е к о т о р ы е атрибуты. HTML 4.01 была п р и н я т а W3C
24 декабря 1999 г. HTML 4.01 важна потому, что на ней базируется новая специфика­
ция X H T M L 1.0, предназначенная для поддержки XML в Web-страницах. В этом слу­
чае H T M L 4.01 используется для и н т е р п р е т а ц и и HTML-дескрипторов. XML позволя­
ет определять ф о р м а т ы данных для электронной коммерции, векторной графики и
многих других применений. П о д р о б н о язык XML будет обсуждаться в главе 23. Спе­
ц и ф и к а ц и я XHTML 1.0 была о ф и ц и а л ь н о принята 26 января 2000 г.
Электронные копии спецификации H T M L можно найти по следующим адресам:

H T M L 4.01
http://www.w3.org/TR/html401/

H T M L 4.0
h t t p : / / w w w . w 3 . o 3 r g / T R / 1 9 98/REC-html4 0 - 1 9 9 8 0 4 2 4 /

H T M L 3.2
http://www.w3.org/TR/REC-html32.html

1.3. Порядок публикации документа в Web


Для того чтобы опубликовать документ в Web, надо выполнить следующие действия.
1. Создать HTML-документ.
2. Разместить документ так, чтобы он был доступен из Web.
3. Убедиться в том, что HTML-код создан корректно и вид отображаемого доку­
мента соответствует вашим замыслам.

Создание документа
Поскольку в HTML-файле содержится ASCII-текст, для создания HTML-документа
можно воспользоваться обычным текстовым редактором, н а п р и м е р Notepad,
UltraEdit, emacs или BBEdit. Также документ можно создать с помощью HTML-
редактора, например, HomeSite, FrontPage или Dreamweaver. Наконец, можно авто­
матически преобразовать в HTML-формат документ, созданный в текстовом процес­
соре, таком как Microsoft Word или WordPerfect. Поскольку H T M L — это не язык опи­
сания страниц, а логический язык разметки, преобразованный документ может не­
сколько отличаться от документа, созданного посредством текстового процессора, и
потребовать небольшой коррекции.
1.3. Порядок публикации документа в Web 39

Следует заметить, что броузеры обеспечивают большую гибкость в представлении


документов и обычно пользователь может самостоятельно выбирать шрифт и цвет
для отображения Web-страницы. В результате использование HTML-редакторов
"WYSIWYG" (What You See Is What You Get) затрудняется; no крайней мере, это спра­
ведливо при отсутствии каскадных листов стилей. С другой стороны, автор всегда
может сформировать документ с учетом установок по умолчанию конкретного бро­
узера. В любом случае HTML-редакторы экономят много времени при разработке
Web-страниц; большинство из них предоставляют визуальные средства для размеще­
ния таблиц и фреймов, многие редакторы поддерживают каскадные листы стилей.
Выбирая HTML-редактор, следует отдать предпочтение тому и них, который позво­
ляет непосредственно редактировать HTML-код. Дело в том, что при создании Web-
документа вы обязательно захотите использовать средства, которые не поддержива­
ются конкретным редактором и, следовательно, недоступны через его графический
пользовательский интерфейс. Перед тем как размещать готовую Web-страницу на
сервере, необходимо проверить синтаксис HTML-кода и убедиться, что внешний вид
документа не отличается от задуманного вами.

Размещение документа в Web


Для того чтобы HTML-документ был доступен Internet-пользователям, он должен
находиться на компьютере, подключенном к Internet, кроме того, на этом компьюте­
ре должен работать HTTP-сервер. Если у вас нет Internet-доступа, вам надо ознако­
миться с предложениями поставщиков Internet-услуг (провайдеров), которые публи­
куются в прессе и рекламных проспектах. Некоторые авторы создают свои Web-
страницы на том же компьютере, на котором они впоследствии будут размещены. Так
обычно поступают сотрудники коммерческих и некоммерческих организаций и учеб­
ных заведений. Нередко авторы создают Web-страницы на персональных компьюте­
рах дома или в офисе, а затем копируют их на сервер. В этом случае необходимо про­
верить, что каталог, в который скопирован документ, доступен из Internet. Подробно
этот вопрос обсуждается в последующих разделах.

Создание каталога для документа


На компьютере, на котором предполагается разместить Web-страницу, должен
выполняться HTTP-сервер. Подробно HTTP (HyperText Transfer Protocol — протокол
передачи гипертекстовой информации) будет обсуждаться в главе 19. Сейчас же вам
достаточно знать, что HTTP — это протокол, посредством которого WWW-клиенты
(броузеры) взаимодействуют с системами, на которых размещены Web-страницы.
Программа, обрабатывающая клиентские запросы, называется HTTP-сервером.
HTTP-сервер получает от клиента URL (Uniform Resource Locator — унифицирован­
ный локатор ресурсов), который можно рассматривать как "адрес" документа в Web, и
преобразует его в путь и имя файла в конкретной операционной системе. Обычно,
если клиент запрашивает файл из пользовательского каталога, сервер ищет его в под­
каталоге p u b l i c h t m l или www. Этот каталог не указан в URL, но отражает реальное
расположение файла. Конкретное имя каталога для размещения HTML-документов
автору сообщает системный администратор.
40 Глава 1 . Создание Web-страниц с помощью HTML 4.0

Часто провайдеры предоставляют авторам Web-страниц пространство на своих


серверах. В этом случае авторы передают HTML-документы на сервер провайдера по­
средством FTP. Как правило, перед тем как сообщить пользователю регистрационное
имя и пароль, администратор провайдера создает исходную структуру каталогов. Со­
трудники корпораций и учебных заведений обычно уже имеют учетные записи на
Web-сервере. Работая в системе UNIX, пользователь должен сначала создать каталог,
доступный из Web (как правило, имя этого каталога p u b l i c h t m l или www), а затем
скопировать в созданный каталог свои Web-страницы.
Предположим, что пользователь j a n e d o e собирается опубликовать документ
t e s t . h t m l на сервере www. s o m e - i s p . com. В этом случае ему надо скопировать файл
t e s t . h t m l в каталог / h o m e / j a n e d o e / p u b l i c _ h t m l . Здесь / h o m e / j a n e d o e — рабо­
чий каталог пользователя, а p u b l i c h t m l — специальный "скрытый" каталог, ис­
пользуемый Web-сервером. П р и обращении из Web URL данного документа будет
иметь вид h t t p : / / w w w . s o m e - i s p . c o m / ~ j a n e d o e / t e s t . h t m l .
Символ "--" обычно интерпретируется как "рабочий каталог пользователя". Неко­
т о р ы е программы используют кодировку ASCII или ISO Latin 1, поэтому в н е к о т о р ы х
случаях вместо "~" вы встретите последовательность символов "%7Е". Таким образом,
h t t p : / / s o m e . h o s t / % 7 E u s e r / p a t h — это допустимый URL.

Копирование файла в каталог


Если вы работаете на том же компьютере, на котором выполняется HTTP-сервер,
вы, наверное, будете создавать HTML-документы непосредственно в том каталоге, в
котором они должны быть размещены ( p u b l i c h t m l ) . Если вы предполагаете распо­
ложить документ на удаленном узле, для копирования файла вам придется воспользо­
ваться FTP-клиентом, например F e t c h — в системе Мае, f t p . e x e — в Windows
9 5 / 9 8 / 2 0 0 0 / N T или / u s r / b i n / f t p — в системе UNIX. Н е забывайте, что во многих
операционных системах имена файлов зависят от регистра символов.
В дополнение к "скрытому" каталогу по умолчанию многие HTTP-серверы использу­
ют имя файла по умолчанию. О н о применяется в том случае, когда в составе URL задан
только каталог, а файл не указан. Как правило, по умолчанию используются имена
i n d e x . h t m l . Welcome . h t m l и d e f a u l t . h t m l . Часто вместо . h t m l используется . htm.
Если исходная страница пользователя j a n e d o e расположена в файле / h o m e / j a n e d o e /
p u b l i c _ h t m l / i n d e x . h t m l , обращаясь к ней, достаточно указать h t t p : / / w w w . s o m e -
i s p . c o m / - j a n e d o e / . Можно также задать полный URL, включающий имя файла. Он
будет выглядеть так: h t t p : //www. s o m e - i s p . c o m / ~ j a n e d o e / i n d e x . h t m l .

Установка прав доступа к файлу и каталогу


Для того чтобы файл был доступен из Web, файл и каталог, в котором он располо­
жен, должны быть разрешены для чтения процессу HTTP-сервера. Поскольку HTTP-
сервер о б ы ч н о выполняется в непривилегированном режиме, данное требование оз­
начает, что доступ к файлу и каталогу должен быть разрешен всем пользователям.
Многие провайдеры, серверы которых работают под управлением UNIX, устанавли­
вают требуемые права по умолчанию, поэтому описанные ниже действия могут не по­
надобиться. Для того чтобы определить установки, пользователю UNIX достаточно
проверить значение umask. П р и необходимости требуемые права в системе UNIX мо­
гут быть установлены с помощью следующих команд:
1.4. Структура H T M L - д о к у м е н т а 41

Unix> cd
Unix> chmod a+x .
Unix> cd public_html
Unix> chmod a+x .
Unix> chmod a+r file
Поскольку Web-броузеры помимо HTML-документов позволяют также отображать
обычные текстовые ф а й л ы , для проверки доступа можно создать файл t e s t . t x t , со­
держащий одну строку текста, например последовательность символов "Hello!". Этот
файл надо поместить в соответствующий подкаталог вашего рабочего каталога и по­
пытаться обратиться к нему, задавая URL h t t p : / / y o u r . i s p . c o m / ' - y o u r -
a c c o u n t / t e s t . t x t . Если вы увидите в окне броузера содержимое данного файла, это
значит, что вам не надо предпринимать никаких действий по установке прав доступа.

Проверка документа
Разместив документ в Web, вам надо проверить, нет ли в нем синтаксических оши­
бок. Полезно просмотреть Web-страниц)' в окне броузера, но этого недостаточно. Дело
в том, что, встретив некорректный HTML-документ, броузер пытается "угадать", как он
должен выглядеть на самом деле. Однако различные броузеры могут интерпретировать
такой документ по-рг1зному, и не исключено, что фрагменты Web-страницы, которая
выглядит нормально в одном броузере, отобразятся совсем по-другому или вовсе не бу­
дут отображаться в другом. Так как HTML определяется посредством SGML (Standard
Generalized Markup Language— общий стандартный язык разметки), спецификация
SGML может быть использована для проверки соответствия документа синтаксису
HTML. Некоторые HTML-редакторы автоматически контролируют такое соответствие.
Кроме того, вы можете воспользоваться свободно распространяемыми программами
проверки. Самая популярная из них— W3C HTML Validator Service. Более подробная
информация расположена на следующих URL:
• http://validator.w3.org/
• http://www.htmlhelp.com/tools/validator/
• http://jigsaw.w3.org/css-validator/

М е т о д и к а профессионалов

"Доверяй, но проверяй": убедитесь в отсутствии синтаксических оши­


бок на ШеЬ'Странице, используя для этого программу проверки HTML

1-4. Структура HTML-доку мента


HTML-элементы определяются посредством дескрипторов, помещенных в угловые
скобки. Н а п р и м е р , <TITLE> представляет собой начальный, или открывающий, деск­
риптор элемента TITLE. Д е с к р и п т о р ы предоставляют броузеру описания элементов,
но не отображаются на экране. Дополнительная и н ф о р м а ц и я об HTML-элементах за­
дается посредством атрибутов, которые записываются в ф о р м е атрибут-значение. На­
пример, в дескрипторе <IMG S R C = ^ ' i m a g e s / s a m p l e . g i f " > последовательность
42 Глава 1 . Создание Web-страниц с помощью HTML 4.0

i m a g e s / s a m p l e . g i f является значением атрибута SRC элемента IMG. Если в составе


значения атрибута присутствуют символы, отличные от букв или ц и ф р , это значение
должно быть заключено в кавычки. Поэтому имеет смысл представлять в кавычках все
значения атрибутов, за исключением целых чисел. Все имена HTML-элементов и ат­
рибутов не зависят от регистра символов, однако это не относится к значениям атри­
бутов. Л и ш н и е пробелы, присутствующие в тексте документа, а также рядом с имена­
ми элементов и атрибутов, игнорируются, но в составе значений атрибутов пробелы
учитываются. Для сравнения, в спецификации XHTML L0 имена элементов должны
быть представлены символами нижнего регистра, а значения атрибутов, содержащие
ц и ф р ы , заключаются в кавычки. Это соответствует правилам XML (см. главу 23).
Н е к о т о р ы е элементы являются контейнерами, т.е. включают открывающий, или на­
чальный, дескриптор (например, <BODY>) и закрывающий, или конечный, дескриптор,
начинающийся символами " < / " (например, </BODY>). Другие элементы определяют­
ся лишь посредством открывающего дескриптора (например, <HR>). Если броузер не
может распознать HTML-элементы или атрибуты, он игнорирует их. Текст документа
всегда обрабатывается, даже если он содержится между недопустимыми открываю­
щим и закрывающим дескрипторами. Комментарии помещаются между наборами
символов " < ! — " и " - - > " . Текст комментариев может располагаться в нескольких
строках, но не должен включать символы " - - " .

Шаблон HTML -документа


HTML-документ начинается с декларации DOCTYPE, в которой задается версия
HTML. И н ф о р м а ц и я о версии используется броузером или программой проверки.
После DOCTYPE следует элемент HTML, содержащий элементы HEAD и BODY. Элемент
HEAD, в свою очередь, содержит элемент TITLE. Элемент BODY, непосредственно сле­
дующий за элементом HEAD, о б ы ч н о начинается с заголовка первого уровня (HI), за
которым располагается содержимое Web-страницы.
П о правде говоря, из всех перечисленных компонентов шаблона обязательны
лишь выражение DOCTYPE и элемент TITLE. Элементы HEAD и BODY подразумеваются
броузером. Однако начинать разработку HTML-документа рекомендуется с вышена­
званного шаблона. HTML-редактор можно сконфигурировать так, что он будет авто­
матически включать необходимые дескрипторы при открытии нового документа.
На рис. L2 показан внешний вид шаблона HTML-документа, представленного в лис­
тинге L2. С такого шаблона удобно начинать создание всех Web-страниц, соответст­
вующих спецификации HTML 4.0 (за исключением документов с фреймами, описанных
в главе 4).
-iq|.xf
file Ее» view €о Coiwwjnfc«tor Шр

^ i' а Л ^ - й1 '> ii^ Э i


Main Heading

pocument: Oortc
.,M .:^:..
Рис. 1.2. Шаблон HTML 4.0, отображаемый в окне
броузера Netscape 4.7, который выполняется в
среде Windows 2000 Professional
1.4. Структура НТМЬ-документа 43

Листинг 1.2. HTML4 . 0~Template, html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Title</TITLE>
</HEAD>

<BODY>
<Hl>Main Heading</Hl>
<!-- Остальная часть Web-страницы -->
</BODY>
</HTML>

Декларация DOCTYPE
в зависимости от содержимого HTML-документа могут использоваться т р и вари­
анта декларации DOCTYPE.

Строгая д е к л а р а ц и я H T M L 4.01 D O C T Y P E
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

П р о м е ж у т о ч н а я д е к л а р а ц и я H T M L 4.01 D O C T Y P E

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 1 Transitional//EN">

Д е к л а р а ц и я H T M L 4.01 D O C T Y P E д л я р а б о т ы с ф р е й м а м и

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 1 Frameset//EN">


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

Э л е м е н т ы H T M L 4.01
http://www.w3.org/TR/html4/index/elements.html

Атрибуты H T M L 4.01
http://www.w3.org/TR/html4/index/attributes.html

Декларация H T M L для работы с ф р е й м а м и указывается в тех документах, к о т о р ы е


оформляются как набор ф р е й м о в (frame).
44 Глава 1 . Создание Web-страниц с помощью HTML 4.0

Н и ж е приведено подробное описание элемента H T M L и его атрибутов. В данной


книге для представления элементов языка HTML используется единый формат. Имя
элемента сопровождается списком обязательных атрибутов. Многоточие (...) означа­
ет, что в составе открывающего дескриптора могут присутствовать дополнительные
сведения или необязательные атрибуты. За открывающим дескриптором следует за­
крывающий дескриптор, либо явно указывается, что закрывающий дескриптор отсут­
ствует. Атрибуты перечисляются в том порядке, в каком о н и наиболее часто встреча­
ются в реальных документах. Атрибуты, не соответствующие спецификации HTML 4.0,
но поддерживаемые Netscape или Internet Explorer, помечаются как "нестандартные".
Предполагается, что каждый HTML-элемент и атрибут опробован в английской вер­
сии Netscape 4.08-4.7 либо Internet Explorer 4.01-5.5.

Элемент: <HTML •..> ... </HTML>


Атрибуты: LANG, DIR, VERSION
Элемент HTML непосредственно следует за выражением DOCTYPE и представляет
собой контейнер, содержащий элементы HEAD и BODY. В составе дескриптора HTML мо­
гут присутствовать атрибуты, с помощью которых задаются язык документа, направле­
ние текста и HTML-версия кода. В большинстве случаев открывающий и закрывающий
дескрипторы HTML могут быть безболезненно удалены, поскольку броузеры по исход­
ному коду документа определяют, что он создан на языке HTML. Однако, для того что­
бы документ соответствовал стандарту, дескрипторы HTML должны быть указаны.

LANG
Атрибут LANG представляет в закодированном виде язык, на котором создан доку­
мент. Современные броузеры интерпретир)тот атрибут LANG как источник дополни­
тельной информации, не влияющей на порядок представления документа. Однако
сведениями, содержащимися в атрибуте LANG, могут воспользоваться поисковые
серверы и средства проверки орфографии. Список кодовых названий языков вы
найдете в документе RFC 1766. Чтобы скопировать RFC, можно обратиться к одном}^
из архивов, описанных в документе h t t p : //www. r f c - e d i t o r . o r g / .

DIR
Атрибут DIR определяет направление следования текста: LTR (left-to-right— слева
направо) или RTL (right-to-left— справа налево). Internet Explorer поддерживает
атриб)^ DIR, но в зависимости от кодировки направление ASCII-символов может
изменяться. Поскольку данный атрибут не поддерживается Netscape (в частности,
Netscape 4.7 и более ранними версиями), его следует использовать только в сетях
intranet, о р и е н т и р о в а н н ы х исключительно на Internet Explorer.

Внимание!

Netscape не поддерживает атрибут DIR элемента HTML,

VERSION
Атрибут VERSION задает версию HTML для документа. Такая и н ф о р м а ц и я избы­
точна и данный атрибут применяется редко. Версию H T M L броузер может опре-
1.5. Элемент HEAD — высокоуровневая информация... 45

делить из выражения DOCTYPE. Стандартом H T M L 4.0 атрибут VERSION не реко­


мендован для применения.

Спецификация HTML предполагает использование атрибутов LANG и DIR во всех


элементах, за исключением APPLET, BASE, BASEFONT, BR, FRAME, FRAMESET,
IFRAME, NOFRAMES, PARAM и SCRIPT. Поэтому LANG и DIR отдельно обсуждаться не
будут и рассмотрение их заканчивается в рамках элемента HTML.

1.5. Элемент HEAD — высокоуровневая


информация о Web-странице
Элемент: <HEAD>.,. </HEAD>
Атрибуты: PROFILE
Раздел HEAD — первый раздел HTML-документа. Он располагается после деклара­
ции DOCTYPE и открывающего дескриптора <HTML>, перед разделом BODY. В составе
HEAD должен присутствовать элемент TITLE, который часто является единственным
элементом данного раздела. Атрибут PROFILE не влияет на отображение документа в
окне броузера, но предоставляет и н ф о р м а ц и ю , которой могут воспользоваться поис­
ковые серверы, броузеры, не отображающие документы, серверы индексации и дру­
гие программы. Атрибут PROFILE определяет URL файла, предоставляющего допол­
нительную и н ф о р м а ц и ю поисковым серверам для разбора метаданных в разделе HEAD
(элемент МЕТА будет обсуждаться далее в этом разделе). Спецификация H T M L также
предусматривает для элемента HEAD атрибуты LANG и DIR. Эти два атрибута были рас­
смотрены выше.

Обязательный элемент в составе HEAD


Элемент: <TITLE> ... </TITLE>
Атрибуты: отсутствуют
Элемент TITLE обязателен в составе документа HTML 4.0 и содержит текст заголов­
ка. В состав TITLE не мог)^ входить другие HTML-дескрипторы, однако данный элемент
может включать текстовые примитивы, например &сору для отображения символа "©"
(обратитесь к табл. 2.1 в главе 2). Содержимое элемента TITLE представляется в заго­
ловке окна броузера. Кроме того, Netscape и Internet Explorer отображают текст, нахо­
дящийся в составе TITLE, в верхней части страницы, выводимой на печать. Следует
различать элемент TITLE и основной заголовок Web-страницы. Содержимое элемента
TITLE, в отличие от основного .заголовка, не отображается в составе самого документа.
Спецификация HTML 4.0 позволяет указывать в открывающем дескрипторе TITLE ат­
рибуты LANG и DIR, но они не поддерживаются Netscape и Internet Explorer. Использо­
вание символов, не принадлежащих набору ASCII, приведет к тому, что в заголовке окна
будет отображаться имя файла, содержащего код документа.
46 Глава 1 . Создание Web-страниц с помощью HTML 4.0

Необязательные элементы в составе HEAD


в дополнение к элементу TITLE в состав HEAD могут быть включены элементы
BASE, МЕТА, BGSOUND и LINK. Как правило, эти элементы используют на своих Web-
страницах о п ы т н ы е авторы. Если вы только начинаете работу с HTML, вам лучше от­
казаться от п р и м е н е н и я указанных средств до тех п о р , пока вы не приобретете доста­
точные навыки в использовании более важных и чаще встречающихся элементов.

Элемент: <BASE HREF="..." ...> (закрывающий дескриптор отсутствует)


Атрибуты: HREF (обязательный), TARGET
Элемент BASE определяет базовую позицию для относительных URL. Относительными
называются не полностью заданные URL, в которых присутствует имя файла, но не ука­
зан протокол или имя узла. Базовой позицией считается каталог, из которого был за­
гружен текущий документ. Если документ будет скопирован на др)той узел, а вспомога­
тельные документы останутся на прежнем месте, с помощью элемента BASE можно до­
биться, чтобы относительные URL по-прежнему указывали на корректные позиции.
Атрибут HREF явно указывает базовую позицию для всех относительных URL. Предпо­
ложим, что документ h t t p : / / w w w . m i c r o s o f t . c o m / w i n d o w s 2 0 0 0 . h t m l должен быть
скопирован на зеркальные серверы www. a p p l e . com и www. s u n . com. В этом случае мож­
но использовать элемент BASE. В результате элемент HEAD приобретет следующий вид:
<HEAD>
<TITLE>Why You S h o u l d Buy Windows 2000</TITLE>
<BASE H R E F = " h t t p : / / w w w . m i c r o s o f t . c o m / w i n d o w s 2 0 0 0 / " >
</HEAD>
Атрибут TARGET может применяться для отображения выбранных ссылок в новом
окне либо, если используются ф р е й м ы , позволяет задать ф р е й м по умолчанию для
отображения документа, на который указывает выбранная ссылка. Часто авторы Web-
страниц включают в свои документы выражение <BASE TARGET=" . . . "> (без обяза­
тельного атрибута HREF), чтобы перенаправить все ссылки на странице в указанный
фрейм. Подробно работа с фреймами будет обсуждаться в главе 4.

Элемент: <МЕТА ...> (закрывающий дескриптор отсутствует)


Атрибуты: NAME, CONTENT (обязательные), HTTP-EQUIV, SCHEME
Элементы МЕТА позволяют записывать и н ф о р м а ц и ю о документе, перенаправлять
и обновлять Web-страницы, а также включать звуковые файлы. К о н к р е т н ы й способ
использования дескрипторов МЕТА для записи и н ф о р м а ц и и о документе изменяется в
зависимости от системы. Как привило, данные в дескрипторе МЕТА задаются в виде
пар NAME-CONTENT, где NAME представляет имя свойства, а CONTENT — его значение.
Обычно с именем связываются такие записи, как a u t h o r (автор документа), d e ­
s c r i p t i o n (краткое описание), k e y w o r d s (ключевые слова, разделенные запятыми,
предназначенные для использования поисковыми серверами) и g e n e r a t o r (програм­
ма, с помощью которой документ был сгенерирован). Такие поисковые серверы, как
Google, Infoseek и Lycos, используют запись k e y w o r d s для индексирования (но игно­
рируют всю запись, если слово встречается больше семи раз). Запись d e s c r i p t i o n
эти серверы используют, предоставляя пользователю описание документа. В листинге
1.3 демонстрируется применение дескриптора МЕТА.
1.5. Э л е м е н т HEAD — высокоуровневая и н ф о р м а ц и я . . . 47

Листинг 1.3. Пример раздела HEAD, содержащего дескриптор МЕТА

<HEAD>
<TITLE>Why You Should Buy Windows 2000</TITLE>
<BASE HREF="http://www.microsoft.com/windows2000/">
<META NAME="author" CONTENT="Bill Gates">
<META NAME="keywords"
CONTENT="Windows,Advocacy,OS,Operating Systems">
<META NAME="description"
CONTENT="A summary of the advantages of Windows 2000.">
</HEAD>

Атрибут HTTP-EQUIV позволяет обновлять страницы, используя значение R e f r e s h .


Предположим, что электронная версия газеты содержит заголовки, которые время от
времени изменяются. Чтобы отобр?13Ить эти изменения, страница должна обновляться
каждые 30 минут (1800 секунд). Предположим также, что одна из Web-страниц находит­
ся по адресу h t t p : / / w w w . m i c r o s o f t . c o m / w i n d o w s 2 0 0 0 / B u y - W i n 2 0 0 0 . h t m l . В лис­
тинге 1.4 показано, как может быть использован дескриптор МЕТА для автоматического
обновления документа на экране. Для этого задается выражение НТТР-
EQUIV=" Re f r e s h " , а в качестве значения атрибута CONTENT указывается время (1800
секунд), по истечении которого страница должна быть перезагружена.

Л и с т и н г 1.4. Web-страница автоматически перезагружается каждые 3 0 минут

<HEAD>
<TITLE>Why You Should Buy Windows 2000</TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="1800">
</HEAD>

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


расположенный по другому URL (листинг 1.5). Такой подход применяется тогда, ко­
гда URL документа изменился и автор собирается автоматически перенаправить
пользователя к новому URL. Новая страница автоматически отобразится на экране
броузера по истечении 5 секунд. Ч т о б ы это произошло, надо задать значение атрибу­
та HTTP-EQUIV, равное R e f r e s h , и указать новый URL документа. П р и этом в неко­
т о р ы х броузерах после щелчка на кнопке Взск снова отобразится документ, содер­
жащий дескриптор МЕТА. Этот дескриптор снова перенаправит пользователя к тому
документу, который он просматривал перед тем, как активизировать кнопку Взск.

Л и с т и н г 1.5. Перенаправление по новому адресу

<HEAD>
<TITLE>Why You Should Buy Windows 2000 (New Address)</TITLE>
<META HTTP-EQUIV="Refresh"
C0NTENT="5;
URL=http://www.apple.com/Buy-Win2000.html">
</HEAD>
48 Глава 1 . Создание Web-страниц с помощью HTML 4.0

Если заданный URL указывает на звуковой файл в формате, который поддержива­


ется клиентской программой, некоторые броузеры начинают воспроизводить такой
файл. Для организации звукового сопровождения существуют также другие способы.
Так, Internet Explorer поддерживает элемент BGSOUND (который будет описан ниже);
кроме того, и Netscape, и Internet Explorer позволяют использовать для некоторых
типов звуковых файлов элемент EMBED. Однако будьте осторожны: если при посеще­
нии узла автоматически начинается воспроизведение звука, пользователь может вос­
принять это как ошибку.
Атрибут HTTP-EQUIV позволяет также задавать значение CHARSET для представ­
ления текста в окне броузера. Так, например, следующий дескриптор МЕТА указывает
на то, что для всего текста преобразование байтовой последовательности в символы
должно выполняться согласно кодировке GB2312:

<МЕТА HTTP-EQUIV="Content-type"
CONTENT="text/html; CHARSET=GB2312">
Стандарты ISO определяют отображение символов для многих языков. Практиче­
ски все наборы включают стандартные ASCII-символы, поэтому в составе документа,
составленного на любом языке, можно расположить английский текст. Если документ
содержит текст на нескольких языках, его надо представить с помощью символов в
16-битовом ф о р м а т е Unicode. В настоящее время широко распространен вариант
Unicode UTF-8, где каждый 16-битовый символ Unicode преобразуется в байтовую по­
следовательность, причем ASCII-символ занимает лишь 8 бит. Дополнительную ин­
ф о р м а ц и ю о применении Unicode для представления документов на нескольких язы­
ках можно найти по адресу h t t p : //wwv/. U n i c o d e . o r g / .
С помощью HTTP-EQUIV можно управлять содержимым заголовка HTTP-ответа,
значение заголовка задается с помощью CONTENT. HTTP-EQUIV представляет собой
простое расширение (поддерживаемое как Netscape, так и Internet Explorer), которое
"устанавливает" заголовок, не прибегая к его генерации. Подробная и н ф о р м а ц и я о
HTTP-заголовках приведена в главе 19.
Атрибут SCHEME задает формат значения свойства, представленного с помощью
пары NAME-CONTENT дескриптора МЕТА. Здесь также NAME определяет имя свойства, а
CONTENT — его значение. В приведенном ниже примере атрибут SCHEME указывает,
что дата задана в формате месяц-день-год (SCHEME="Month-Day-Year"), в отличие
от европейского формата день-месяц-год.
<МЕТА SCHEME="Month-Day-Year"
NAME="Date"
VALUE="05-01-2000">
Атрибуты LANG и DIR элемента МЕТА игнорируются.

Элемент: <BGSOUND SRC="..." ...> (закрывающий дескриптор


отсутствует)
Атрибуты: SRC (обязательный), LOOP
Это нестандартный элемент, поддерживаемый Internet Explorer и предназначен­
ный для воспроизведения звуковых файлов. Элемент BGSOUND может присутствовать
как в составе элемента BODY, так и в элементе HEAD.
1.5. Элемент HEAD — высокоуровневая информация... 49

SRC
Атрибут SRC задает URL звукового файла, который должен быть представлен в
формате . wav, . a u или MIDI.

LOOP
Атрибут LOOP определяет, сколько раз должен быть воспроизведен звуковой файл.
По умолчанию принимается значение 1. Значение, равное - 1 , или INFINITE, приве­
дет к тому, что воспроизведение файла будет повторяться непрерывно до тех пор,
пока пользователь не перейдет к другой странице или не завершит сеанс работы с
броузером.

Элемент: <SCRIPT TYPE="..." ...> ... </SCRIPT>


Атрибуты: LANGUAGE, SRC, ТУРЕ ( о б я з а т е л ь н ы й ) , CHARSET, DEFER
ЭлСхМент SCRIPT применяется для включения программ, которые обычно написаны
на языке JavaScript. Подробно программы на JavaScript будут рассмотрены в главе 24.

Элемент: <STYLE TYPE="..." ...> ... </STYLE>


Атрибуты: TYPE (обязательный), TITLE, MEDIA
Элемент STYLE определяет каскадные листы стилей — чрезвычайно удобное сред­
ство, позволяющее задавать ш р и ф т ы , цвета, изображение заднего плана, границы и
другие характеристики, к о т о р ы е применяются к различным элементам документа.
Подробно листы стилей будут обсуждаться в главе 5.

Элемент: <LINK ...> (закрывающий дескриптор отсутствует)


А т р и б у т ы : HREF, REL, REV, TYPE, CHARSET, HREFLANG, MEDIA, ONCLICK, ONDBLCLICK,
ONMOUSEDOWN, ONMOUSEUP, ONMOUSEOVER, ONMOUSEMOVE, ONMOUSEOUT, ONKEYPRESS,
ONKEYDOWN, ONKEYUP, TARGET. TITLE, I D , CLASS, STYLE
Элемент LINK предоставляет и н ф о р м а ц и ю о месте данной страьп^цы в наборе до-
K}TvieHTOB. П р и этом определяются расположение таблицы, определяющей содержа­
ние, предыдущий и последующий документы набора и другие данные. В разделе HEAD
может содержаться несколько элементов LINK.

HREF, REL, REV


Атрибут HREF задает URL связанного документа. Атрибут REL определяет отноше­
ние связанного документа к текущему, а REV задает отношение текущего документа
к указанному. Наиболее часто встречаются отношения CONTENTS, INDEX,
GLOSSARY, HELP, NEXT и PREVIOUS (они используются для перемещения между
документами), MADE (определяет автора документа) и STYLESHEET (для связи с
каскадными листами стилей). Н и ж е приведен пример использования указанных
атрибутов.
<LINK REL=STYLESHEET
HREF="My-Styles.CSS"
TYPE="text/css">
50 Глава 1 . С о з д а н и е W e b - с т р а н и ц с п о м о щ ь ю HTML 4 . 0

TYPE, CHARSET, HREFLANG, MEDIA


Атриблт TYPE задает MIME-тип ресурса, на который указывает ссылка. П р и м е р о м
определения МШЕ-типа может служить выражение TYPE=" t e x t / h t m l " . MIME-
т и п ы , описанные в документе RFC 1521 (список архивов, содержащих наборы
RFC, находится по адресу h t t p : / / w w w . r f c - e d i t o r . o r g / ) , определяют ф о р м а т ы
различных типов файлов, например t e x t , pdf, g i f . Атрибут CHARSET определяет
кодировку символов для документа, на к о т о р ы й указывает ссылка. П р и м е р о м мо­
жет служить выражение CHARSET="ISO-8859-6". Атрибут HREFLANG задает язык
связанного документа. Н а п р и м е р , выражение HREFLANG="pt" сообщает, что до­
кумент, на который указывает ссылка, написан на португальском языке. Атрибут
MEDIA задает среду для воспроизведения связанного документа. Допустимыми зна­
чениями являются ALL, AURAL, BRAILLE, HANDHELD, PRINT, PROJECTION, SCREEN
(no умолчанию), SPEECH, TTY и TV.

Остальные атрибуты элемента LINK не поддерживаются современными броузера­


ми и в данной книге не рассматриваются.

1.6. BODY — основная часть документа


HTML-документ должен содержать один раздел BODY, определяющий содержимое
Web-страницы. Исключением являются документы, в которых используются ф р е й м ы .
П р и работе с фреймами в документе верхнего уровня задается расположение фрей­
мов и указывается, в каком из них должен быть отображен тот или иной документ.
Элемент BODY в этом случае не используется. Поскольку содержимое элемента TITLE
отображается лишь в заголовке окна, но не представляется в составе документа и не
выводится на печать, элемент BODY обычно начинается с основного заголовка, кото­
р ы й формируется посредством дескриптора <Н1>. Как правило, в основном заголовке
документа задается та же и н ф о р м а ц и я , что и в элементе TITLE. Использование эле­
мента TITLE и главного заголовка представлено в листинге 1.6.
В разделе BODY присутствуют два основных класса HTML-элементов: элементы
блокового и текстового уровней. Элементы блокового уровня, как правило, прекра­
щают естественный порядок следования текста и продолжают его отображение с но­
вой строки. Примерами элементов блокового уровня являются заголовки, абзацы тек­
ста, списки, таблицы, горизонтальные л и н и и , используемые как разделители, и фор­
мы ввода. Практически в любую точк}^ элемента блокового уровня может быть
включен элемент текстового уровня. Кроме того, в их состав могут входить другие
элементы текстового уровня (например, пункты списка или ячейки таблиц). Элемен­
ты блокового уровня мы рассмотрим в главе 2.

Л и с т и н г 1.6. Шаблон документа HTML 4 . 0 с основным заголовком

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>My First Web Page</TITLE>
</HEAD>
<BODY>
1.6. BODY — основная часть документа 51

<Н1>Му First Web Page</Hl>


< ! — Остальная часть HTML-документа -->
</BODY>
</HTML>

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


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

Элемент: <BODY ...> ... </BODY>


Атрибуты: BACKGROUND, BGCOLOR, TEXT, LINK, VLINK, ALINK, TITLE, ONCLICK,
ONDBLCLICK, ONMOUSEDOWN, ONMOUSEUP, ONMOUSEMOVE, ONMOUSEOUT, ONKEYPRESS,
ONKEYDOWN, ONLOAD, ONUNLOAD, ONFOCUS (нестандартный), ONBLUR (нестандартный),
ONERROR (нестандартный), ONMOVE (нестандартный), ONRESIZE (нестандартный),
ONDRAGDROP (нестандартный), BGPROPERTIES (нестандартный), CLASS, ID, STYLE
Элемент BODY часто используется без атрибутов (т.е. открывающий дескриптор име­
ет вид <BODY>), однако в его состав могут входить необязательные атрибуты, опреде­
ляющие фоновое изображение, цвет фона, текста и гипертекстовых ссылок (обычно
ссылки, указывающие на документы, которые ранее отображались в окне броузера, и
ссылки, указывающие на документы, которые не просматривались, представляются
разными цветами). Если броузер поддерживает JavaScript, он также позволяет задавать
атрибуты, определяющие код, который выполняется при определенных условиях.

BACKGROUND и BGCOLOR
Атрибут BACKGROUND задает URL графического файла. Изображение, содержа­
щееся в этом файле, отображается в качестве ф о н а для Web-документа. Если раз­
меры изображения меньше размера окна, оно многократно повторяется. Возмож­
ность многократного воспроизведения изображения позволяет снизить время за­
грузки фона. Так, например, если в качестве ф о н а используются оттенки цвета,
плавно изменяющиеся от левой границы окна до его правой границы, то в качест­
ве фонового должно использоваться изображение большой ширины, но размер
его по высоте может быть равен одному пикселю. Помимо BACKGROUND, рекомен­
дуется также задавать атрибут BGCOLOR, определяющий цвет фона. Использование
BGCOLOR— это своеобразная "страховка" на случай, если клиент-программа по ка­
ким-то причинам не сможет скопировать ф о н о в о е изображение.
В большинстве броузеров по умолчанию используется белый (WHITE, или #FFFFFF)
либо светло-серый (SILVER, или #СОСОСО) фон. Несмотря на то что BACKGROUND и
BGCOLOR широко используются, и тот и другой атрибут не рекомендованы для при­
менения. Фоновое изображение и цвет фона желательно задавать с помощью листов
стилей.
52 Глава 1 . Создание Web-страниц с помощью HTML 4.0

TEXT, LINK, VLINK и ALINK


Данные атрибуты задают соответственно цвет текста документа, ссылок, которые не
были активизированы (документы, на которые они указывают, не посещались бро­
узером), цвет ссылок, которые были активизированы (документы, на которые они
указывают, просматривались с помощью данного броузера), и цвет выбранной ссыл­
ки. Выбранной считается та ссылка, на которую пользователь поместил курсор, на­
жал кнопку мыши, но еще не отпустил ее. Д о отпускания кнопки эта ссылка будет
отображаться цветом, указанном с помощью атрибута ALINK. Информация о про­
смотренных ранее документах хранится в списке предыстории броузера. Цвета за­
даются либо с помощью символьных имен, либо посредством шестнадцатеричного
представления. П р и шестнадцатеричном представлении цвет идентифицируется
последовательностью знаков, начинающейся с символа "#", за которым следует
шесть шестнадцатеричных ц и ф р . Две ц и ф р ы определяют интенсивность красного,
две — зеленого и две — синего цветов. Имена цветов и их шестнадцатеричные экви­
валенты представлены в табл. 1.1. Для систем, поддерживающих только 256 цветов,
определена палитра Color-Safe, определяющая подмножество из 216 цветов, не вы­
зывающих нежелательных эффектов на мониторе. Пример палитры Color-Safe при­
веден в документе h t t p : / / w w w . c i o c n p r o f . c o m / s a f e c o l o r A . h t m . Netscape и
Internet Explorer позволяют также использовать имена цветов, принятые в оконной
системе X I 1 . Примеры цветов X I 1 находятся в документе h t t p : / /www. z d n e t . com/
devhead/resources/tag_library/misc/xllnames.html.

Таблица 1.1 Имена цветов в HTML 4.0


Нмя цвета Шестнадцатеричный Имя цвета Шестнадцатеричный
эквивалент эквивалент
AQUA #OOFFFF NAVY #000080
BLACK #000000 OLIVE #808000
BLUE #OOOOFF PURPLE #800080
FUCHSIA #FFOOFF RED #FFOOOO
GRAY #808080 SILVER #COCOCO
GREEN #008000 TEAL #008080
LIME #OOFFOO WHITE #FFFFFF
MAROON #800000 YELLOW #FFFFOO

В большинстве броузеров по умолчанию используются ч е р н ы й цвет (BLACK, или


# 0 0 0 0 0 0 ) для отображения текста (атрибут TEXT), синий (BLUE либо более тем­
ный #0000ЕЕ) для ссылок (атрибут LINK), темно-пурпурный с примесью синего
(#551А8В) для ссылок, указывающих на документы, которые ранее были просмот­
рены в данном броузере (атрибут VLINK), и красный цвет (RED, или #FF0000) для
выбранных ссылок (атрибут ALINK).

TITLE
Атрибут TITLE позволяет организовать отображение подсказки в случае, если кур­
сор мыши приостанавливает свое движение в пределах документа. Д а н н ы й атри­
бут поддерживается Internet Explorer 4.0 и более новыми версиями. Netscape (по
крайней мере версия 4.7 и более старые) не поддерживает TITLE.
1.6. BODY — основная часть документа 53

ONCLICK, ONDBLCLICK, O N M O U S E D O W N , O N M O U S E U P ,
O N M O U S E M O V E , O N M O U S E O U T , ONKEYPRESS, ONKEY-DOWN,
ONLOAD, ONUNLOAD, ONFOCUS, ONBLUR, ONERROR, ONMOVE,
ONRESIZE, O N D R A G D R O P
Данные атрибуты определяют код JavaScript, который должен быть выполнен при
возникновении события, связанного с клавиатурой, мышью или изменением фокуса.

BGPROPERTIES
Данный атрибут поддерживается Internet Explorer. Если задано выражение
BGPROPERTIES = "FIXED", это означает, что ф о н о в о е изображение не должно
прокручиваться при просмотре страницы. Это свойство иногда называют
"водяными знаками" (watermark).
И наконец, при использовании каскадных листов стилей со всеми HTML-эле­
ментами могут использоваться атрибуты CLASS, ID и STYLE. Исключением являются
элементы BASE, BASEFONT (атрибут ID допустим), HEAD, HTML, МЕТА, PARAM (атрибут
ID допустим), SCRIPT, STYLE и TITLE. П р и рассмотрении конкретных HTML-эле­
ментов атрибуты, связанные с листами стилей, обсуждаться не будут. И н ф о р м а ц и ю об
этих атрибутах вы найдете в главе 5, посвященной каскадным листам стилей.

1.7. Резюме
Язык HTML— это основное средство для создания профессиональных Web-
страниц. Независимо от того, предназначена Web-страница для технической под­
держки некоторого продукта, отображения и н ф о р м а ц и и о котировке акций либо для
электронной коммерции, информация, содержащаяся в ней, представляет собой
HTML-документ. В данной главе описана общая структура HTML-дoк)^vIeнтa и рас­
смотрен процесс создания, проверки и размещения Web-страницы в Internet.
В каждом документе, соответствук:)щем спецификации HTML 4.0, содержится декла­
рация DOCTYPE, за которой следует элемент HTML, содержащий разделы HEAD и BODY. В
разделе HEAD всегда находится элемент TITLE, кроме того, HEAD может содержать
STYLE, МЕТА и др)^тие элементы, предоставляющие информацию об авторе, обеспечи­
вающие перенаправление либо содержащие описание документа. Информация, нахо­
дящаяся в элементе МЕТА, часто используется поисковыми серверами, которые поме­
щают сведения о документе в свои базы данных. Как правило, дескриптор <BODY> зада­
ется без атрибутов, однако при необходимости в него могут быть включены атрибуты,
которые задают фоновый цвет или фоновое изображение, а также JavaScript-команды,
которые должны быть выполнены при наступлении определенных событий.
В последующих главах будут рассмотрены вопросы оформления данных в составе
Web-страницы. В главе 2 обсуждаются основные т и п ы текстовых блоков, а в главе 3 —
элементы, которые мог)^' быть включены практически в любой блок. Глава 4 посвя­
щена созданию документов с использованием ф р е й м о в . Автор Web-страницы может
разбить ее на "ячейки" и разместить в каждой ячейке отдельный документ. Пользова­
тели, которые хотят задать особенности отображения различных элементов в окне
броузера, могут воспользоваться каскадными листами стилей, описанными в главе 5.
ЭЛЕМЕНТЫ
БЛОКОВОГО
УРОВНЯ HTML 4.0

В ЭТОЙ главе...

• Заголовки разделов.
• Основные типы абзацев.
• Маркированные и нумерованные списки.
• Таблицы.
• Горизонтальные разделительные линии.
• Типы выравнивания абзацев.
Й-1У\^^^

этой главе описываются основные т и п ы абзацев, или текстовых блоков, встре­

В чающихся в разделе BODY HTML-документа. Элементы блокового уровня опре­


деляют порядок ф о р м а т и р о в а н и я и отображения текстовых блоков в окне Web-
броузера. Элементы блокового уровня отличаются от элементов текстового уровня,
которые влияют лишь на внешний вид символов. В частности, в состав элемента бло­
кового уровня могут входить текст, элементы текстового уровня и другие элементы
блокового уровня, тогда как в элементах текстового уровня могут содержаться только
текст и вложенные элементы текстового уровня.
Согласно спецификации HTML 4.0, атрибуты, предназначенные для обработки со­
бытий посредством JavaScript-кода (ONCLICK, ONDBLCLICK, ONKEYDOWN, ONKEYPRESS,
ONKEYUP, ONMOUSEDOWN, ONMOUSEMOVE, ONMOUSEOUT, ONMOUSEOVER и ONMOUSEUP), мо­
гут содержаться во всех элементах за исключением APPLET, BASE, BASEFONT, BDO, BR,
FRAME, FRAMESET, HEAD, HTML, IFRAME, META, PARAM, SCRIPT, STYLE и TITLE. В данной
книге будут рассматриваться лишь общие принципы использования этих атрибутов в
HTML-документах. Особенности обработки событий посредством сценариев JavaScript
описаны в главе 24.
В соответствии со спецификацией каскадных листов стилей совместно со всеми
HTML-элементами (за исключением некоторых) могут использоваться атрибуты
CLASS, ID и STYLE. Д а н н ы е атрибуты н е п р и м е н и м ы к элементам BASE, BASEFONT
(атрибут ID может использоваться), HEAD, HTML, МЕТА, PARAM (атрибут ID может ис­
пользоваться), SCRIPT, STYLE и TITLE. П е р е ч и с л е н н ы е выше три атрибута будут рас­
сматриваться в главе 5, а при обсуждении отдельных HTML-элементов они упоми­
наться не будут.
Кроме того, в H T M L 4.0 для всех элементов, за исключением APPLET, BASE,
BASEFONT, BR, FRAME, FRAMESET, IFRAME, PARAM и SCRIPT, определены атриб)ты
LANG и DIR. Эти атрибуты были рассмотрены в главе 1 и в дальнейшем при обсужде­
нии HTML-элементов упоминаться не будут.
Наконец, атрибут TITLE, также рассмотренный в главе 1, допустим для всех эле­
ментов за исключением BASE, BASEFONT, HEAD, HTML, МЕТА, PARAM, SCRIPT и TITLE.
Данный атрибут также не упоминается при рассмотрении дескрипторов.
56 Глава 2 . Э л е м е н т ы блокового уровня HTML 4 . 0

2 . 1 . Заголовки
Элементы: <Н1 .. .> . . </Н1>
<Н2 .. .> . . </Н2>
<НЗ .. .> . . </НЗ>
<Н4 .. .> . . </Н4>
<Н5 . . .> . . </Н5>
<Нб . . .> . . </Нб>
Атрибут: ALIGN
Элементы Н1-Н6 предназначены для определения заголовков различных уровней
в составе документа. HI задает заголовок первого, или верхнего, уровня, Н2 — заголо­
вок второго уровня, НЗ — третьего уровня и т. д. Как правило, раздел BODY начинается
с заголовка первого уровня, содержащего тот же текст, что и элемент TITLE, находя­
щийся в разделе HEAD. В остальной части документа заголовки второго уровня (Н2)
используются для определения заголовков разделов, НЗ — для подразделов и т. д.
В большинстве броузеров заголовки отобрг1жаются полужирным шрифтом: HI —
наибольшего размера, а Нб— наименьшего. П р и использовании заголовков низших
уровней следует соблюдать осторожность, поскольку не исключена ситуация, при ко­
торой такой заголовок будет представлен ш р и ф т о м меньшего размера, чем обычный
текст абзаца. Текст, следующий за заголовком, оформляется как новый абзац. В отли­
чие от многих элементов, заголовок не содержит элементов блокового уровня и не
входит в состав других элементов, за исключением таблиц (TABLE) и ф о р м ввода
(FORM). В составе заголовка могут находиться элементы текстового уровня. Два заго­
ловка, показанные в листинге 2.1, созданы правильно, поскольку элементы текстово­
го уровня полностью содержатся внутри соответствующего заголовка. Один из них
задает отображение курсивом, а другой формирует гипертекстовую ссылку.

Листинг 2 . 1 . Заголовки, содержащие элементы текстового уровня

<Н2><1>Ап Italic Heading</I></H2>


<Н2><А NA]yiE="Section5">Section Five</A></H2>

Заголовки, представленные в листинге 2.2, заданы н е к о р р е к т н о , поскольку они


содержатся в составе элементов текстового уровня.

Листинг 2 . 2 . Некорректные заголовки, заданные в составе элементов


текстового уровня

<1><Н2>Ап I t a l i c Heading</H2></I>
<А NAME="Section5"><H2>Section Five</H2></A>

Данные примеры показывают, как важно использовать программы проверки син­


таксиса документов. Поскольку многие (но не обязательно все) броузеры отобразят
оба документа одинаково, у автора может сложиться ошибочное мнение, что доку­
мент составлен корректно и будет иметь тот же вид в окне любой клиент-программы
Web, поддерживающей HTML 4.0.
2.1. Заголовки 57

ALIGN
По умолчанию к заголовкам применяется выравнивание по левому краю, однако при
необходимости они могут быть расположены по центру либо выровнены по правому
краю документа. Тип выравнивания задается с помощью атрибута ALIGN, допусти­
мыми значениями которого являются LEFT, RIGHT, CENTER и JUSTIFY. Если задано
значение JUSTIFY, то заголовки, длина которых превышает ширину окна броузера,
располагаются так, что их левая и правая границы совпадают с границами окна. Тип
выравнивания по умолчанию может быть изменен посредством дескриптора DIV,
который будет рассмотрен далее в этой главе. В спецификации HTML 4.0 не реко­
мендуется использовать атрибут ALIGN при создании заголовков. Необходимое вы­
равнивание желательно выполнять с помощью каскадных листов стилей.
П р и м е р ы заголовков различных уровней приведены в листинге 2.3. Заголовок
третьего уровня отобрг1жается с подчеркиванием. На рис. 2.1 показан внешний вид
этого документа в окне броузера Internet Explorer 5.0, выполняющегося в среде
Windows 2000 Professional.

^ч^l•нlNl^^•l-f^'^У4•l'llн^•'гl^'l^llll1u'•^n'^f'l——
^m\
:^ - -^r Jj}^ 'й^ ^ -y^-yj •

1 Samples of the six heading types: J


Level-l (HI) '1

Level-2 (H2) "


Level-3 ШЗ)

L c v d - 4 (H4)

Level-5(H5)
'
Level-6(H6)

J
1
^gjDorte 1^ My CoriipUtM

Рис. 2.1. Внешний вид документа Document-Headings .html

Листинг 2 . 3 . Исходный текст д о к у м е н т а D o c i o m e n t - H e a d i n g s . h t m l

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Document H e a d i n g s < / T I T L E >
</HEAD>
<BODY>
Samples of t h e s i x h e a d i n g t y p e s :
< H l > L e v e l - l (H1)</H1>
<H2 ALIGN="CENTER">Level-2 (H2)</H2>
<H3><U>Level-3 (H3)</U></H3>
<H4 ALIGN="RIGHT">Level-4 (H4)</H4>
<H5>Level-5 (H5)</H5>
58 Глава 2. Элементы блокового уровня HTML 4.0

<H6>Level-6 (Нб)</Н6>
</BODY>
</HTML>

2.2. Основные элементы, предназначенные


для представления текста
к основным элементам, предназначенным для представления текста, относятся Р
(основной абзац), PRE (заранее о т ф о р м а т и р о в а н н ы й текст, при отображении кото­
рого лишние пробелы не удаляются), ADDRESS (вывод контактной информации) и
BLOCKQUOTE (представление больших фрагментов цитируемого текста либо абзацев,
которые должны отображаться с отступами от левой и правой границ).

Основной абзац
Элемент: <Р . . . > . . . </Р>(закрь1ваю1ций дескриптор может отсутствовать)
Атрибут: ALIGN
Элемент Р определяет основной абзац — фрагмент текста, при отображении кото­
рого броузер оставляет пустое пространство небольшого размера выше и ниже абза­
ца. Несмотря на то что Р представляет собой контейнер, закрывающий дескриптор
указывать не обязательно. Если дескриптор < / Р > пропуш^ен, окончание абзаца опре­
деляется по началу нового элемента блокового уровня. Если текст расположен за пре­
делами всех элементов блокового уровня, считается, что он содержится в элементе Р.
Учитывая эти особенности, многие авторы используют Р как разделитель, хотя на са­
мом деле он является контейнером. В листинге 2.4 показаны два варианта использо­
вания дескриптора основного абзаца. В первом варианте (а) окончание абзаца указы­
вается явно, а во втором варианте (б) закрывающий дескриптор пропущен.
Л и ш н и е пробелы в составе основного абзаца игнорируются, а текст располагается
в соответствии с размерами окна. Несколько последовательно расположенных деск­
р и п т о р о в <Р> не приводят к увеличению пустого пространства над абзацем. Каскад­
ные листы стилей (см, главу 5) позволяют непосредственно задавать верхнюю и ниж­
нюю границы абзаца. Если при создании документа листы стилей не используются,
для включения пустых строк можно использовать элемент BR, который будет обсуж­
даться в главе 3, либо элемент PRE, рассматриваемый далее в этой главе.

Листинг 2.4. Явное (а) и неявное (6) определение границ абзаца

(а)
<BODY>
<Р>
Paragraph
</Р>
<Р>
Paragraph
</Р>
2 . 2 . Основные э л е м е н т ы . . . 59

<р>
Paragraph 3
</Р>
</BODY>
(б)
<BODY>
Paragraph 1
<Р>
Paragraph 2
<Р>
Paragraph 3
</BODY>

Внимание!

Включение нескольких последовательно расположенных дескрип­


торов <р> не приведет к появлению пустых строк.

ALIGN
Атрибут ALIGN элемента Р применяется так же, как и соответствующий атрибут
заголовков. Подобно заголовкам, основной абзац по умолчанию выравнивается по
левой границе, но посредством атрибута ALIGN можно задать выравнивание по
центру либо по правой границе. Допустимыми значениями атрибута ALIGN явля­
ются LEFT, RIGHT, CENTER и JUSTIFY. Если задано значение JUSTIFY, то содер­
жимое абзаца, состоящего из нескольких строк, распределяется по всей ширине
окна броузера. Тип выравнивания по умолчанию можно изменить с помощью де­
скриптора DIV (см. раздел 2.6) или каскадных листов стилей (см. главу 5). Как и для
заголовков, атрибут ALIGN не рекомендован для применения. Это сделано для то­
го, чтобы стимулировать использование листов стилей.

Абзацы с сохранением пробелов


Элемент: <PRE>... </PRE>
Атрибут: WIDTH
Обычно лишние пробелы (а также символы возврата каретки и перевода строки),
содержащиеся в HTML-документе, не отображаются в окне броузера. Элемент PRE
определяет заранее отформатированный абзац, при отображении которого сохра­
няются пробелы, заданные в исходном тексте документа, и используется моноши­
ринный шрифт. Элемент PRE часто применяется для включения в состав документа
фрагментов программ. В состав PRE не должны входить элементы, изменяющие раз­
мер шрифта. Символы "<" и "&" в коде программы, представленном с помощью эле­
мента PRE, мог)т интерпретироваться как HTML-элементы разметки. Например, об­
рабатывая выражение (а < b && с < d), броузер может принять последователь­
ность символов "< Ь" за начало элемента <В>. Поэтому в указанном выражении
следует заменить символ "<" последовательностью "&lt;", а символ "&"— последова­
тельностью "&атр;".
60 Глава 2 . Элементы блокового уровня HTML 4.0

Для представления любого из символов набора ISO 8859-1 (Latin-1) может использо­
ваться последовательность "&#л;л:л^', где ххх— это десятичное представление символа в на­
боре ISO Latin-1. Так, например, если в документе встретится последовательность &#1б9,
на экране будет отображаться символ ©. Кроме того, для многих символов применяются
мнемонические обозначения, например символ © может быть задан как " &сору;". Полный
перечень символов Latin-1 и их мнемонических обозначений находится по адресу
h t t p : / / w w w . h t m l h e l p . c o m / r e f e r e n c e / h t m l 4 0 / e n t i t i e s / l a t i n l .html.
В табл. 2.1 перечислены некоторые обозначения, поддерживаемые всеми броузе­
рами H T M L 4.0. Эти обозначения могут быть использованы в составе элемента TITLE
и при ф о р м и р о в а н и и надписи на кнопке SUBMIT, где элементы разметки запрещены.

Таблица 2 . 1 . Специальные символы HTML

Символ Мнемоническое обозначение


< &lt;
> &gt;
& &amp;
&quot;
Н е р а з р ы в н ы й пробел Snbsp;

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

Цитирование с отступом
Элемент: <BLOCKQUOTE> ... </BLOCKQUOTE>
Атрибут: CITE
Элемент BLOCKQUOTE представляет большой фрагмент цитируемого текста и ото­
бражает его с отступом. Большинство броузеров формируют отступ как от левой, так и
от правой границы окна. Однако такие отступы не считаются обязательными, поэтому
авторы часто избегают включать BLOCKQUOTE в свои документы и применяют этот эле­
мент в основном в сетях intranet, где известно, в каких броузерах будут отображаться
Web-страницы. Вместо BLOCKQUOTE можно использовать соответствующие возможно­
сти листов стилей, а также таблиц)^ без обрамления. Атрибут CITE, не обрабатываемый
броузером, позволяет указывать URL документа, текст которого цитируется.

Методика профессионалов

В HTML 4.0 не определены элементы с отступом только от левой или


от правой границы. Для вывода фрагментов текста с отступом авто­
ры часто используют элементы BLOCKQUOTE ИЛИ таблицу без обрам­
ления, выровненную по центру окна.
2.3. Нумерованные, маркированные списки... 61

Адрес
Элемент: <ADDRESS>... </ADDRESS>
Атрибуты: отсутствуют
Элемент ADDRESS позволяет включать в документ и н ф о р м а ц и ю об авторе. О б ы ч н о
эти данные отображаются в верхней или в н и ж н е й части документа; многие броузеры
выводят их курсивом. Как и в других блоковых элементах (за исключением PRE), бро­
узер располагает текст по ширине окна. Ч т о б ы явным образом включить в текст раз­
рыв строки, надо использовать элемент BR.

2.3. Нумерованные, маркированные списки


и списки определений
HTML позволяет автору создавать нумерованные списки (0L— ordered list), марки­
рованные списки (UL — u n o r d e r e d list) и списки определений (DL— definition list). Бро­
узеры также поддерживают списки MENU и DIR, но поскольку аналогичные возможности
реализованы современными средствами, мы не рассматриваем эти элементы.

Нумерованные списки
Элемент: <OL ...>... </OL>
Атрибуты: TYPE, START, COMPACT
С помощью элемента 0L создаются нумерованные списки. Элемент LI (list item—
пункт списка) отмечает отдельные пункты нумерованного списка, которые могут со­
держать элементы блокового уровня (например, таблицы и другие списки), за исклю­
чением заголовков (HI — Нб) и элементов ADDRESS. П р и м е р простого нумерованного
списка приведен в листинге 2.5. На рис. 2.2 показано, как этот код отображается в
броузере Netscape 4.0, который выполняется на рабочей станции Sun/Solaris.

Листинг 2 . 5 . П р о с т о й н у м е р о в а н н ы й с п и с о к

А sample l i s t :
<0L>
< L I > L i s t I t e m One
< L I > L i s t I t e m Two
<LI>List Item Three
</0L>

A sample list:

1, List Item One


Z. List i t e m i w o p^^^ 2.2. Порядковые номера в нумерованном
? Т Wf Tfpm Three к > к
о. i-i^LiLciu 11UCC списке генерируются автоматически
62 Глава 2. Элементы блокового уровня HTML 4.0

В состав открывающего дескриптора 0L могут быть включены необязательные ат­


рибуты TYPE, START и COMPACT.

TYPE
Атрибут TYPE определяет стиль нумерованного списка (тип нумерации). Допусти­
мые значения данного атрибута приведены в табл. 2.2. Официально атрибут TYPE не
рекомендован для использования, однако многие авторы находят его очень удобным
и продолжают применять.

Таблица 2.2. Значения атрибута TYPE нумерованного списка


Значение Описание
1 Нумерация арабскими цифрами (1, 2, 3 и т.д.); используется по
умолчанию
А Нумерация прописными буквами (А, В, С и т.д.)
а Нумерация строчными буквами (а, Ь, с и т.д.)
I Нумерация римскими цифрами, которые отображаются прописны­
ми латинскими буквами (I, II, III, IV и т.д.)
Нумерация римскими цифрами, которые отображаются строчными
латинскими буквами (i, ii, iii, iv и т.д.)

START
Атриб)т START также не рекомендован для применения. Его значением является
целое число, определяющее начало нумерации. Данный атрибут может быть ис­
пользован с любым типом нумерации. В элементе 0L не предусмотрена возмож­
ность непосредственно задавать префикс, отображаемый в начале каждого пункта.

COMPACT
Атрибут COMPACT указывает на то, что спи­ I. Headings
сок должен отображаться компактно (т.е. не II. Basic Text Sections
занимать лишнее пространство). Этот атри­ m Lists
бут не рекомендован для применения и ис­ A. Ordered
пользуется крайне редко. 1. The OL tag
a TYPE
В листинге 2.6 представлен более сложный b, START
нумерованный список. На рис. 2.3 показано, с COMPACT.
как этот список выглядит в окне броузера. За­ 2. The LI tag
метьте, что вложенные списки отображаются с B. Unordered
отступом и их нумерация начинается с 1, неза­ 1. The UL tag
висимо от нумерации включающего списка. 2. The LI tag
С Definition
1. The DL tag
2. The DT tag
Рис. 2.3. Вложенные списки 3. The DD tag
отображаются с отступом IV. Miscellaneous
2.3. Нумерованные, маркированные списки... 63

Листинг 2.6. Вложенные нумерованные списки

<0L TYPE="I">
<LI>Headings
<LI>Basic Text Sections
<LI>Lists
<0L TYPE="A">
<LI>Ordered
<0L TYPE="1">
<LI>The OL tag
<0L TYPE="a">
<LI>TYPE
<LI>START
<LI>COMPACT
</0L>
<LI>The LI tag
</0L>
<LI>Unordered
<0L TYPE="1">
<LI>The UL tag
<LI>The LI tag
</0L>
<LI>Definition
<0L TYPE="1">
<LI>The DL tag
<LI>The DT tag
<LI>The DD tag
</0L>
</0L>
<LI>Miscellaneous
</0L>

Элемент: <LI ...> ... </LI> (закрывающий дескриптор может


отсутствовать)
Атрибуты: VALUE, ТУРЕ (при использовании в составе 0L)
Атрибуты LI зависят от типа списка, в составе которого применяется данный де­
скриптор. Для маркированного списка открывающий дескриптор <Ы> может содер­
жать атрибуты VALUE и ТУРЕ. Элемент LI является контейнером, но закрывающий
дескриптор часто не указывается.

VALUE
Чтобы стимулировать применение листов стилей, атрибут VALUE не рекомендован
для использования. Этот атрибут определяет номер, которым помечается пункт
списка, и влияет не только на текущий, но и на все последующие пункты.

TYPE
В составе открывающего дескриптора <LI> может также указываться атрибут
ТУРЕ, который позволяет изменять тип нумерации в пределах списка. Необходи­
мость в применении этого атрибута возникает крайне редко.
64 Глава 2. Элементы блокового уровня HTML 4.0

Маркированные списки
Элемент: <UL ...>.., < / U L >
Атрибуты: TYPE, COMPACT
Элемент UL создает маркированный список. Пункты списка формируются с помо­
щью дескриптора < Ы > . П р и м е р простого маркированного списка приведен в лис­
тинге 2.4. На рис. 2.7 показано, как этот список отображается в окне броузера
Netscape 4.0, выполняющегося на рабочей станции Sun/Solaris.

Листинг 2.7. Простой маркированный список

А sample l i s t :
<UL>
< L I > L i s t I t e m One
< L I > L i s t I t e m Two
<LI>List Item Three
</UL>

A sample list:

• List Item One


• List I t e m iV/Q p^^ 2.4. Элемент UL автоматически создает маркер для каждого
Ш * ^^^^ i t e m i i i r e e пункта списка, сформированного с помощью дескриптора < ы >

В состав открывающего дескриптора <UL> могут быть включены необязательные


атрибуты TYPE и COMPACT.

TYPE
Атрибут TYPE задает т и п маркера. Допустимые значения TYPE приведены в
табл. 2.3. Ч т о б ы стимулировать использование листов стилей, данный атрибут не
рекомендован для применения.

Таблица 2.3. Значения атрибута TYPE

Значение Описание
DISC З а к р а ш е н н ы й круг. Часто используется по умолчанию для списков,
не являющихся вложенными
CIRCLE Незакрашенный круг. Обычно используется по умолчанию для вло­
ж е н н ы х списков
SQUARE Квадрат. В зависимости от броузера, он может быть закрашен либо
не закрашен
2.3. Нумерованные, маркированные списки... 65

COMPACT
Как и TYPE, атрибут COMPACT не рекомендован для использования. Этот атрибут
указывает на то, что список должен отображаться компактно, и применяется дос­
т а т о ч н о редко.

Элемент: < Ы . . .> . . . </Ы>(закрывающий дескриптор мелеет


отсутствовать)
Атрибут: TYPE (при использовании в составе UL)
В зависимости от типа списка, в состав открывающего дескриптора LI могут быть
включены различные атрибуты. Для маркированного списка используется только ат­
рибут TYPE. Элемент LI представляет собой контейнер, но закрывающий дескриптор
часто не указывается.

TYPE
Атрибут TYPE (не рекомендован для применения) задает тип маркера для кон­
кретного пункта списка. Для атрибута TYPE допустимы те же значения, что и для
соответствующего атрибута дескриптора UL (т.е. DISC, CIRCLE и SQUARE).

Списки определений
Э л е м е н т : <DL . . .> ... </DL>
Атрибут: COMPACT

Элемент: <DT> . . . </DT> (закрывающий дескриптор молсет


отсутствовать)
Атрибуты: отсутствуют

Элемент: <DD> . . . </DD> (закрывающий дескриптор молсет


отсутствовать)
Атрибуты: отсутствуют
Элемент DL содержит пункты, отображаемые как с отступом, так и без отступа.
Пункты списка не помечаются ни номерами, ни маркерами. Т е р м и н ы определений
(DT— definition terms) выравниваются по левой границе окна, а описания определе­
ний (DD— definition description) отображаются с отступом. П р и м е р простого списка
определений приведен в листинге 2.8. Внешний вид этого списка в окне броузера
представлен на рис. 2.5. В состав открывающего дескриптора DL может быть включен
необязательный атрибут COMPACT, но в настоящее время он применяется достаточно
редко. Формально элементы DT и DD являются контейнерами, но соответствующие
закрывающие дескрипторы часто не указываются.
66 Глава 2. Элементы блокового уровня HTML 4.0

Листинг 2.8. Простой список определений

<DL>
<DT>Term One
<DD>The definition of term number one.
<DT>Term Two
<DD>The definition of term number two.
</DL>

Term One
The definition of term
number one.
Term Two
The aenniuon of term p^iQ^ 2.5. в списке определений элементы DD обычно
number two. отображаются с отступом

В состав DD могут входить элементы блокового уровня, за исключением заголовков и


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

2.4. Таблицы
HTML-таблицы используются не только традиционным способом (т.е. для пред­
ставления данных в виде двухмерной таблицы), они также применяются для управле­
ния расположением и группировки элементов. В состав таблиц могут входить изо­
бражения, фрагменты текста, включая списки, и даже другие таблицы. Автор Web-
страницы имеет возможность запретить отображение обрамления вокруг таблицы и
разграничительных л и н и й между ячейками, в результате содержимое таблицы выгля­
дит как выровненные фрагменты данных. Создание сложных таблиц вручную — дли­
тельная и р)а^инная работа, при выполнении которой легко допустить ошибку. Боль­
шую помощь при создании Web-страниц оказывают HTML-редакторы, предостав­
ляющие визуальные средства для ф о р м и р о в а н и я и заполнения таблиц. Особенно
полезны такие редакторы, которые позволяют редактировать исходный HTML-код и
включать в него атрибуты, не предусмотренные в графическом и н т е р ф е й с е
(например, атрибут BGCOLOR).

Структура таблицы
HTML-таблица создается с помощью элемента TABLE, который содержит необяза­
тельный элемент CAPTION и описания строк, с ф о р м и р о в а н н ы е с помощью элементов
TR. В состав каждой строки таблицы могут входить элементы ТН (table heading — заго­
ловок таблицы) и элементы TD (table data— данные таблицы). В составе элемента ТН
2.4. Таблицы 67

информация по умолчанию отображается полужирным ш р и ф т о м и выравнивается по


центру. Данные в элементе TD выводятся обычным ш р и ф т о м и выравниваются по ле­
вому краю. П р и м е р простой таблицы представлен в листинге 2.9. Н а рис. 2.6 показан
внешний вид этой таблицы на экране броузера. Закрывающие дескрипторы </TR>,
</ТН>и</ТО> необязательны, однако помогают проследить структуру таблицы.

Листинг 2 . 9 . Простая HTML-таблица

<TABLE B0RDER=1>
<CAPTION>Table Caption</CAPTION>
<TR><TH>Headingl</TH> <TH>Heading2</TH></TR>
<TR><TD>Rowl C o l l Data</TD><TD>Rowl Col2 Data</TD></TR>
<TR><TD>Row2 C o l l Data</TD><TD>Row2 Col2 Data</TD></TR>
<TR><TD>Row3 C o l l Data</TD><TD>Row3 Col2 Data</TD></TR>
</TABLE>

||R<>wl Cott Data jRqwl CoE Data


I |й[(йй Coll Й а ^ 1 1 ^ ^ ОЙ
Рис. 2.6. Так ВЫГЛЯДИТ таблица, код которой
feowi СЩ Data [Roi^ (ЗоЁ Bata приведен в листинге 2.9

Помимо основных элементов, определяющих структуру таблицы, в спецификации


HTML 4.0 предусмотрены новые средства, позволяющие группировать строки
(THEAD, TBODY и TFOOT) и столбцы (COLGROUP и COL). Эти новые элементы обеспечи­
вают дополнительный контроль ф о р м а т а таблицы. Группирование строк и столбцов
мы рассмотрим после обсуждения основных средств построения таблицы.

Элемент: <TABLE>... </TABLE>


Атрибуты: BORDER, ALIGN, WIDTH, CELLSPACING, CELLPADDING, FRAME, RULES, SUMMARY,
BGCOLOR, BORDERCOLOR (нестандартный), BORDERCOLORDARK (нестандартный),
BORDERCOLORLIGHT (нестандартный), BACKGROUND (нестандартный)
Если в открывающем дескрипторе <TABLE> не указаны атрибуты, по умолчанию
создается таблица без обрамления, выровненная по левому краю. Дополнительные
возможности по управлению внешним видом таблицы предоставляют следующие ат­
рибуты.

ALIGN
Атриб)т ALIGN (чтобы стимулировать использование листов стилей, он не реко­
мендован для применения) определяет тип выравнивания всей таблицы по гори­
зонтали. Допустимыми значениями являются LEFT, RIGHT и CENTER, значение
LEFT принимается по умолчанию. Заметьте, что текст, непосредственно следую­
щий в документе за таблицей, в ы р о в н е н н о й вправо, будет отображаться слева от
нее. Чтобы текст выводился под таблицей, надо использовать выражение <BR
CLEAR="ALL">. Подробно элемент BR будет рассматриваться в главе 3.
68 Глава 2 . Э л е м е н т ы блокового уровня H T M L 4 . 0

BORDER
В основном атрибут BORDER предназначен для управления шириной обрамления,
отображаемого вокруг таблицы. Н о если данный атрибут будет установлен равным
нулю (значение по умолчанию), разделительные линии между ячейками таблицы
также не будут выводиться. Размеры, указанные с помощью атрибута BORDER, до­
бавляются к размерам пустого пространства вокруг каждой ячейки (атрибут
CELLSPACING). Н е к о т о р ы е броузеры интерпретируют выражение <TABLE
BORDER> как <TABLE B0RDER=1>. Подобные выражения не следует использовать в
составе Web-страниц, поскольку они мешают проверять документы с помощью
специализированных программ.

На з а м е т к у

Если значение атрибута BORDER не равно нулю, толщина обрамления


вычисляется как сумма значений BORDER И CELLSPACING.

CELLSPACING
Атрибут CELLSPACING определяет расстояние в пикселях между соседними ячейка­
ми таблицы. Если значение атрибута BORDER не равно нулю, разделительная линия
между ячейками отображается с имитацией трехмерного изображения, в противном
случае пустое пространство между ячейками закрашивается цветом фона. П о умол­
чанию устанавливается расстояние между ячейками, равное трем пикселям.

CELLPADDING
Атрибут CELLSPACING определяет расстояние в пикселях между границей ячейки
и данными, отображаемыми в ней. П о умолчанию значение данного атрибута ус­
танавливается равным одному пикселю.

FRAME
Атрибут FRAME введен в HTML 4.0 и определяет, какая часть внешнего обрамле­
ния должна отображаться в окне броузера. Если данный атрибут не указан, все че­
т ы р е части обрамления выводятся на экран. Допустимыми значениями FRAME яв­
ляются BORDER, или BOX (отображаются все части обрамления), VOID (обрамление
не отображается), ABOVE (отображается верхняя л и н и я ) , BELOW (отображается
нижняя л и н и я ) , HSIDES (отображаются верхняя и нижняя линии, хотя по имени
атрибута можно предположить другое действие), VSIDES (отображаются левая и
правая л и н и и ) , LHS (отображается левая линия) и RHS (отображается правая ли­
ния). П р о с т о й п р и м е р использования атрибута FRAME приведен в листинге 2.10.
На рис. 2.7 показано, как этот пример выглядит на экране броузера. Атрибут
FRAME не поддерживается Netscape, по крайней мере он не поддерживался в
Netscape 4.7 и более ранних версиях данного броузера.
2 . 4 . Таблицы 69

Листинг 2.10. T i c T a c T o e . h t m l

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 T r a n s i t i o n a l / / E N " >


<HTML>
<HEAD>
<TITLE>2000 World C h a m p i o n s h i p < / T I T L E >
</HEAD>
<BODY>
<H2 ALIGN="CENTER">2000 World C h a m p i o n s h i p < / H 2 >
F i n a l r e s u l t i n t h e 2000 w o r l d t i c - t a c - t o e c h a m p i o n s h i p .
Deep Green i s "X", B a r r y K a s p a r o v i s " 0 " .
<TABLE ALIGN="CENTER" B0RDER=1 FRAME="VOID">
<TR><TH>X<TH>0<TH>X
<TR><TH>X<TH>0<TH>X
<TR><TH>0<TH>X<TH>0
</TABLE>
</BODY>
</HTML>

¥т^тштт*мт&жМШ1Шшшшт
||;1в||Ш1|Я||||Ж
|1иш11вай1Й11в& ^ '^7
2000 World Championship
Ш Щ
1 Final result in the 2000 world tic-tac-toe championsh^. Deep Green i5"X". '
1 Barry Kasparov is "0".
1 X jO X
X |0 X
OJX(0

ш^¥шт^^-^ш1шшшшшшшщшшш
Рис. 2.7. Таблица с отключенным внешним обрамлением

Внимание!

Броузер Netscape не поддерживает атрибут FRAME элемента TABLE.

RULES
Новый атрибут H T M L 4.0, поддерживаемый Internet Explorer, но не поддержи­
ваемый Netscape, определяет, какие из внутренних разделительных л и н и й табли­
цы должны быть отображены на экране. Допустимыми значениями атрибута
RULES являются NONE, ROWS, COLS, ALL и GROUPS.

Внимание!

Броузер Netscape не поддерживает атрибут RULES элемента TABLE.


70 Глава 2. Элементы блокового уровня HTML 4.0

SUMARY
Атрибут SUMARY, введенный в HTML 4.0, предоставляет описание таблицы для
программ, воспроизводящих HTML-документы, в специальных средах, например с
помощью звука или в брайлевском представлении.

WIDTH
Атрибут WIDTH задает ширину таблицы в пикселях (<TABLE WIDTH=250>) либо в
процентах от ш и р и н ы окна броузера (<TABLE WIDTH="75%">). П р и использова­
нии абсолютных размеров соблюдайте осторожность, так как вы не можете пред­
положить, какой будет ширина окна при просмотре документа пользователем. За­
давая ширину в процентах, следует поместить значение в двойные кавычки. П о
умолчанию ширина таблицы определяется исходя из размеров ее ячеек.

BGCOLOR
Цвет таблицы (либо ее отдельных строк или ячеек) существенно влияет на внеш­
ний вид Web-страницы. Для определения цвета таблицы можно использовать ат­
рибут BGCOLOR дескриптора <TABLE> (либо соответствующие средства листов
стилей, описанные в главе 5). Преимущество листов стилей состоит в том, что ес­
ли вы захотите изменить цвет всех таблиц в составе Web-страницы, вам достаточ­
но внести лишь незначительные изменения в код документа.

BORDERCOLOR, BORDERCOLORDARK, BORDERCOLORLIGHT


Эти нестандартные атрибуты поддерживаются только Internet Explorer 4.0 и более
поздними версиями. Они определяют цвета обрамления таблицы. BORDERCOLOR
задает основной цвет, а BORDERCOLORDARK и BORDERCOLORLIGHT — цвета для ото­
бражения теней при имитации трехмерного представления. Данные атрибуты
учитываются только в том случае, если значение BORDER не равно нулю.

BACKGROUND
BACKGROUND— атрибут, специфический для Internet Explorer, он задает файл, со­
держащий изображение, которое должно выводиться в качестве ф о н а таблицы.
Если отключить отображение обрамления, данный атрибут можно использовать
для вывода текста на ф о н е изображения, однако данная возможность не поддер­
живается другими броузерами. Листы стилей позволяют реализовать такое ото­
бражение в любом из новых броузеров. Учитывая это, мы не рекомендуем вам
применять атрибут BACKGROUND даже в тех случаях, когда Web-страницы предна­
значены для внутренней сети, в которой используются броузеры Internet Explorer.

Элемент: <CAPTION>... </CAPTION>


Атрибуты: ALIGN
Элемент CAPTION располагается между открывающим и закрывающим дескрипто­
рами <TABLE> и размещает заголовок или название таблицы над (ALIGN="TOP") либо
под ней (ALIGN= "BOTTOM"). По умолчанию принимается значение ТОР. Многие авто­
ры Web-страниц избегают применять атрибут CAPTION и создают заголовки таблиц с
помощью других HTML-элементов, которые предоставляют большую свободу в выбо­
ре формата.
2.4. Таблицы 71

Определение строк таблицы


Элемент: <TR ...> ... </TR> (закрывающий дескриптор мелеет
отсутствовать)
Атрибуты: ALIGN, VALIGN, BGCOLOR, BORDERCOLOR (нестандартный), BORDERCOLORDARK
(нестандартный), BORDERCOLORLIGHT (нестандартный), CHAR, CHAROFF
Элемент TR определяет строку таблицы. В составе строки содержатся элементы ТН
или TD.

ALIGN
Дескриптор ALIGN (допустимые значения: LEFT, RIGHT, CENTER, JUSTIFY и CHAR)
задает тип горизонтального выравнивания содержимого ячеек в строке таблицы.
По умолчанию принимается значение LEFT. Значения JUSTIFY и CHAR не поддер­
живаются ни Netscape, ни Internet Explorer.

VALIGN
Дескриптор VALIGN (допустимые значения: ТОР, MIDDLE, BOTTOM и BASELINE) за­
дает тип вертикального выравнивания содержимого ячеек в строке таблицы. Если
указано значение BASELINE, первые строки каждой ячейки выравниваются по од­
ной базовой линии. П о умолчанию принимается значение MIDDLE.

BGCOLOR
Атрибут BGCOLOR задает цвет ф о н а для строки таблицы. Цвет для строки замещает
цвет, заданный для всей таблицы с помощью атрибута BGCOLOR элемента TABLE.
Цвет для строки, в свою очередь, замещается цветом, заданным для отдельной
ячейки с помощью атрибута BGCOLOR элемента ТН или TD. Это дает возможность
выделить цветом одну или несколько ячеек таблицы. Так, например, в листинге
2.11 приведен п р и м е р таблицы, для которой в заголовках столбцов текст отобра­
жается белым цветом на черном ф о н е , а в остальных ячейках выводится черный
текст на светло-сером ф о н е . Внешний вид таблицы показан на рис. 2.8. Таблицы
такого типа предпочитают большинство пользователей.

Листинг 2 . 1 1 . BG-Colors. html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>WWW S t a n d a r d s < / T I T L E >
</HEAD>
<BODY BGCOLOR="WHITE">
<H1 ALIGN="CENTER">WWW S t a n d a r d s < / H l >

<TABLE B0RDER=1 BGCOLOR="#EEEEEE">


<TR BGCOLOR="BLACK">
<TH><FONT COLOR="WHITE">Standard</FONT>
<TH><FONT COLOR="WHITE">Obsolete Version</FONT>
<TH><FONT COLOR="WHITE">Most W i d e l y S u p p o r t e d
72 Глава 2. Элементы блокового уровня HTML 4.0

Version</FONT>
<TH><FONT COLOR="WHITE">Upcoming Version</FONT>
<TR><TD>HTML
<TD>3.2
<TD>4.0
<TD>XHTML
<TR><TD>HTTP
<TD>1.0
<TD>1.1
<TD>1.2
</TABLE>

</BODY>
</HTML>

ШШШЕШШШВШ

И11^И!МКД!1И
WWW Standards

jHIML 3.2 40 XKIML


ЙГГР "'.Го' 11 " ' 1.2 "

,Ooci«w*,0«w

Рис. 2.8. Атрибут BGCOLOR позволяет изменить


внешний вид таблицы

BORDERCOLOR, BORDERCOLORDARK, BORDERCOLORLIGHT


Данные атрибуты, поддерживаемые только Internet Explorer, задают цвет раздели­
тельных линий в строке. BORDERCOLOR задает основной цвет, а BORDERCOLORDARK и
BORDERCOLORLIGHT— цвета для отображения теней при имитации трехмерного
представления. Данные атрибуты учитываются только в том случае, если значение
BORDER элемента TABLE не равно нулю.
Спецификация HTML 4.0 определяет для элементов TR, ТН, TD, THEAD, TBODY и
TFOOT атрибуты CHAR и CHAROFF. Если задан атрибут CHAR, то броузер выравнивает со­
держимое каждой ячейки в строке так, что относительные расположения указанных
символов (например, десятичных точек) остаются одинаковыми. Атрибут CHAROFF за­
дает смещение до первого выравниваемого символа. Ни Netscape, ни Internet Explorer
не поддерживают эти атрибуты, поэтому мы не будем обсуждать их при рассмотрении
соответствующих элементов.
2 . 4 . Таблицы 73

Ячейки заголовков и ячейки данных


Элементы: <ТН . . . > . . . </ТН> (закрывающий дескриптор молсет
отсутствовать)
<TD . . . > . . . </TD> (закрыван>щий дескриптор молсет
отсутствовать)
Атрибуты: COLSPAN, ROWSPAN, ALIGN, VALIGN, WIDTH, HEIGHT, NOWRAP, BGCOLOR,
BACKGROUND (нестандартный), BORDERCOLOR (нестандартный), BORDERCOLORDARK
(нестандартный), BORDERCOLORLIGHT (нестандартный), ABBR, AXIS, HEADERS, SCOPE

COLSPAN
Атрибут COLSPAN указывает на то, что ячейка заголовка или ячейка данных рас­
ширятся на несколько столбцов. П р и м е р кода приведен в листинге 2.12. Внешний
вид таблицы показан на рис. 2.9,а.

Листинг 2.12. Пример заголовка, распространяющегося на два столбца

<TABLE BORDER-1>
<TR><TH COLSPAN=2>Col 1&2 H e a d i n g
<ТН>Со13 H e a d i n g
<TR><TD>Coll Data
<TD>Col2 D a t a
<TD>Col3 D a t a
</TABLE>

iteidingi iiiee
цЩШЩ^^^^Ш
Co! 1&2 Heading CoB Holding ^ , „ ,0.0^41.^°^^°^^^^^
, * , *> Data for Row 1&2, Coll —™.__
CoU Data Col2 Data CoB Data ' |J^ow2 Col2 Data
(a) (6)
Рис. 2.9. (a) Расширение ячейки на несколько столбцов (пример кода приведен в листинге
2.12); (б) расширение ячейки на несколько строк (пример кода приведен в листинге 2.13)

ROWSPAN
Атрибут ROWSPAN определяет ячейку заголовка или данных, которая расширяется
на несколько строк. П р и м е р использования ROWSPAN приведен в листинге 2.13,
а внешний вид таблицы — на рис. 2.9,6.

Листинг 2.13. Ячейка данных, расширяющаяся на две строки

<TABLE B0RDER=1>
<TR><TH>Headingl<TH>Heading2
<TR><TD R0WSPAN=2>Data f o r Row 1&2, Coll
<TD>Rowl C0I2 D a t a
<TR><TD>Row2 C0I2 D a t a
</TABLE>
74 Глава 2. Элементы блокового уровня HTML 4.0

ALIGNHVALIGN
Атрибут ALIGN (допустимые значения: LEFT, RIGHT, CENTER, JUSTIFY и CHAR) за­
дает горизонтальное выравнивание данных в ячейке таблицы. П о умолчанию для
элементов TD принимается значение LEFT, а для элементов ТН — CENTER. Деск­
р и п т о р VALIGN (допустимые значения: ТОР, MIDDLE, BOTTOM и BASELINE) задает
тип вертикального выравнивания содержимого ячейки. П о умолчанию принима­
ется значение MIDDLE. З н а ч е н и я CHAR и BASELINE описаны при рассмотрении
элемента TR.

WIDTH и HEIGHT
Если атрибуты WIDTH и HEIGHT не указаны, размеры ячеек устанавливаются бро­
узером, исходя из размеров окна и данных, содержащихся в ячейках. Атрибуты
WIDTH и HEIGHT позволяют явно задавать размеры ячейки в пикселях. Устанавли­
вая размеры ячеек явным образом, следует соблюдать осторожность. Если разме­
ры окна броузера на компьютере пользователя будут не такими, как предполагает
автор документа, ф о р м а т таблицы нарушится. Иногда ячейки с фиксированными
размерами используются для создания панелей инструментов с пиктограммами.
П р и этом размеры пиктограмм должны быть заранее известны и хотя бы одна
ячейка в строке должна допускать изменение размеров. В соответствии со специ­
фикацией HTML 4.0 указание размеров ячеек в процентах не допускается, однако
и Netscape, и Internet Explorer поддерживают подобный ф о р м а т значений. П р и
этом размеры ячейки вычисляются относительно ш и р и н ы и высоты таблицы, а не
относительно размеров окна броузера. Атрибуты WIDTH и HEIGHT не рекомендо­
ваны для применения. Вместо них желательно использовать соответствующие
средства листов стилей.

NOWRAP
Атрибут NOWRAP, также не рекомендованный для использования, запрещает пере­
нос слов внутри ячейки. Аналогичного эффекта можно добиться, разделяя слова
неразрывными пробелами ( & n b s p ; ) или включая в состав ячейки элемент PRE (в
некоторых броузерах это приведет также к отображению данных ш р и ф т о м фик­
сированной ш и р и н ы и появлению нежелательных символов перевода строки).
Используя атрибут NOWRAP, следует соблюдать осторожность, так как при этом
текст может оказаться за пределами окна броузера.

BGCOLOR и BACKGROUND
Атрибут BGCOLOR (спецификацией HTML 4.0 он не рекомендован для примене­
ния) задает цвет ф о н а для ячейки таблицы. Атрибут BACKGROUND, поддерживае­
мый Internet Explorer 3.0 и более новыми версиями, определяет файл, содержа­
щий изображение, которое отображается в качестве ф о н а ячейки. Если размеры
ячейки превышают размеры изображения, оно отображается многократно.

BORDERCOLOR, BORDERCOLORDARK, BORDERCOLORLIGHT


Данные атрибуты, поддерживаемые только Internet Explorer, задают цвет обрам­
ления ячейки. BORDERCOLOR определяет основной цвет, а BORDERCOLORDARK и
BORDERCOLORLIGHT— цвета для отображения теней при имитации трехмерного
2 . 4 . Таблицы 75

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


BORDER элемента TABLE не равно нулю.
Новые атрибуты ABBR, HEADERS, SCOPE и AXIS поддерживаются относительно
редко. ABBR, HEADERS и SCOPE предоставляют упрощенную информацию для невизу­
альных броузеров. Атрибут AXIS (в настоящее время он не поддерживается) связыва­
ет с ячейкой данные для выделения в запросе броузера.

Группировка содержимого таблицы


Элемент: <THEAD . . . > . . . </THEAD> (закрывающий дескриптор
молсет отсутствовать)
<TBODY . . . > . . . </TBODY> (закрывающий дескриптор
молсет отсутствовать)
<TFOOT . . . > . . . </TFOOT> (закрывающий дескриптор
молсет отсутствовать)
Атрибуты: ALIGN, VALIGN
Элементы THEAD, TBODY и TFOOT позволяют группировать фрагменты таблицы в
логические разделы. П р и использовании совместно с атрибутом RULES="GROUPS"
элемента TABLE эти фрагменты выделяются в наборы строк. В составе таблицы до­
пустим один раздел заголовков (header section), один раздел сносок (footer section) и
любое количество разделов тела таблицы (body section). В состав каждого раздела
может входить любое количество строк таблицы, сформированных посредством де­
скриптора TR. Все строки, входящие в группу, форматируются одновременно, это го­
раздо удобнее, чем задавать формат для каждой строки. Первоначально элементы
группировки создавались как расширение, специфическое для Internet Explorer. Впо­
следствии они были п р и н я т ы в качестве стандарта H T M L 4.0. Броузер Netscape 4.x не
поддерживает данные элементы.

Внимание!

Netscape 4.x не поддерживает элементы группировки THEAD TBODY


и TFOOT.

ALIGN и VALIGN
Атрибут ALIGN (допустимые значения: LEFT, RIGHT, CENTER, JUSTIFY и CHAR) за­
дает горизонтальное выравнивание для всех ячеек в группе. По умолчанию для
элемента THEAD принимается значение CENTER, а для элементов TBODY и TFOOT —
значение LEFT. Тип выравнивания CHAR был описан при рассмотрении элемента
TR. Атрибут VALIGN (допустимые значения: ТОР, MIDDLE, BOTTOM и BASELINE) за­
дает тип вертикального выравнивания. П о умолчанию принимается значение
MIDDLE. Т и п ы вертикального выравнивания были описаны при рассмотрении
элемента TR.
76 Глава 2. Элементы блокового уровня HTML 4.0

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


заголовков, раздел сносок и разделы тела таблицы. На рис. 2.10 показано, как эта таб­
лица отображается в окне броузера Internet Explorer 5.0, выполняющегося в среде
Windows 2000 Professional. Значение GROUPS атрибута RULES указывает на то, что раз­
делы таблицы должны отделяться друг от друга горизонтальными линиями.

Листинг 2.14. Формирование разделов в таблице

<TABLE B0RDER=1 CELLPADDING=4 RULES="GROUPS">


<CAPTION>Table Groups
<THEAD>
<TR><TH>Table Head<TH>Table Head
<TBODy>
<TR><TD>Group l<TD>Group 1
<TR><TD>Group l<TD>Group 1
<TBODy ALIGN="RIGHT">
<TR><TD>Group 2<TD>Group 2
<TR><TD>Group 2<TD>Group 2
<TFOOT ALIGN="CENTER">
<TR><TD C0LSPAN=2>Footer
</TABLE>

И Fie E<k Vtetv FavorRes Tools: Help 1^1


j >^-Beck - »*> " ^ J 3 i:2f ^Search »
J
Table Groups
1 Table Groups
I i Table Head Table Head !
1 Group 1 Group 1
1 j Group 1 Group 1
i Group 2 Group 2
Group 2 Group 2
Footer
Рис. 2.10. Внешний вид таблицы
с разделами, код которой
•^'Oone ' " ' ''"' Г|р'Intern^'"
содержится в листинге 2.14

Элементы: <COLGROUP . . . > . . . </COLGROUP> (закрывающий


дескриптор молсет отсутствовать)
<COL . . . > . . . </COL> (закрывающий дескриптор
может отсутствовать)
Атрибуты: ALIGN, VALIGN, SPAN, WIDTH
Элемент COLGROUP, который первоначально создавался как расширение Internet
Explorer, предназначен для группировки столбцов таблицы. Данный элемент помогает
2 . 4 . Таблицы 77

управлять форматированием различных столбцов. Без элемента COLGROUP для установ­


ки необходимого формата столбца пришлось бы непосредственно задавать формат со­
ответствующей ячейки в каждой строке. Наиболее часто COLGROUP используется для
управления горизонтальным выравниванием текста в столбцах. Если в составе откры­
вающего дескриптора TABLE задан атрибут RULES="GROUPS", то при отображении в
окне броузера группы, сформированные с помощью COLGROUP, отделяются друг от дру­
га вертикальными линиями. Для управления форматированием отдельных столбцов в
составе COLGROUP используются элементы COL. Элемент COL указывается непосредст­
венно после открывающего дескриптора COLGROUP. Заметьте также, что элемент
COLGROUP должен быть расположен перед элементом THEAD или TBODY.

ALIGNHVALIGN
Атрибут ALIGN (допустимые значения: LEFT, RIGHT, CENTER, JUSTIFY и CHAR) за­
дает горизонтальное выравнивание для всех ячеек, объединенных с помощью
COLGROUP или COL. По умолчанию принимается значение LEFT, за исключением
тех случаев, когда ячейки объединены с помощью THEAD. Ячейки, принадлежащие
группе, созданной с помощью THEAD, по умолчанию выравниваются по центру.
Однако следует заметить, что выравнивание, заданное явно, изменяет тип вырав­
нивания для раздела заголовка. С этим побочным эффектом легко справиться, за­
давая атрибут ALIGN для каждого из элементов ТН либо используя соответствую­
щие средства листов стилей. Атрибут VALIGN (допустимые значения: ТОР, MIDDLE,
BOTTOM и BASELINE) задает вертикальное выравнивание для всех ячеек в группе.
По умолчанию принимается значение MIDDLE. Значение BASELINE было описано
при рассмотрении атрибута ALIGN элемента TR. Следует заметить, что значения
JUSTIFY, CHAR и BASELINE поддерживаются не всеми броузерами.

SPAN и WIDTH
Атрибут SPAN указывает, какое количество последовательно расположенных
столбцов принадлежит элементу COLGROUP или COL. Атрибут WIDTH задает размер
группы COLGROUP или COL в процентах от ширины таблицы.
В листинге 2.15 показан простой пример группировки столбцов таблицы и управ­
ления выравниванием каждого столбца. Один из элементов COLGROUP, расположен­
ный перед элементом THEAD, связывается с первыми тремя столбцами, а второй эле­
мент COLGROUP — с оставшимся столбцом. Тип выравнивания каждого столбца в пер­
вой группе задается с помощью элемента COL. На рис. 2.11 показано, как таблица
отображается в окне броузера Internet Explorer 5.0, выполняющегося в среде Windows
2000 Professional. Поскольку в открывающем дескрипторе TABLE указано значение
GROUPS атрибута RULES, группы столбцов разделяются линией.

Листинг 2 . 1 5 . Управление выравниванием ячеек в столбцах и отображением


разделительных линий

<TABLE CELLPADDING=3 RULES="GROUPS">


<CAPTION>Stout Medal Award</CAPTION>
<COLGROUP>
<COL ALIGN="CENTER">
78 Глава 2. Элементы блокового уровня HTML 4.0

<COL ALIGN="LEFT">
<COL ALIGN="CENTER">
<COLGROUP ALIGN="RIGHT">
<THEAD>
<TR><TH>Year<TH>Cultivar<TH>Bloom Season<TH>Cost
<TBODY>
<TR><TD>1965<TD>Luxury Lace <TD>M <TD>11.75
<TR><TD>197 6<TD>Green Flutter<TD>M <TD> 7.50
<TR><TD>1984<TD>My Belle <TD>E <TD>12.00
<TR><TD>1985<TD>Stella De Oro<TD>E~L<TD> 5.00
<TR><TD>1989<TD>Brocaded Gown<TD>E <TD>14.50
<TFOOT>
<TR><TD C0LSPAN=4>E-early M - m i d s e a s o n L - l a t e
</TABLE>

L^fi^^'^?!'7''^^a;!'7l-li^ft^ -lDiiSj|
' FSe Edt View Favoritej Took НЫр

! ^^BacK ' «- - .'^1 J 3 :2} bse«ch ^ y Favorites

Table Colgi cups


1 stout Medal Award
1 Year Cultivar Bloom Season Cost
j 1965 Luxury Lace M 11.75 j
I 1976 Green Flutter M 7.50
1984 MyBeUe E 12.00
1985 SteUaDeOro E-L 5.00
1989 Brocaded Gown E 14.50 Рис. 2.11. Отображение таблицы, код
E-early M-midseason L-late которой приведен в листинге 2.15;
элементы COLGROUP И COL используются
для управления выравниванием и
^Oone 1Ф Interne
отображением разделительных линий

2.5. Формы
Элемент FORM позволяет организовать ввод данных в документ. Пользователь при
просмотре Web-страницы заполняет форму, и введенные данные передаются на сер­
вер для обработки. Как привило, в состав элемента FORM входят поля и окна редакти­
рования текста, флажки опций, переьслючатели опций, списки и кнопки. Подробно
элемент FORM будет рассматриваться в главе 18.

2.6. Прочие элементы блокового уровня


Кроме рассмотренных выше, к элементам блокового уровня относятся HR, кото­
рый отображает горизонтальную линию, используемую как разделитель, DIV, кото­
р ы й задает тип выравнивания других элементов, а также CENTER, с помощью которо­
го фрагмент текста выравнивается по центру.
2.6. Прочие элементы блокового уровня 79

Элемент: <HR ...> (закрывающий дескриптор отсутствует)


Атрибуты: ALIGN, WIDTH, SIZE, NOSHADE, COLOR (нестандартный)
Горизонтальная линия, создаваемая посредством элемента HR, используется для
разделения различных частей документа. Длина линии может быть равной ширине
окна броузера или ее части. Н и ж е описаны атрибуты дескриптора <HR>. Все атрибуты
не рекомендованы для применения. Аналогичного э ф ф е к т а автор документа может
добиться, используя средства листов стилей.

ALIGN
Атрибут ALIGN задает горизонтальное выравнивание. Допустимыми значениями
являются LEFT, RIGHT и CENTER. П о умолчанию принимается значение CENTER.

WIDTH
Атрибут WIDTH задает длину линии в пикселях (<HR WI DTH=7 5>) либо в процентах
от ширины окна броузера (<HR WIDTH="50%">). П о умолчанию принимается зна­
чение 100%.

SIZE
Атрибут SIZE определяет толщину линии в пикселях. Толщина л и н и и прибавляет­
ся к размеру тени, используемой для того, чтобы линия казалась "выгравирован­
ной". По умолчанию принимается толщина, равная одному пикселю.

NOSHADE
Если задан атрибут NOSHADE, л и н и я отображается без затенения, создающего эф­
фект "гравировки".

COLOR
COLOR— нестандартный атрибут, поддерживаемый Internet Explorer. Д а н н ы й ат­
рибут изменяет цвет линии. Цвет задается в формате RGB (см. табл. 1.1).

Элемент: <DIV .-> ... </DIV>


Атрибут: ALIGN
Элемент DIV разбивает документ на разделы. Тип выравнивания каждого раздела
контролируется посредством атрибута ALIGN или с помощью листов стилей. Допус­
тимыми значениями атрибута ALIGN являются LEFT, RIGHT, CENTER и JUSTIFY.
В HTML 4.0 атрибут ALIGN не рекомендован для использования, поэтому авторы до­
кументов должны отдавать предпочтение каскадным листам стилей.

Элемент: <CENTER>... </CENTER>


Атрибуты: отсутствуют
Элемент CENTER не рекомендован для применения в HTML 4.0 и выполняет те же
действия, что и выражение <DIV ALIGN= "CENTER">, часто используется для обеспе­
чения совместимости с ранними версиями броузеров.
80 Глава 2. Элементы блокового уровня HTML 4.0

Элемент: <SCRIPT TYPE="..." ...> ... </8СЮРТ>


Атрибуты: TYPE (обязательный), LANGUAGE, SRC, DEFER, CHARSET
Элемент SCRIPT используется для включения программ, чаще всего написанных
на языке JavaScript. Подробно элемент SCRIPT и JavaScript-программы будут описаны
в главе 24.

Элемент: <NOSCRIPT>... </NOSCRIPT>


Атрибуты: отсутствуют
Содержимое элемента NOSCRIPT игнорируется броузерами, поддерживающими
JavaScript. С помощью этого элемента представляется альтернативный текст для бро­
узеров, которые не могут обработать JavaScript-программу. Дополнительные сведения
об использовании этого элемента вы найдете в главе 24.

Элемент: <MULTICOL CQLS=xx)c...>... </MULTICOL> (нестандартный)


Атрибуты: COLS (обязательный), GUTTER, WIDTH
Элемент MULT I COL представляет собой Netscape-расширение. Впервые этот эле­
мент был введен в Navigator 3.0 для отображения текста в несколько колонок, как в га­
зетах и журналах. Текст, отформатированный с помощью элемента MULTICOL, отли­
чается от обычной HTML-таблицы тем, что в очередной колонке автоматически рас­
полагается текст, являющийся продолжением предыдущей, а также тем, что ширина
всех колонок одинакова. В таблицах фрагменты текста жестко связаны с ячейками, а
ширина столбцов может быть различной. Броузеры Netscape и Internet Explorer по­
зволяют назначать различным ячейкам различные фоновые изображения. Элемент
MULTICOL не обеспечивает такой возможности.

COLS
Этот обязательный атрибут задает число колонок для отображения текста. Значе­
ние COLS должно быть больше или равно двум.

GUTTER
Этот необязательный атрибут определяет расстояние в пикселях между колонка­
ми. По умолчанию используется значение 10.

WIDTH
Атрибут WIDTH указывает ширину колонки в пикселях. Если данный атрибут не
указан, Netscape распределяет доступное пространство поровну между колонками.

2.7. Резюме
Элементы блокового уровня позволяют создавать основные компоненты Web-
страницы. С их помощью можно создавать заголовки, различные типы абзацев, спи­
ски, таблицы, формы для ввода данных и другие конструкции. Для того чтобы изме­
нить формат части текста внутри блокового элемента, надо использовать элементы
текстового уровня.
2.6. Прочие элементы блокового уровня 81

Как отмечалось в данной главе, некоторые элементы и атрибуты, соответствую­


щие HTML 3.2, согласно новой спецификации HTML 4.0 не рекомендованы для при­
менения. Эти элементы продолжают поддерживаться Netscape и Internet Explorer,
однако если автор использует их в документе, он должен включить промежуточную
декларацию DOCTYPE. Это необходимо для проверки синтаксиса документа. Многие
новые элементы (например, THEAD, COLGROUP и MULTICOL) поддерживаются не все­
ми броузерами, поэтому, применяя их, надо соблюдать осторожность.
ЭЛЕМЕНТЫ
ТЕКСТОВОГО
УРОВНЯ HTML 4.0

В этой главе...

• Использование физических стилей.


• Использование логических стилей.
• Определение гипертекстовых ссылок.
• Включение изображений.
• Создание активизируемых областей изображений.
• Встраивание аплетов, аудио-,
видео- и ActiveX-компонентов.
• Управление переносом на новую строку.
J~y\:EJ^zJ

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


о создании гипертекстовых ссылок, разрывах строк и встроенных объектах.
Элементы текстового уровня выполняют эти задачи, задавая представление
текста в составе элементов блокового уровня. Присутствие элемента текстового
уровня не приводит к созданию нового абзаца. В состав элемента текстового уровня
могут быть включены другие элементы текстового уровня, но не могут входить эле­
менты блокового уровня.
При рассмотрении элементов, представленных в данном разделе, мы не будем об­
суждать атрибуты, связанные с листами стилей (см. главу 5) и с обработкой событий
JavaScript (см. главу 24). Не будут рассматриваться также атрибуты DIR, LANG и TITLE,
описанные в главе 1.

3 . 1 . Физические стили отображения


символов
Приведенные ниже элементы задают ш р и ф т ы и определяют особенности ото­
бражения текста. За некоторыми исключениями, эти элементы могут встречаться в
любой части документа. Запрещается использовать их в составе элемента TITLE и
при создании надписей на кнопках SUBMIT. Элементы, определяющие стили, допус­
кают вложенность, благодаря чему появляется возможность объединять различные
характеристики шрифтов.

Элемент: <В>... </В>


Атрибуты: отсутствуют
Элемент В сообщает броузеру о том, что текст, расположенный между открываю­
щим и закрывающим дескрипторами, должен отображаться полужирным шрифтом.
Используя листы стилей, можно изменить тип отображения текста (для получения
дополнительной информации обратитесь к главе 5).
84 Глава 3. Элементы текстового уровня HTML 4.0

Элемент: <1> ... </1>


Атрибуты: отсутствуют
Элемент I указывает броузеру на то, что текст, расположенный между открываю­
щим и закрывающим дескрипторами, должен отображаться курсивом.

Элемент: <ТТ>... </ТТ>


Атрибуты: отсутствуют
При использовании элемента ТТ текст отображается шрифтом фиксированной
ширины.

Элемент: <U>... </U>


Атрибуты: отсутствуют
Элемент U, который, согласно спецификации HTML 4.0, не рекомендован для
применения, задает отображение символов с подчеркиванием.

Элемент: <SUB>... </SUB>


Атрибуты: отсутствуют
Элемент SUB указывает на то, что символы, помещенные между открывающим и
закрывающим дескрипторами, должны отображаться как нижний индекс.

Элемент: <SUP> ..• </SUP>


Атрибуты: отсутствуют
Элемент SUP задает отображение символов как верхнего индекса.

Элемент: <BIG>... </BIG>


Атрибуты: отсутствуют
Элемент BIG указывает броузеру на то, что текст, заключенный между открываю­
щим и закрывающим дескрипторами, должен отображаться шрифтом большего раз­
мера по сравнению с текстом текущего абзаца. Шрифт увеличивается на одну услов­
ную единицу по шкале, насчитывающей семь возможных размеров. Реальный размер
шрифта выбирается броузером. Дополнительная информация приведена далее в этом
разделе при рассмотрении элемента FONT.

Элемент: <SMALL>... </SMALL>


Атрибуты: отсутствуют
Элемент SMALL сообщает броузеру о том, что текст, заключенный между откры­
вающим и закрывающим дескрипторами, должен отображаться шрифтом меньшего
размера по сравнению с текстом текущего абзаца. Шрифт уменьшается на одну услов­
ную единицу по шкале, насчитывающей семь возможных размеров. Реальный размер
шрифта выбирается броузером. Дополнительная информация приведена далее в этом
разделе при рассмотрении элемента FONT.
3 . 1 . Ф и з и ч е с к и е стили о т о б р а ж е н и я символов 85

Элемент: < D E L > . . . < / D E L >


Атрибуты: CITE, DATE TIME
С помощью элемента DEL помечаются фрагменты, удаленные из предыдущих вер­
сий документа. В Internet Explorer 5.0 удаленный текст отображается перечеркнутым.
Netscape не изменяет представление текста. Необязательный атрибут CITE задает
URI документа, который объясняет, почему информация была удалена. Атрибут
DATETIME указывает дату и время, соответствующие моменту, в который материал
был помечен для удаления. З н а ч е н и е DATETIME задается в ф о р м а т е YYYY-MM-
DDThhrmm: ssTZD. Формат DATETIME подробно описан в документе h t t p : / / w w w .
w3.org/TR/html40/types.html#type-datetime.

Элемент: <INS>... </INS>


Атрибуты: CITE, DATETIME
Элемент INS выполняет действия, обратные по отношению к DEL. INS помечает
материал, добавленный в предыдущую версию документа. Internet Explorer 5.0 ото­
бражает новый текст с подчеркиванием, а Netscape не изменяет представление тек­
ста. Назначение атрибутов CITE и DATETIME такое же, как и для элемента DEL.

Элемент: <Q>... </Q>


Атрибут: CITE
Элемент Q предназначен для представления кратких фрагментов цитируемого
текста. Атрибут CITE задает URI документа, из которого извлечена цитата. В настоя­
щее время ни Netscape, ни Internet Explorer не поддерживают этот элемент.

Элемент: <BDO DIR="..." ...> ... </BDO>


Атрибут: DIR, LANG
Для символов Unicode и ISO задается направление слева направо (LTR — left to
right) или справа налево (RTL — right to left). Элемент BDO изменяет направление сим­
волов, содержащихся между открывающим и закрывающим дескрипторами. Атрибут
01R указывает направление, которое может быть либо LTR, либо RTL. Атрибут LANG,
значение которого зависит от регистра символов, определяет язык, на котором пред­
ставлен текст. Более подробную и н ф о р м а ц и ю см. в главе 1.
В листинге 3.1 представлены п р и м е р ы использования различных стилей, а на
рис. 3.1 показано, как данная Web-страница выглядит на экране броузера.

Листинг 3 . 1 . Пример определения стилей для отображения символов

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Physical C h a r a c t e r Styles</TITLE>
</HEAD>
<BODY BGCOLOR="WHITE">
<Hl>Physical C h a r a c t e r Styles</Hl>
<B>Bold</B><BR>
<I>Italic</I><BR>
<TT>Teletype (Monospaced)</TT><BR>
86 Глава 3. Элементы текстового уровня HTML 4.0

<U>Underlined</U><BR>
Subscripts: f<SUB>0</SUB> + f<SUB>l</SUB><BR>
Superscripts: x<SUP>2</SUP> + y<SUP>2</SUP><BR>
<SMALL>Sinaller</SMALL><BR>
<BIG>Bigger</BIG><BR>
<STRIKE>Strike Through</STRIKE><BR>
<B><I>Bold Italic</I></B><BR>
<BIG><TT>Big Monospaced</TT></BIG><BR>
<SMALL><I>Small Italic</I></SiyLALL><BR>
<FONT COLOR="GRAY">Gray</FONT><BR>
<DEL>Delete</DEL><BR>
<INS>Insert</INS><BR>
</BODY>
</HTML>

^ Physicai tbm-m^eitmvkss^^fmm^m
Ne Edit View Favorites loots Hdp

4->Всн:к ^ ^ "'41^] i 2 ' '^Search ^£jFavorй»5 ** Links

3
Physical Character Styles
Bold
Italic
T e l e t y p e (Monospaced)
Underlined
Subscnpts: ^ + fj
Superscripts: x^ + y^
Smaller
Bigger
S t n k e Tlii-ough
Bold Italic
Big Monospaced
SmaW Italic

Insert Рис. 3.1. Примеры использования стилей,


d отображаемые в броузере Internet Explorer 5.0
jejOone lyiSi, My Computer в среде Windows 2000 Professional

Элемент: <FONT ...> ... </FONT>


Атрибут: SIZE, COLOR, FACE (нестандартный)
Д е с к р и п т о р FONT определяет размер или цвет текста. Атрибут SIZE позволяет ав­
тору управлять размером шрифта, а атрибут COLOR дает возможность задавать цвет
для отображения текста, содержащегося между открывающим и закрывающим деск­
рипторами. Как вы уже знаете, элементы текстового уровня не могут включать эле­
менты блокового уровня. Поэтому, если вам надо изменить представление несколь­
ких последовательно расположенных абзацев, списков или таблиц, следует задать де­
скрипторы FONT для каждого из этих элементов. Для того чтобы определить цвет
всего документа, можно воспользоваться атрибутом дескриптора BODY, а размер
ш р и ф т а задается посредством атрибута BASE FONT (он будет описан ниже). Согласно
спецификации H T M L 4.0, элемент FONT не рекомендован для применения. Альтерна­
тивой ему служат средства каскадных листов стилей; с их помощью можно определить
размер, цвет и начертание ш р и ф т а для абзацев и разделов документа. Подробную
информацию по этому вопросу вы найдете в главе 5.
3 . 1 . Ф и з и ч е с к и е стили о т о б р а ж е н и я символов 87

SIZE
Атрибут SIZE может принимать абсолютное значение в пределах от 1 (наимень­
ший размер) до 7 (наибольший размер), а также относительные значения
(SIZE=" + 1", S I Z E = " - 1 " , S I Z E = " + 2 " и т.д.), которые задают изменения текущего
размера шрифта. Реальный размер шрифта для отображения выбирается броузе­
ром. Задавая абсолютные значения, соблюдайте осторожность. Если пользователь
самостоятельно определит ш р и ф т для отображения документа, абсолютные зна­
чения атрибута SIZE могут испортить внешний вид Web-страницы.
Методика профессионалов

По возможности избегайте задавать абсолютные значения размера


шрифта. Используйте относительные значения.

COLOR
Как и при указании цвета в составе элемента BODY, в качестве значения атрибута
COLOR задается логическое имя (допустимые имена цветов перечислены в
табл. 1.1) либо значение в ф о р м а т е RGB. Определяя цвет текста, надо следить за
тем, чтобы он не сливался с фоном.

FACE
Netscape и Internet Explorer поддерживают атрибут FACE, в качестве значения ко­
торого задается список имен шрифтов, разделенных запятыми. Если на клиент­
ской машине есть первый из ш р и ф т о в , указанных в списке, он используется при
отображении документа. В противном случае система проверяет, имеется ли в на­
личии второй ш р и ф т из списка и т.д. Если все ш р и ф т ы , указанные в списке, отсут­
ствуют, применяется ш р и ф т по умолчанию, т.е. броузер ведет себя так, как будто
атрибут FACE не был задан.

Элемент: <BASEFONT SIZE=xxx> (закрывающий дескриптор отсутствует)


Атрибут: SIZE (обязательный)
Элемент BASE FONT задает размер шрифта, используемый по умолчанию для ото­
бражения текста, не принадлежащего заголовкам. В качестве значения задаются аб­
солютные величины в диапазоне от 1 (наименьший размер) до 7 (наибольший раз­
мер). По умолчанию используется значение 3. Как и для элементов FONT, BIG и
SMALL, преобразование семи условных величин в реальные размеры ш р и ф т а выпол­
няется броузером.
Элемент BASE FONT не влияет на цвет текста. Для установки цвета можно восполь­
зоваться атрибутами элемента BODY либо FONT. Аналогичный результат можно полу­
чить, применяя каскадные листы стилей. Согласно спецификации HTML 4, элемент
BASEFONT не рекомендован для использования. П р и м е н я я данный элемент, следует
соблюдать осторожность, поскольку многие пользователи устанавливают размер
шрифта для отображения документов при настройке броузера.
88 Глава 3 . Э л е м е н т ы текстового уровня HTML 4 . 0

3.2. Логические стили отображения


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

Элемент: <ЕМ>... </ЕМ>


Атрибуты: отсутствуют
Элемент ЕМ указывает боузеру на то, что текст, находящийся между открывающим
и закрывающим дескрипторами, должен быть выделен. Большинство броузеров вы­
деляет текст, содержащийся в составе ЕМ, отображгш его курсивом.

Элемент: <STRONG>... </STRONG>


Атрибуты: отсутствуют
Элемент STRONG задает "сильное выделение" содержащегося в нем текста. О б ы ч н о
текст в составе данного элемента отображается полужирным шрифтом.

Элемент: <CODE>... </CODE>


Атрибуты: отсутствуют
Элемент CODE используется для представления фрагментов программного кода.
Текст, содержащийся в составе данного элемента, обычно отображается ш р и ф т о м
фиксированной ширины. Не следует забывать, что некоторые символы, например "<"
и "&:" и другие, используются для разметки, поэтому их надо заменять выражениями
" & l t ; ", "&ашр;" и т.д. Список управляющих символов представлен в табл. 2.1.

Внимание!

Прежде чем поместить фрагмент кода в состав элементов CODE, SANP


или KBD, надо проверить его на наличие символов "<", "&" и т.д.

Элемент: <SAMP>... </SAMP>


Атрибуты: отсутствуют
Элемент SAMP используется для представления результатов выполнения про­
грамм. Подобно CODE, содержимое данного элемента отображается ш р и ф т о м фикси­
рованной ширины.
3.2. Логические стили отображения символов 89

Элемент: <KBD> ... </KBD>


Атрибуты: отсутствуют
Элемент KBD представляет данные, которые пользователь должен ввести с клавиа­
туры. Подобно CODE, содержимое элемента KBD отображается шрифтом фиксиро­
ванной ширины.

Элемент: <DFN>... </DFN>


Атрибуты: отсутствуют
Элемент DFN используется для представления терминов. Internet Explorer отобра­
жает текст, находящийся в составе данного элемента, курсивом. Netscape применяет
для отображения текущий стиль и не изменяет внешний вид терминов по сравнению
с остальным текстом.

Элемент: <VAR>... </VAR>


Атрибуты: отсутствуют
Элемент VAR представляет переменные или параметры функции либо процедуры.
Обычно текст, к о т о р ы й содержится между открывающим и закрывающим дескрип­
торами <VAR>, отображается курсивом.

Элемент: <С1ТЕ> ... </С1ТЕ>


Атрибуты: отсутствуют
Элемент CITE указывает на то, что содержащийся в нем текст представляет собой
цитату либо ссылку. Как правило, этот текст отображается курсивом.

Элемент: <ACRONYM>... </ACRONYM>


Атрибут: TITLE
Элемент ACRONYM часто используется совместно с атрибутом TITLE и предназна­
чен для расшифровки сокращенного названия в процессе работы. Например:
<ACRONYM TITLE="Java D e v e l o p m e n t Kit">JDK</ACRONYM>
Если курсор мыши располагается над подобным элементом, Internet Explorer 5.x
выводит окно, в котором отображается значение атрибута TITLE. Netscape не выво­
дит значение TITLE.
В листинге 3.2 представлены примеры логических стилей. Результаты отображе­
ния приведенных выражений в окне броузера показаны на рис. 3.2.

Листинг 3.2. Примеры логических стилей

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Logical C h a r a c t e r S t y l e s < / T I T L E >
</HEAD>
<BODY BGCOLOR="WHITE">
<Hl>Logical C h a r a c t e r S t y l e s < / H l >
90 Глава 3. Элементы текстового уровня HTML 4.0

<EM>Emphasized</EM><BR>
<STRONG>Strongly Emphasized</STRONG><BR>
<CODE>Code</CODE><BR>
<SAMP>Sample Output</SAMP><BR>
<KBD>Keyboard Text</KBD><BR>
<DFN>Definition</DFN><BR>
<VAR>Variable</VAR><BR>
<CITE>Citation</CITE><BR>
<EM><CODE>Emphasized Code</CODEX/EM><BR>
<FONT COLOR="GRAY"><CITE>Gray Citation</CITE></FONT><BR>
<ACRONYM TITLE="Java Development Kit">JDK Acronym</ACRONYM>
</BODY>
</HTML>

iMfWTH^ni-i!^.,.!!, I Hl.l,..i i U L I „ . l J — p^jgfxf


ЮН
\ ^- J J ^ a -±j J -Ji- ^^3s_ -_' ~
^
Logical Character Styles
[| Emphasized
1 Strongly Emphasized
1 Code
:| Semple Output
1 Keyboard Text
I Dejinilion
1 Variable
1 Citation
1 Emphasized Code
Рис. 3.2. Отображение логических
1 JDK Acronym
1 ^ [Java Developmenl K.it]
стилей в окне Internet Explorer 5.0,
^ выполняющегося в среде Windows 2000
.ij^Done : i My CoflfipUer '¥Щ Professional

Элемент: <ABBR ...> ... </ABBR>


Атрибут: TITLE
Элемент ABBR, пример использования которого приведен ниже, отображает аб­
бревиатуру.
<ABBR TITLE="cubic inches">cu. in.</ABBR>
Ни Netscape, ни Internet Explorer не поддерживают этот элемент.

Элемент: <SPAN ...> ... </SPAN>


Атрибуты: CLASS, ID, STYLE
SPAN— это элемент текстового уровня, предназначенный для поддержки каскад­
ных листов стилей. Элемент SPAN будет рассмотрен в главе 5.

3.3. Построение гипертекстовых ссылок


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

возможность переходить по ссылкам и отображать информацию, наиболее интересую­


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

Элемент: <А ...>... </А>


Атрибуты: HREF, NAME, TARGET, REL, REV, TITLE, ONFOCUS, ONBLUR, COORDS,
SHAPE,TYPE, HREFLANG, CHARSET, ACCESSKEY, TABINDEX
Элемент A представляет собой контейнер, причем закрывающий дескриптор обя­
зательно должен быть задан. Если в составе элемента А указан атрибут HREF, содер­
жимое элемента становится чувствительным к действиям мыши. П р и активизации
данного элемента броузер отображает ресурс, на который указывает значение атри-
буга HREF. Текст, помещенный между открывающим и закрывающим дескрипторами
<А>, обычно отображается с подчеркиванием и выводится синим цветом либо цве­
том, заданным посредством атрибута LINK элемента BODY. Цвет для отображения ги­
пертекстовых ссылок может быть также определен с помощью листов стилей. Ссыл­
ки, указывающие на документы, которые были просмотрены пользователем в теку­
щем сеансе, обычно выводятся с подчеркиванием и отображаются цветом, заданным
с помощью атрибута VLINK. В зависимости от механизма отслеживания предыстории
работы, ссылки на документы, просмотренные в предыдущих сеансах, также могут
отображаться подобным образом.

HREF
Атрибут HREF задает адрес ресурса, который броузер должен загрузить в том слу­
чае, если пользователь активизирует ссылку (щелкнет кнопкой мыши в указанной
области). Значением HREF может быть абсолютный URL, относительный URL,
символ "#" за которым следует имя позиции в документе (см атрибут NAME), либо
URL, после которого указан символ "#", сопровождаемый именем позиции. Если
указан конкретный раздел документа, при активизации ссылки броузер копирует
этот документ и отображает его, начиная с заданной позиции. В противном случае
броузер отображает начало требуемого документа.
Как будет показано в главе 19, если в URL, определяющем каталог, не указана за­
вершающая косая черта, броузер устанавливает два соединения с HTTP-сервером.
Во время первого соединения броузер получает корректный URL, а во время вто­
рого соединения он отправляет запрос, к о т о р ы й содержит URL, скорректирован­
ный в соответствии с полем L o c a t i o n в ответе HTTP-сервера. Если производи­
тельность линий связи невелика, лишний запрос приводит к ненужной трате вре­
мени. Поэтому вместо http://some.host.com/some/directory всегда
задавайте h t t p : / / s o m e . h o s t , c o m / s o m e / d i r e c t o r y / .

Совет

Если URL указывает на каталог, убедитесь, что в его составе указана


завершающая косая черта.
92 Глава 3 . Э л е м е н т ы текстового уровня HTML 4 . 0

В листинге 3.3 показаны ч е т ы р е типа гипертекстовых ссылок, содержащих абсо­


лютный URL, относительный URL, указывающих на позицию внутри текущего до­
кумента, а также на позицию в документе с заданным URL. Помимо ссылок h t t p : ,
большинство броузеров также поддерживают ссылки m a i l t o : (для адресов элек­
т р о н н о й почты), f i l e : (для локальной файловой системы на клиентской маши­
не) и f t p : (для FTP-узлов).

Листинг 3.3. Гипертекстовые ссылки

The official HTML specifications are available from


<A HREF="http://www.w3.org/MarkUp/"> the World Wide Web
Consortium (W3C)</A>, with some examples given in
<A HREF= "HTML-Examples .html">my example page</A>.
The Java programming language is discussed in
<A HREF="#Section-3">Section 3</A>. For a discussion of COBOL, see
<A HREF="johndoe.html#COBOL">my husband's home page</A>.

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


значительно удобнее, если текст, о ф о р м л е н н ы й как ссылка, отражает ее назначе­
ние. Подобный документ выигрывает по сравнению с тем, в котором описание
размещено до или после ссылки, а в состав элемента включается формальное вы­
ражение типа "click here". Н и ж е приведен пример гипертекстовой ссылки.
Recent Dilbert strips are available on-line at
<A HREF="http://www.unitedmedia.com/comics/dilbert/">
The Dilbert Zone</A>.
Такое оформление ссылки существенно выигрывает по сравнению с приведенным
ниже примером.
<А HREF="http://www.unitedmedia.com/comics/dilbert/">
Click here</A> to see recent Dilbert strips that are
available on-line at The Dilbert Zone.

М е т о д и к а профессионалов

Избегайте ссылок типа "click here". Старайтесь, чтобы текст,


оформленный в виде ссылки, отражал ее назначение.

NAME
Атрибут NAME присваивает имя позиции в документе. В результате на эту позицию
могут указывать ссылки, в которых значение атрибута HREF содержит символ "#".
Например:
<А NAME="COBOL">COBOL: А Programming Language f o r t h e Future</A>
Имя, задаваемое с помощью атрибута NAME, зависит от регистра символов.

TARGET
Атрибут TARGET указывает на то, что документ должен быть открыт в конкретном
кадре либо в новом окне. Атрибут TARGET будет подробно рассмотрен в главе 4.
3.3. Построение гипертекстовых ссылок 93

TITLE
Атрибут TITLE присваивает заголовок документу, в котором заголовок отсутствует
(например, каталогу FTP). В некоторых броузерах с помощью TITLE предлагается
тема электронного письма (поле s u b j e c t : ) . Значение TITLE может быть исполь­
зовано индексирующими программами для построения меню ссылок.

RELHREV
REL и REV применяются гораздо реже, чем другие атрибуты. С их помощью можно
определить отношение текущего документа к связанному (REL) и связанного доку­
мента — к текущему (REV).

ONFOCUS и ONBLUR
Эти атрибуты используются броузерами, поддерживающими JavaiScript. С их по­
мощью определяется JavaScript-код, обрабатывающий события, связанные с полу­
чением и потерей фокуса. Получение и потеря фокуса может происходить в ре­
зультате действий с клавиатурой или мышью. Дополнительную и н ф о р м а ц и ю вы
найдете в главе 24.

COORDS и SHAPE
Если гипертекстовая ссылка представляет карту изображений, связанную с CGI-
программой, атрибут COORDS задает координаты (х,у) области изображения. Ат­
рибут SHAPE указывает, как должны интерпретироваться пары (х,у). Д а н н ы е атри­
буты будут подробнее рассмотрены в разделе 3.5.

TYPE, CHARSET и H R E F L A N G
Атрибут TYPE определяет МШЕ-тип, связанный с ресурсом, на который указывает
ссылка, например TYPE=" t e x t / h t m l " . Атрибут CHARSET задает кодировку свя­
занного документа, например CHARSET="ISO-8859-6". Атрибут HREFLANG опре­
деляет язык ресурса, например, выражение HREFLANG="pt" означает, что доку­
мент, на который указывает ссылка, представлен на португальском языке.

ACCESSKEY и T A B I N D E X
Атрибут ACCESSKEY задает единичный символ (соответствующий кодировке доку­
мента), который используется в сочетании с клавишей <Alt> (в системе MS-
Windows) или <Cmd> (в системе Apple). П р и нажатии комбинации клавиш фокус
перемещается к соответствующему элементу. Атрибут TABINDEX указывает целое
число в диапазоне 0-32767, которое задает порядок элементов в документе. Если
пользователь перемещается по документу с помощью клавиатуры, TABINDEX опре­
деляет порядок получения фокуса элементами документа. По умолчанию все эле­
менты, не поддерживающие атрибут TABINDEX, получают значение 0. Элементы с
одинаковыми значениями получают фокус в том порядке, в котором они встреча­
ются в документе. Internet Explorer 5.0 поддерживает оба указанных атрибута.
Netscape 4.x не поддерживает ни ACCESSKEY, ни TABINDEX.
94 Глава 3. Элементы текстового уровня HTML 4.0

3.4. Встроенные изображения


Элемент IMG позволяет включать изображения в состав документа. Большинство
броузеров может обрабатывать форматы GIF (Graphic Interchange Format), JPEG (Joint
Photographic Expert Group) и PNG (Portable Network Graphic), кроме того, ряд броузе­
ров непосредственно либо с помощью дополнительных модулей поддерживает форма­
ты xbm, x m p и bmp. Для таких изображений, как чертежи, построенные с помощью
графических пакетов, GIF-представление более компактно по сравнению с представле­
нием в формате JPEG. Для оцифрованных фотоснимков и других изображений, харак­
теризующихся частыми изменениями цвета, размер JPEG-файлов, как правило, получа­
ется меньше по сравнению с GIF-файлами. Поскольку время копирования изображения
определяет время копирования всей страницы, желательно представлять изображение
в том формате, который обеспечивает минимальный размер файла.

Анимационные аГ-файлы
Многие броузеры поддерживают стандарт GIF89A, к о т о р ы й позволяет включать в
состав одного графического файла несколько кадров. Кадры сменяют друг друга через
определенный интервал времени, что создает э ф ф е к т простой анимации. Если бро­
узер поддерживает только формат GIF87, он может корректно отобразить первый
кадр в составе изображения GIF89A. GIF89A является альтернативой анимации на ба­
зе Java, при этом структура Web-страницы существенно упрощается. Многие про­
граммные пакеты позволяют создавать файлы GIF89A, объединяя несколько единич­
ных изображений, представленных в различных форматах, либо конвертируя анима­
ционные файлы AVI или QuickTime.

Элемент IMG
Элемент: <IMG SRC="..." ALT="..," ...> (закрывающий дескриптор
отсутствует)
Атрибуты: SRC (обязательный), ALT (обязательный), ALIGN, WIDTH, HEIGHT, HSPACE,
VSPACE, BORDER, USEMAP, ISMAP, NAME, LONGDESC, ONLOAD (нестандартный), ONERROR
(нестандартный), ONABORT (нестандартный)
Элемент IMG включает изображение в текущую позицию в документе. Заметьте,
что IMG представляет собой элемент текстового уровня и не приводит к созданию но­
вого абзаца. IMG не является контейнером, поэтому закрывающий дескриптор не ука­
зывается.

SRC
SRC — обязательный атрибут. О н определяет расположение файла, содержащего
изображение, которое должно быть включено в документ. Значением SRC может
быть как абсолютный, так и относительный URL. П р и м е р ы элементов IMG, со­
держащих атрибуты SRC, приведены ниже.
<IMG SRC="http://www.some-isp.сош/~jane/portrait.jpg"
ALT="Jane Doe">
<IMG SRC="images/spot.gif" WIDTH=150 HEIGHT=120
ALT="My dog Spot">
3 . 4 . Встроенные и з о б р а ж е н и я 95

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

WIDTH и H E I G H T
Эти два атрибута определяют раЗхМеры области, которую должно занимать изобра­
жение в документе. Размеры задаются в пикселях. Если в составе элемента IMG указа­
ны атрибуты WIDTH и HEIGHT, броузер может сначала отобразить текст, а затем за­
грузить и вывести изображение, не изменяя структуру страницы. Подобный подход
к отображению страницы улучшает ее восприятие пользователем. Если, работая с
Netscape, вы непосредственно загрузили изображение, то, выбрав пункт P a g e Info
меню View, вы можете определить размеры этого изображения. Размеры также ото­
бражаются в заголовке окна Netscape. В Internet Explorer 5.0, чтобы определить раз­
меры изображения, достаточно расположить поверх него курсор мыши, щелкнуть
правой кнопкой и выбрать в контекстном меню пункт Properties. Если значения ат­
рибутов WIDTH и HEIGHT не совпадают с реальными размерами изображения, изо­
бражение растянется или сожмется, чтобы соответствовать размерам, заданным в
составе дескриптора IMG. Если при загрузке размеры изображения изменились, то
при выборе пункта Properties из контекстного меню Internet Explorer сообщает не
исходные размеры изображения, а его размеры в окне броузера.

Методика профессионалов

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


атрибуты ALT, WIDTH и HEIGHT.

ALIGN
Атрибут ALIGN, который, согласно спецификации HTML 4.0, не рекомендован для
применения, определяет расположение изображения относительно текстовой
строки, в которой присутствует дескриптор <IMG>. Допустимыми значениями
данного атрибута являются LEFT, RIGHT, TOP, BOTTOM и MIDDLE. П о умолчанию
принимается значение BOTTOM. З н а ч е н и я LEFT и RIGHT задают обтекание изо­
бражения текстом и обычно указываются тогда, когда изображение используется в
качестве иллюстрации. Если вы указали значение LEFT или RIGHT и не хотите,
чтобы рядом с изображением выводился текст, надо использовать элемент <BR
CLEAR="ALL">. Подробно элемент BR будет рассматриваться далее в этой главе.
Значение MIDDLE применяется при работе с изображениями малого размера, вы­
полняющего функции маркера. В листинге 3.4 приведены различные примеры
выравнивания. Результаты показаны на рис. 3.3.
96 Глава 3. Элементы текстового уровня HTML 4.0

^b^3k:i^t^m4A^kMl^tM^^
Image Alignment
I Alignment Result
^ ^ ^ This positions the image at the left side, with text flowing around it
^w\ 5, ^ <5п the nght
LEFT .VJIOT^"

r^ : ^_____
This positions the image at the nght side, with text flowing around ^ ^ ^
it on the left '^'wi^N^'
RIGHT ,4Jp}^'

^ ^ ^ Here, the image runs into the paragraph and the line containing the

image is aligned with the image top.

Here, the image runs into the paragraph and the line containing the
iimage is aligned with the image bottom.

j9>,*^ Here, the image runs into the paragraph and Ле line containing the

image is aligned with the image center.

^Щ^х ' !C^Jaёtmж* DowT'^


"^Шт^^^ШШ^!^.
Рис. 3.3. Пять типов выравнивания изображений

Листинг3.4. Image~Alignment.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Iinage Alignment</TITLE>
</HEAD>
<BODY>
<H1 ALIGN="CENTER">Image Alignment</Hl>

<TABLE B0RDER=1>
<TR><TH>Alignment
<TH>Result
<TR><TH><CODE>LEFT</CODE>
<TD><IMG SRC="rude-pc.gif" ALIGN="LEFT"
ALT="Rude PC" WIDTH=54 HEIGHT=77>
This positions the image at the left side,
with text flowing around it on the right.
<TR><TH><CODE>RIGHT</CODE>
<TD><IMG SRC="rude-pc.gif" ALIGN="RIGHT"
ALT="Rude PC" WIDTH=54 HEIGHT=77>
This positions the image at the right side,
with text flowing around it on the left.
<TR><TH><CODE>TOP</CODE>
3.4. Встроенные изображения 97

<TD><IMG SRC="rude-pc.gif" ALIGN="TOP"


ALT="Rude PC" WIDTH=54 HEIGHT=77>
Here, the image runs into the paragraph
and the line containing the image is
aligned with the image top.
<TR><TH><CODE>BOTTOM</CODE>
<TD><IMG SRC="rude-pc.gif" ALIGN="BOTTOM"
ALT="Rude PC" WIDTH=54 HEIGHT=77>
Here, the image runs into the paragraph
and the line containing the image is aligned
with the image bottom.
<TR><TH><CODE>MIDDLE</CODE>
<TD><IMG SRC="rude-pc.gif" ALIGN="MIDDLE"
ALT="Rude PC" WIDTH=54 HEIGHT=77>
Here, the image runs into the paragraph
and the line containing the image is aligned
with the image center.
</TABLE>

</BODY>
</HTML>

HSPACE и VSPACE
Эти атрибуты задают размеры пустого пространства (в пикселях) слева и справа от
изображения (HSPACE), а также над и под изображением (VSPACE). Часто по умол­
чанию принимается значение 2. HTML 4.0 явно не определяет средства, обеспе­
чивающие перекрытие изображений и расположение текста над изображением,
но этот э ф ф е к т можно реализовать, задавая отрицательные границы в каскадных
листах стилей. Поскольку и HSPACE, и VSPACE не рекомендованы для применения,
мы рекомендуем использовать для контроля границ изображения листы стилей.
Подробные сведения о работе с листами стилей вы найдете в главе 5.

BORDER
Атрибут BORDER, также не рекомендованный для применения, задает ширину рам­
ки, отображаемой вокруг изобрг1жения, оформленного в виде гипертекстовой
ссылки. По умолчанию принимается значение, равное 2.

USEMAP
Атрибут USEMAP задает имя компонента MAP как " # n a m e " или "URL#name". Под­
робное описание и п р и м е р ы использования данного атрибута приведены далее в
этой главе.

ISMAP
Атрибут ISMAP задает использование изображения как карты, связанной с CGI-
программой. Данный атрибут допустим только в том случае, когда изображение
является частью гипертекстовой ссылки. Дополнительную и н ф о р м а ц и ю по этому
вопросу вы найдете в главе 18.
98 Глава 3. Элементы текстового уровня HTML 4.0

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

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

ONLOAD, ONERROR и ONABORT


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

3.5. Карты изображений на стороне клиента


Элемент: <МАР NAME='..."> ... </МАР>
Атрибуты: NAME (обязательный)
Элемент MAP дает возможность автору документа создавать карты изображений па
стороне клиента. С помощью этого элемента можно связывать URL с разными облас­
тями изображения. Карты изображений используются для навигации, подобно обыч­
ным картам. Карты изображений полностью обрабатываются броузером, в этом они
отличаются от карт изображений на стороне сервера, для создания которых используется
ISMAP или специальный тип элемента INPUT (оба элемента описаны в главе 18). Для
того чтобы определить необходимую операцию для карты изображений, созданной с
помощью ISMAP или INPUT, необходимо установить соединение с сервером. Атрибут
NAME является обязательным и используется как целевое имя для атрибута USEMAP
элемента IMG. Каждая из областей, допускающих активизацию с помощью мыши,
описывается посредством элемента AREA, к о т о р ы й располагается между открываю­
щим и закрывающим дескрипторами MAP.
В листинге 3.5 приведен пример изображения, разделенного на четыре квадранта.
С каждым из квадрантов связан HTML-документ. Изображения в окне броузера до и
после щелчка на нижнем левом квадранте показаны соответственно на рис. 3.4 и 3.5.
Для отображения данного примера использовался броузер Internet Explorer 5.0, вы­
полняющийся в среде Мае OS 9.

Листинг 3.5. Карта изображений

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Kansas Topography</TITLE>
</HEAD>
<BODY>
3.5. Карты изображений на стороне клиента 99

<Н1 ALIGN="CENTER">Kansas Topography</Hl>


Click on a region of Kansas to get information on
the terrain in that area.
<P>
<IMG SRC="kansas.gif" ALT="Kansas" WIDTH=385 HEIGHT=170
USEMAP="#Kansas" BORDER=0>
<MAP NAME="Kansas">
<AREA HREF="nw.html"
SHAPE="RECT"
COORDS="0,0, 192, 85"
ALT="North West">
<AREA H R E F = " n e . h t m l "
SHAPE="RECT"
COORDS="193, 0 , 3 8 5 , 8 5 "
ALT="North E a s t " >
<AREA H R E F = " s w . h t m l "
SHAPE="RECT"
COORDS="0,86,192,170"
ALT="South West">
<AREA H R E F = " s e . h t m l "
SHAPE="RECT"
COORDS="193,86, 3 8 5 , 1 7 0 "
ALT="South E a s t " >
</MAP>
</BODY>
</HTML>

) Kdnsas Topoerephy i :гф Southwest Й


mm mm
t^ Ш Ф й »e
Kansas Topography Flat
Gick on a region of Kansas to get information on the teiiain The southwest legion is flat. Vv'hat did you think this was.
m that area Colorado?

(j^ link: http://<w«v«feprft9r*mm|r>q/Saure»/Chai>t»r3;/sw.Mml } ht«ffi«t ?on«

Рис. 3.4. Карты изображений на стороне Рис. 3.5. Результат активизации нижнего ле­
клиента позволяют связывать Web-страницы с вого квадранта изображения на рис. 3.4
различными фрагментами изображения

Элемент: <AREAALT="..." ...> (закрывающий дескриптор отсутствует)


Атрибуты: HREF, COORDS, SHAPE, ALT ( о б я з а т е л ь н ы й ) , NOHREF, TARGET, ONFOCUS,
ONBLUR, ACCESSKEY, TABINDEX
Э л е м е н т AREA м о ж е т п р и с у т с т в о в а т ь т о л ь к о в с о с т а в е э л е м е н т а MAP. О н о п и с ы в а е т
область к а р т ы и з о б р а ж е н и я , к о т о р а я д о п у с к а е т а к т и в и з а ц и ю с п о м о щ ь ю м ы ш и . К а ж -
100 Глава 3. Элементы текстового уровня HTML 4.0

дой области соответствует один элемент AREA, определяющий расположение активи­


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

HREF
Атрибут HREF определяет целевой документ. В качестве его значения могут быть
заданы абсолютный, относительный URL, а также имя позиции, следующее за
символом "#".

COORDS
Атрибут COORDS содержит список координат области, разделенных запятыми.
Число координат и порядок их обработки зависят от значения атрибута SHAPE.
Координаты должны задаваться целыми числами и интерпретироваться как рас­
стояние в пикселях от верхнего левого угла изображения.

SHAPE
К допустимым значениям атрибута SHAPE относятся RECT (принимается по умол­
чанию), CIRCLE, POLY и DEFAULT. Если значение не равно DEFAULT, атрибут
SHAPE должен использоваться совместно с атрибутом COORDS. Значению RECT со­
ответствуют координаты, заданные в формате "левая граница, верхняя граница,
правая граница, нижняя граница". Н а п р и м е р , следующее выражение связывает
документ r e g i o n 3 . h t m l с областью размером 200x200 пикселей, левый верхний
угол которой расположен в точке (20,40):
<AREA H R E F = " r e g i o n 3 . h t m l "
SHAPE="RECT"
COORDS="20,40,220,240">
Если указано значение CIRCLE, координаты задаются посредством атрибута
COORDS в виде "х,у,радиус". З н а ч е н и е POLY требует координат в виде "х1, у1,х2,
y2,...,xN, yN", определяющих вершины многоугольника. Значение DEFAULT не
предполагает использования атрибута COORDS и означает все изображение цели­
ком. URL, принадлежащий перекрывающимся областям, определяется посредст­
вом первого элемента AREA. Область по умолчанию всегда определяется послед­
ней, независимо от того, указан ли в элементе AREA атрибут SHAPE со значением
DEFAULT.

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

NOHREF
Атрибут NOHREF определяет область, с которой не связан конкретный URL. Этот
атрибут необходим только в том случае, когда вы хотите исключить из числа акти-
3 . 6 . Включение объектов в д о к у м е н т 101

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


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

Поскольку URL выбирается в соответствии с областью, описанной с


помощью первого элемента AREA, элемент с дескриптором NOHREF
должен быть расположен первым в составе элемента MAP. Элемент,
определяющий URL по умолчанию, должен быть расположен по­
следним. #

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

O N F O C U S , O N B L U R , ACCESSKEY и T A B I N D E X
Эти атрибуты используются так же, как и в элементе IMG, описанном ранее.

3.6. Включение объектов в документ


Поскольку Web-клиенты, поддерживающие только текст, встречаются крайне ред­
ко, почти все броузеры могут обрабатывать встроенные файлы изображений. Однако
изображения — не единственный тип объекта, который может быть включен в состав
Web-страницы. Большинство броузеров также поддерживает Java-аплеты. П р о ч и е ау­
дио-, видео-, VRML- и ActiveX-объекты обычно обрабатываются дополнительными
модуляхМИ, встраиваемыми в состав броузера.

Встроенные аплеты
Э л е м е н т : <APPLET CODE="..." W I D T H = x x x H E I G H T = x x x ...> ... < / A P P L E T >
Атрибуты: CODE, WIDTH (обязательный), HEIGHT (обязательный), CODEBASE, ALT, ALIGN,
HSPACE, VSPACE, NAME, OBJECT, ARCHIVE (нестандартный), MAYSCRIPT (нестандартный)
Дескриптор APPLET позволяет включать в состав Web-страниц аплеты. П о д р о б н о
этот вопрос будет рассмотрен в главе 9.

CODE
Атрибут CODE определяет имя Java-файла класса, который должен быть загружен
броузером. Атрибу'т CODE является обязательным за исключением тех случаев, ко­
гда указан атриб)т OBJECT. CODE не задает абсолютный URL, а лии1Ь указывает имя
файла. Если атрибут CODEBASE отсутствует, считается, что файл находится в том
же каталоге, что и Web-страница.
102 Глава 3 . Э л е м е н т ы текстового уровня H T M L 4 . 0

На з а м е т к у

Атрибут CODE нельзя использовать для определения абсолютного


URL. Если расположение аплета отличается от расположения теку­
щего документа, следует применять атрибут CODEBASE.

WIDTH и HEIGHT
Эти атрибуты определяют размеры области в окне броузера, которую должен за­
нимать аплет. Размеры задаются в пикселях либо в процентах от ширины окна
броузера. Следует заметить, что программа a p p l e t v i e w e r , разработанная Sun
(упрощенный броузер, который игнорирует все HTML-дескрипторы за исключе­
нием APPLET), не поддерживает размеры, заданные в процентах, поскольку окно,
относительно которого должны вычисляться размеры, не определено. Атрибуты
WIDTH и HEIGHT обязательны для всех аплетов.

Внимание!

Программа appletviewer, разработанная Sun, не поддерживает


значения атрибутов WIDTH и HEIGHT, заданные в процентах.

CODEBASE
Атрибут CODEBASE определяет URL базового каталога. Из этого каталога загружа­
ется файл, указанный посредством атрибута CODE. Использование данного атрибу­
та описано в главе 9.

ALT
Броузеры, поддерживающие Java, игнорируют все элементы разметки, располо­
женные между дескрипторами <APPLET . . . > и </APPLET>, поэтом)' в области, в
которой должен быть расположен аплет, отображается альтернативный текст.
Атрибут ALT предназначен для тех броузеров, которые поддерживают Java, но в
которых возможность обработки аплетов отключена. Атрибут ALT поддерживает­
ся сравнительно редко, поэтому мы не рекомендуем использовать его.

ALIGN
Атрибут ALIGN определяет выравнивание области, в которой располагается бро­
узер. Для этого атрибута допустимы те же значения, что и для соответствующего
атрибута элемента IMG, к о т о р ы е интерпретируются аналогичным образом.

HSPACE
Атрибут HSPACE задает размеры пустого пространства в пикселях слева и справа
от аплета.

VSPACE
Атрибут VSPACE задает размеры пустого пространства в пикселях снизу и сверху
от аплета.
3 . 6 . Включение объектов в д о к у м е н т 103

NAME
Атрибут NAME присваивает аплету имя, которое используется для организации
взаимодействия между аплетами, а также при обращении к аплету JavaScript-
программы.

OBJECT
Атрибут OBJECT используется для определения сериализованного аплета, кото­
рый был сохранен с использованием средств сериализации Java.

ARCHIVE
Атрибут ARCHIVE определяет архив классов, которые должны быть заранее загру­
жены. Архив задается в ф о р м а т е Java Archive (. j a r ) , однако Netscape поддержива­
ет также архивы uncompressed Zip (. z i p ) .

MAYSCRIPT
Netscape и Internet Explorer с помощью этого атрибута определяют, можно ли
управлять аплетом из JavaScript-программы. Дополнительную и н ф о р м а ц и ю по
этому вопросу вы найдете в главе 24.
Согласно спецификации HTML 4.0 элемент APPLET и все его атрибуты не реко­
мендованы для использования. В качестве альтернативы предлагается элемент
OBJECT. Тем не менее многие авторы предпочитают элемент APPLET как более про­
стой. Дополнительные сведения об элементах APPLET и OBJECT будут приведены в
главе 9.

Элемент: <PARAM NAME="..." VALUE="..."> (закрывающий


дескриптор отсутствует)
Атрибуты: NAME (обязательный), VALUE (обязательный)
Элемент РАКАМ предназначен для передачи значений аплету, который затем читает
их с помощью метода g e t Ра ram. Подробно использование элемента PARAM описано в
главе 9. Параметры с именами WIDTH и HEIGHT изменяют значения атрибутов WIDTH и
HEIGHT, поэтому следует избегать использования элементов <PARAM NAME= "WIDTH"
. . . > и <PARAM NAME="HEIGHT" . . . >. Элементы PARAM могут быть использованы со­
вместно с элементом OBJECT, который будет описан далее в этом разделе.

Внимание!

Старайтесь не использовать имена WIDTH и HEIGHT в составе объекта


PARAM.
104 Глава 3. Элементы текстового уровня HTML 4.0

Встроенные аудио- и видеофрагменты, а также


объекты в других форматах

Элемент: <EMBED SRC="..." ...> ... </EMBED>


Атрибуты: SRC, WIDTH, HEIGHT, a также атрибуты, специфические для дополнитель­
ных модулей
Элемент EMBED не предусмотрен в спецификации HTML 4.0, но может быть ис­
пользован для создания встроенных объектов, т и п ы которых поддерживаются до­
полнительными модулями конкретного броузера. Если броузер содержит дополни­
тельный модуль, он игнорирует текст в составе элемента. Помимо SRC, WIDTH и
HEIGHT в открывающем дескрипторе могут быть указаны атрибуты, специфические
для конкретных дополнительных модулей. Как Netscape, так и Internet Explorer вклю­
чает стандартные модули LiveVideo, предназначенные для воспроизведения видео­
клипов в ф о р м а т е AVI. Эти мод)^ли поддерживают специальный атрибут AUTOSTART,
который может принимать значение TRUE или FALSE. Если указано значение TRUE,
видеофрагмент воспроизводится автоматически при загрузке Web-страницы. Значе­
ние FALSE, принимаемое по умолчанию, указывает на то, что воспроизведение клипа
начинается по команде пользователя. Приведенное ниже выражение включает в со­
став документа видеофайл, который воспроизводится после щелчка мышью на объек­
те. Для того чтобы видеофрагмент отображался корректно, в броузере должен быть
установлен соответствующий допол1П1тельный модуль.
<EMBED S R C = " i n a r t i a n - i n v a s i o n . a v i " WIDTH=120 HEIGHT=90>
Список свободно распространяемых модулей и описания связанных с ними атри­
бутов EMBED расположен по следующему адресу:
http://home.netscape.com/plugins/
Приведенные в этом списке модули поддерживают VRML, QuickTime, потоковые
аудиоданные, ф а й л ы Adobe Acrobat, изображения PNG и другие форматы данных.

Управляющие элементы ActiveX


Элемент: <OBJECT ...> ... </OBJECT>
А т р и б у т ы : CLASSID, CODETYPE, CODEBASE, ALIGN, BORDER, WIDTH, HEIGHT, HSPACE,
VSPACE, STANDBY, ARCHIVE, DATA, TYPE, NAME, TABINDEX, DECLARE, USEMAP
Internet Explorer поддерживает в составе Web-страниц управляющие элементы
ActiveX. Как и в случае Java-аплетов, для передачи параметров используются элементы
PARAM. Поскольку управляющие элементы ActiveX, в отличие от Java-аплетов, могут
выполнять любые действия в клиентской системе (в том числе удалять файлы, запус­
кать программы и т.д.), нельзя допускать, чтобы Web-клиент мог загрузить произ­
вольный элемент ActiveX. Совместно с Internet Explorer можно использовать лишь
некоторые элементы, разработанные Microsoft и независимыми производителями;
эти элементы защищаются цифровыми подписями. Многие пользователи предпочи­
тают запрещать загрузку элементов ActiveX на свои компьютеры, поэтому ActiveX в
3.6. Включение объектов в документ 105

составе Web-страниц редко применяются даже пользователями Internet Explorer. Тем


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

CLASSID
С помощью этого атрибута определяется URL. Для зарегистрированных элемен­
тов CLASSID представляется в виде c l s i d : иденшификатор_класса.

CODETYPE
Атрибут CODETYPE определяет тип объекта. Для аплетов данный атрибут задается
в виде C O D E T Y P E = " a p p l i c a t i o n / J a v a " . Дополнительные сведения приведены в
главе 9.

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

ALIGN, B O R D E R , W I D T H , H E I G H T , HSPACE и VSPACE


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

STANDBY
Атриб)а^ STANDBY задает строку текста, отображаемую при загрузке объекта.

ARCHIVE
Атрибут ARCHIVE определяет список URI ресурсов, которые должны быть загру­
жены перед активизацией объекта. Компоненты списка разделяются пробелами.
URI задаются относительно каталога, указанного с помощью атрибута CODEBASE.
Для аплетов архивы представляются в формате JAR. Для создания JAR-файла ис­
пользуется утилита j a r .

DATA и TYPE
Атрибут DATA задает URI файла данных, обрабатываемого объектом. Атрибут
TYPE определяет МШЕ-тип данных в этом файле.

NAME
Атрибут NAME обрабатывается броузерами, поддерживающими JavaScript. С помо­
щью этого атрибута задается имя, используемое JavaScript-сценарием для обраще­
ния к объекту.

TABINDEX
Если пользователь перемещается по документу с помощью клавиатуры, атрибут
TABINDEX определяет, в каком порядке элементы должны получать фокус. Значе-
106 Глава 3. Элементы текстового уровня HTML 4.0

нием TAB INDEX является целое число в диапазоне от О до 32767. П о умолчанию все
элементы, для которых не указан атрибут TAB INDEX, получают значение 0. Эле­
менты с одинаковыми значениями данного атрибута получают фокус ввода в том
порядке, в котором они расположены в документе. Данный атрибут поддержива­
ется Internet Explorer 5.x и не поддерживается Netscape 4.x.
Спецификация HTML 4.0 определяет атрибут DECLARE, который в настоящее
время не поддерживается ни Netscape, ни Internet Explorer. Этот атрибут запрещает
начальную загрузку элемента, указанного с помощью OBJECT, но разрешает загружать
его впоследствии п)тем активизации ссылки, действий, предпринимаемых другим
объектом, либо после щелчка на кнопке.
Спецификация HTML определяет также атрибут USEMAP элемента OBJECT, с по­
мощью которого задается карта изобрг1жения на стороне клиента. Атрибут USEMAP не
поддерживается Internet Explorer 5.x, Netscape 4.7 и более ранними версиями этих
броузеров, однако Netscape 6 поддерживает USEMAP.
Большое количество управляющих элементов ActiveX, разработанных независи­
мыми производителями, можно найти на сервере CNET ActiveX Download Caller)' по
адресу h t t p : / / w w w . a c t i v e x . c o m / .

Бегущая строка
Элемент: <MARQUEE ...> ... </MARQUEE>
А т р и б у т ы : WIDTH, HEIGHT, ALIGN, BEHAVIOR, BGCOLOR, DIRECTION, HSPACE, VSPACE,
LOOP, SCROLLAMOUNT, SCROLLDELAY
Элемент MARQUEE представляет собой расширение Internet Explorer. Текст, распо­
ложенный между открывающим дескриптором <^4ARQUEE . . . > и закрывающим
</MARQUEE>, оформляется в виде бегущей строки. В составе элемента MARQUEE недо­
пустимы другие элементы разметки, но сам MARQUEE может быть задан в составе таких
элементов, как FONT. В результате автор получает возможность создавать, например,
бегущую строку, в которой отображаются символы большого размера синего цвета. Все
броузеры, кроме Internet Explorer, игнорируют дескрипторы MARQUEE и рассматривают
текст, содержащийся в составе данного элемента, как часть текущего абзаца. Элемент
MARQUEE можно использовать без атрибутов либо включать в состав открывающего де­
скриптора атрибуты, описанные ниже. Заметьте, что многие пользователи рассматри­
вают бегущую строку как досадную помеху, затрудняющ)то восприятие Web-страницы,
поэтому, используя элемент MARQUEE, соблюдайте осторожность.

WIDTH и HEIGHT
Данные атрибуты задают высоту и ширину области для бегущей строки. З н а ч е н и я
атрибутов указываются в пикселях либо в процентах от размеров окна Internet
Explorer. П о умолчанию принимается ширина области, равная ширине окна, а вы­
сота выбирается в зависимости от используемого шрифта.
3.6. Включение объектов в документ 107

ALIGN
Атрибут ALIGN определяет выравнивание бегущей строки относительно окру­
жающего текста. Допустимыми значениями являются LEFT, RIGHT, CENTER, TOP,
BOTTOM и MIDDLE; они используются так же, как и соответствующие значения эле­
мента IMG, описанные ранее в этой главе.

BEHAVIOR
Атрибут BEHAVIOR описывает порядок перемещения текста. Значение SCROLL,
принимаемое по умолчанию, указывает, что текст должен перемещаться в одном
направлении до тех пор, пока не достигнет края области, после чего движение
текста начинается сначала. Если задано значение SLIDE, текст перемещается до
тех пор, пока не достигнет края области, после чего движение прекращается. Зна­
чение BOUNCE указывает на то, что текст должен перемещаться вперед и назад в
пределах области.

BGCOLOR
Атрибут BGCOLOR задает цвет ф о н а области бегущей строки.

DIRECTION
Атрибут DIRECTION задает направление, в котором должен перемещаться текст
(если атрибут BEHAVIOR имеет значение BOUNCE, то атрибут DIRECTION указыва­
ет, в каком направлении текст начнет движение). Допустимыми значениями явля­
ются LEFT (перемещение слева направо) и RIGHT (перемещение справа налево).
По умолчанию принимается значение LEFT.

HSPACE и VSPACE
Атрибуты HSPACE и VSPACE задают размеры пустого пространства вокруг области
бегущей строки. Значения данных атрибутов указываются в пикселях.

LOOP
Атрибут LOOP указывает, сколько раз должно повторяться перемещение текста.
Значение, равное -1, или INFINITE (принимаемое по умолчанию) указывает на то,
что текст должен перемещаться все время, пока дoк)^vIeнт отображается в окне
броузера.

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

SCROLLDELAY
Атрибут SCROLLDELAY задает время в миллисекундах между последовательными
показами текста.
108 Глава 3. Элементы текстового уровня HTML 4.0

3.7. Управление переводом строк


Чаще всего броузер расставляет переводы строк так, чтобы при выводе текста ис­
пользовалось все доступное пространство. В главе 2 был рассмотрен элемент PRE, ко­
т о р ы й задает отображение текста символами фиксированной ш и р и н ы и сохраняет
переводы строк, указанные в исходном тексте. В языке HTML существует также эле­
мент BR, который позволяет явно задавать переводы строк. Кроме того, запретить
перевод строки в конкретной позиции текста можно, разделяя слова неразрывным
пробелом либо применяя нестандартный, но часто используемый элемент NOBR.

Элемент: <BR ...> (закрывающий дескриптор отсутствует)


Атрибут: CLEAR
Элемент BR реализует перевод строки, не завершая текущий абзац. Поскольку в
исходном HTML-тексте (зз. исключением некоторых элементов) переводы строк иг­
норируются, элемент BR необходим для того, чтобы разместить текст на экране тре­
буемым образом. Атрибут CLEAR, допустимыми значениями которого являются NONE
(принимается по умолчанию), LEFT, RIGHT и ALL, позволяет запретить обтекание
изображения текстом. П р и работе со многими броузерами, включая Netscape и
Internet Explorer, несколько последовательно расположенных дескрипторов <BR>
приводят к отображению дополнительных пустых строк (несколько последовательно
расположенных дескрипторов <Р> не позволяют добиться подобного результата).

Элемент: <NOBR>... </NOBR>


Атрибуты: отсутствуют
Элемент NOBR не является частью спецификации HTML 4.0, но по.адерживается
Netscape и Internet Explorer. NOBR подавляет перенос текста, содержащегося в его со­
ставе, на новую строку, за исключением позиций, отмеченных дескриптором <WBR>.
Аналогичного эффекта можно добиться, разделяя неразрывным пробелом ( & n b s p ; )
слова, которые желательно отобразить в одной строке.

Элемент: <WBR> (закрывающий дескриптор отсутствует)


Атрибуты: отсутствуют
Элемент WBR может встречаться только в составе элемента NOBR. WBR помечает по­
зицию, в которой при необходимости можно осуществить разрыв строки. WBR не
предусмотрен в спецификации HTML 4.0, но, как правило, поддерживается теми бро­
узерами, которые поддерживают элемент NOBR.

3.8. Резюме
Элементы текстового уровня дают возможность определять стили отображения,
задавать переводы строк и создавать гипертекстовые ссылки в составе документа.
Кроме того, с помощью элементов текстового уровня можно помещать на Web-
страницу изображения, оформлять их как гипертекстовые ссылки и даже связывать с
различными областями одного изображения разные ссылки. Многие броузеры позво-
3.7. Управление переводом строк 109

ляют также включать в состав документа Java-аплеты, аудио- и видеофрагменты, фай­


лы Adobe Acrobat, компоненты VRML и управляющие элементы ActiveX.
В последующих двух главах описаны дополнительные возможности, которые
можно использовать при создании документов. В главе 4 рассматриваются ф р е й м ы , с
помощью которых можно разделить Web-страницу на ряд прямоугольных областей и
отобразить в каждой из них отдельный HTML-документ. Глава 5 посвящена каскад­
ным листам стилей, предоставляющим мощные средства для управления шрифтами,
размещением текста и стилями в элементах блокового и текстового уровней.
ФРЕЙМЫ

в этой главе...

Структура документов с фреймами.


Разделение окна броузера на области.
Определение содержимого фреймов.
Связывание гипертекстовых ссылок с фреймами.
Использование предопределенных имен фреймов.
Решение проблем, связанных с использованием фреймов.
Использование внутренних (плавающих) фреймов.
J~y\:EJ^zJ

реймы позволяют разделить окно броузера на несколько областей прямо­

Ф угольной ф о р м ы и отобразить в каждой из них отдельный HTML-документ.


Механизм ф р е й м о в был первоначально разработан Netscape Corporation для
применения в броузере Navigator 2.0, а затем адаптирован Microsoft Corporation для
Internet Explorer 3.0. Несмотря на то что ф р е й м ы не были предусмотрены специфи­
кацией HTML 3.2, их популярность среди разработчиков Web-документов привела к
тому, что они стали частью HTML 4.0. Хотя ф р е й м ы предоставляют возможности,
которые не могут обеспечить другие средства HTML, вокруг них до сих пор вед)а'ся
споры, поскольку наряду с бесспорными преимуществами они имеют некоторые не­
достатки. Основные преихмущества использования ф р е й м о в перечислены ниже.

• Автор может гарантировать, что определенные компоненты и н т е р ф е й с а


(например, содержание документа) всегда будут присутствовать на экране.
• Фреймы дают возможность избежать п о в т о р е н и я одних и тех же управляющих
разделов на различных Web-страницах. Вместо этого один документ может
отображаться как ф р е й м в составе разных Web-страниц.
• При использовании фреймов упрощается перемещение по большим Web-узлам,
• С помощью ф р е й м о в удобно объединять текстовые HTML-документы с Java-
аплетами.
• Пользоваться картами изображений гораздо удобнее в случае, если карта ото­
бражается в одном фрейме, а в другом ф р е й м е выводятся документы, получен­
ные вследствие активизации ее областей.
Этими преимуществами обусловлена популярность ф р е й м о в среди авторов Web-
страниц. Однако их применение имеет н е к о т о р ы е недостатки.
112 Глава 4. Фреймы

• Если Web-страница включает ф р е й м ы , пользователь испытывает трудности


при работе с кнопками BACK и FORWARD.
• Плохо продуманная структура ф р е й м о в затрудняет навигацию пользователя по
Web-страницам.
• Поскольку в строке ввода адреса представляется URL документа верхнего
уровня, пользователю трудно определить URL документа, отображающегося в
конкретной области.
• Поскольку закладки содержат URL конкретных документов, пользователь не
может сохранить текущую конфигурацию содержимого ф р е й м о в (т.е. внешний
вид Web-страницы после выполнения нескольких действий с управляющими
элементами фреймов).
• П р и активизации пункта меню Print (или соответствующей кнопки) броузер
выводит на печать содержимое активного фрейма. В большинстве случаев ак­
тивным оказывается ф р е й м , в котором выводится содержание.
П о этой причине некоторые пользователи не признают ф р е й м о в и предпочитают
те Web-страницы, в которых данный механизм не применяется. Несмотря на то что
материал, изложенный в данной главе, позволит вам избежать проявления некото­
рых недостатков фреймов, лучше всего ограничить их использование теми ситуация­
ми, когда выгода от применения ф р е й м о в настолько очевидна, что можно смириться
с потерей некоторой части пользователей.
Спецификация HTML 4.0 определяет атрибут TITLE для всех элементов данной
главы. Однако поскольку этот атрибут был описан в главе 1, то здесь он рассматри­
ваться не будет. Кроме того, спецификация каскадных листов стилей также опреде­
ляет для всех элементов, рассматриваемых в данной главе, атрибуты CLASS, ID и
STYLE. Обсуждение этих атрибутов мы отложим до главы 5,

4 . 1 . Шаблон документа о фреймами


В обычном HTML-документе за разделом HEAD непосредственно следует раздел
BODY, в котором содержится и н ф о р м а ц и я , предназначенная для отображения. В до­
кументе с фреймами элемент BODY либо отсутствует, либо расположен в разделе
NOFRAMES, предназначенном для броузеров, которые не поддерживают фреймы.
Вместо элемента BODY используется элемент FRAMESET, с помощью которого задается
разбиение окна броузера на столбцы или строки. Т и п и ч н ы й шаблон документа с
фреймами представлен в листинге 4.1. В состав FRAMESET входят другие элементы
FRAMESET, реализующие дальнейшее разбиение окна, либо элементы FRAME, опреде­
ляющие URL документов, которые должны отображаться внутри ф р е й м о в . Документ
с фреймами должен включать соответствующую декларацию DOCTYPE.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 Frameset//EN">
Это необходимо для проверки корректности д о к \ ^ е н т а .
4 . 2 . Р а з б и е н и е окна броузера на ф р е й м ы 113

Листинг 4 . 1 . Шаблон документа с фреймами

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 Frameset//EN">


<HTML>
<HEAD>
<TITLE>Document T i t l e < / T I T L E >
</HEAD>
<FRAMESET . . . >
<!— FRAME and N e s t e d FRAMESET E n t r i e s —>
<NOFRAMES>
<BODY>
< ! - - S t u f f f o r n o n - f r a m e s b r o w s e r s —>
</BODY>
</NOFRAMES>
</FRAMESET>
</HTML>

4.2. Разбиение окна броузера на фреймы


Элемент FRAMESET определяет число ф р е й м о в и их размеры.

Элемент: <FRAMESET> ... </FRAMESET>


Атрибуты: ROWS, COLS, FRAMEBORDER (нестандартный), BORDER (нестандартный),
FRAME SPACING (нестандартный), BORDERCOLOR (нестандартный), ONFOCUS (нестандарт­
ный), ONBLUR (нестандартный), ONLOAD, ONUNLOAD
Элемент FRAMESET делит окно броузера или ф р е й м на строки или столбцы. По­
скольку элементы FRAMESET допускают вложенность, автор может реализовать слож­
ную структ}ру фреймов. Основными атрибутами элемента FRAMESET являются ROWS и
COLS. Атриб)ты FRAMEBORDER, BORDER, BORDERCOLOR, ONFOCUS и ONBLUR- нестан­
дартные, однако они поддерживаются Netscape 4.x, Internet Explorer 4.x и более
поздними версиями этих броу.зеров. FRAME SPACING также является нестандартным
атриб)пгом; он поддерживается Internet Explorer. Атрибуты ONLOAD и ONUNLOAD зада­
ют JavaScript-код, выполняемый соответственно при загрузке и прекращении отобра­
жения набора фреймов.

ROWS
Атрибут ROWS делит окно броузера (или текущий фрейм — в случае вложенных
элементов FRAMESET) на горизонтальные строки. Этот атрибут используется сле­
дующим образом:
<FRAMESET ROWS="Rowl-Size, ... , RowN-Size">

</FRAMESET>
Приведенный выше фрагмент кода делит окно броузера на N строк. Размер строки
задается целым числом (в этом случае значение интерпретируется как количество
пикселей), либо целым числом, за которым след}^ет символ "%" (в этом случае раз­
мер строки вычисляется в процентах от размера допустимой области), либо сим­
волом "*". Знак "*" интерпретируется как "оставшееся пространство"; при необхо-
114 Глава 4 . Ф р е й м ы

димости перед ним может быть указан целочисленный множитель. П р и м е р деле­


ния на строки приведен ниже.
<FRAMESET ROWS="50,10%,*f2*">

</FRAMESET>
Данный фрагмент кода задает в окне четыре строки. Высота первой строки равна
50 пикселям. Вторая строка занимает 10 процентов от высоты допустимой облас­
ти. Оставшееся пространство распределяется между двумя строками, причем тре­
тья строка занимает одну треть этого пространства, а четвертая — две трети (так
как перед знаком "*" был указан множитель 2). Д а н н о е деление окна броузера по­
казано на рис. 4.1.

1Щ Ffаяю«е1 ROV/S АК/^Ь^Ш^ЫтляШ inimn^ Шфтт ' mRGi


""^"""|gi||

1 Frame Cell 4
1 ТП i^-^ 11 Щ
Frame Cell Я

Frame Cell
1 This is a sample HTML document to be used in frame cells.

Щ^Щ^

Рис. 4.1. Документ с фреймами, в котором размеры строк


заданы как " 5 0 , 10%, * , 2 * "

Как видно из рисунка, малые размеры ф р е й м а приводят к том)% что документ, ото­
бражаемый в нем, практически невозможно читать. Планируя деление окна,
имейте в виду, что размеры окна и ш р и ф т на компьютере пользователя могут от­
личаться от выбранных вами при просмотре документа. Заметьте, что значение
атрибута ROWS должно определять как минимум две строки, в противном случае в
броузере Netscape Web-страница будет отображаться некорректно. Например,
приведенный ниже фрагмент кода будет выведен как пустое окно (при использо­
вании Netscape).
<FRAMESET R O W S - " * " >
<FRAME SRC="CoreWebProgramming.html">
</FRAMESET>

Внимание!

С помощью элемента FRAMESET следует задавать на меньше двух


строк или столбцов.
4 . 2 . Разбиение окна броузера на фреймы 115

COLS
Атрибут COLS делит окно броузера (или текущий фрейм— в случае вложенных
элементов FRAMESET) на вертикальные столбцы. Как и ROWS, атрибут COLS может
присутствовать либо в документе верхнего уровня, либо в составе фрейма, опре­
деленного посредством FRAMESET. Д а н н ы й атрибут должен определять как мини­
мум два столбца. Помещать в состав FRAMESET один элемент FRAME нет необходи­
мости, кроме того, это может привести к некорректному отображению Web-
страницы в броузере Netscape. В составе открывающего дескриптора FRAMESET
должен быть указан либо один атрибут ROWS, либо один атрибут COLS.

FIIAMEBORDER
Атрибут FRAMEBORDER определяет, должны ли отображаться разделительные ли­
нии между фреймами. П о умолчанию разделительные л и н и и выводятся на экран.
Значение FRAMEBORDER=0 о б ы ч н о применяется в сочетании со значениями
BORDER=0 и FRAMESPACING=0, результатом являются ф р е й м ы без внутренних и
внешних разделителей. З н а ч е н и е FRAMEBORDER элемента FRAMESET заменяется
значением FRAMEBORDER элемента FRAME либо значением этого атрибута в составе
вложенного FRAMESET. Netscape 3.0, Internet Explorer 4.0, a также их более новые
версии поддерживают значение атрибута FRAMEBORDER YES, или 1, указывающее
на то, что разделители должны отображаться, и значение N0, или О, запрещающее
вывод разделителей. В качестве примера в листингах 4.2 и 4.3 приведены исход­
ные коды двух документов с фреймами. Эти документы почти идентичны и отли­
чаются только использованием атрибута FRAMEBORDER. Результаты показаны на
рис. 4.2 и 4.3.

Листинг4.2. Frame-Borders.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 F r a i n e s e t / / E N " >


<HTML>
<HEAD>
<TITLE>Frames w i t h B o r d e r s < / T I T L E >
</HEAD>
<FRAMESET ROWS="40%,60%">
<FRAME S R C = " F r a m e - C e l l . h t m l " >
<FRAMESET COLS="*,*">
<FRAME S R C = " F r a m e - C e l l . h t m l " >
<FRAME S R C = " F r a m e - C e l l . h t m l " >
</FRAMESET>
<NOFRAMES>
<BODY>
Your b r o w s e r d o e s n o t s u p p o r t f r a m e s . P l e a s e s e e
<A H R E F = " F r a m e - C e l l . h t m l " > n o n f r a m e s v e r s i o n < / A > .
</BODY>
</NOFRAMES>
</FRAMESET>
</HTML>
116 Глава 4. Фреймы

:LJjмл^li'^lJi^J!•PL^'Ш'JШl^Jli!lИl>?fЯlf^^ '
£de £d« View F§vofkes lools й«Ь ^ > ^ ., ^ КШ[

Frame Cell
1 Tbs IS a sample HTML document to be used ш frame cells. 1

Frame Cell Frame Cell


1 Tbs IS a sample HTML document to be This is a sample HTML document to be 1
1 used in frame cells. used in frame cells. |

0] Done i ^ My Cofflpii»

Рис. 4.2. По умолчанию между фреймами выводятся разде­


лители, которые отображаются с имитацией трехмерного
представления

Листинг4.3. Frame-Borderless.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">
<HTML>
<HEAD>
<TITLE>Borderless Frames</TITLE>
</HEAD>

<FRAMESET ROWS="40%, 60%" FIU^MEBORDER=0


BORDER=0 FRAMESРАСING=0>
<FRAME SRC="Frame-Cell.html">

<FRAMESET COLS="*,*">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
</FRAMESET>
<N0FRAMES>
<BODY>
Your browser does not support frames. Please see
<A HREF="Frame-Cell.html">nonframes version</A>.
</BODY>
</NOFRAMES>
</FRAMESET>

</HTML>
4 . 2 . Разбиение окна броузера на фреймы 117

I^Borderlet* Ftamex - Mictos<rfi fntetftet ExfiltMrei шшшШ


; £йе £dft View Favorites Tods Ц^Ь
Bi^
i^ • - J J ^ ^ : i i J -ii' ^_^'

Frame Cell
1 This IS a sample HTML document to be iised m frame cells.

Frame Cell Frame Cell


1 This is a sample HTML document to be This IS a sample HTML document to be |
1 used in frame cells. used in frame cells.

^;^Шпё''"":;- ' f" • •' Щщ^от^мы':

Рис. 4.3. Вывод разделителей между фреймами запрещает­


ся посредством атрибута FRAMEORDER

BORDER и FRAMESPACING (Internet Explorer)


Данные атрибуты, специфические для Internet Explorer, задают толщину раздели­
тельных линий между фреймами. О н и применяются только к внешнему элементу
FRAMESET. Значение по умолчанию равно 5.

BORDERCOLOR
BORDERCOLOR— нестандартный атрибут, поддерживаемый как Netscape, так и
Internet Explorer. Он задает цвет разделителя между фреймами. В качестве значе­
ния задается либо шестнадцатеричное число, определяющее цвет, либо имя цвета.
По )ТУ1олчанию используются цвет ф о н а с уменьшенной яркостью и имитация
трехмерных э ф ф е к т о в посредством затенения. Значение этого атрибута замеща­
ется значением BORDERCOLOR элемента FRAME либо вложенного элемента
FRAMESET.

ONFOCUS и O N B L U R
Эти атрибуты задают код JavaScript, выполняемый в тот момент, когда ф р е й м со­
ответственно получает или теряет фокус. Несмотря на то что имена атрибутов не­
чувствительны к регистру символов, данные атрибуты связаны с выполнением
JavaScript-сценариев, поэтом)^ их принято обозначать o n F o c u s и o n B l u r .

ONLOAD и O N U N L O A D
Данные атрибуты определяют JavaScript-код, который выполняется при загрузке
набора ф р е й м о в и тогда, когда броузер прекращает их отображение. Эти атрибуты
также принято обозначать o n L o a d и o n U n l o a d .
118 Глава 4 . Ф р е й м ы

4.3. Определение содержимого фреймов


Элемент: <FRAME SRC="..." ...> (закрывающий дескриптор отсутствует)
Атрибуты: SRC, NAME, FRAMEBORDER, BORDERCOLOR (нестандартный), MARGINWIDTH,
MARGINHEIGHT, SCROLLING, NORESIZE, LONGDESC
Элемент FRAME определяет HTML-документ, который должен отображаться в
конкретном фрейме. Элементы FRAME могут присутствовать лишь в составе контей­
неров FRAMESET. BORDERCOLOR— нестандартный атрибут, поддерживаемый как
Netscape, так и Internet Explorer.

SRC
Атрибут SRC задает URL документа, который должен быть отобрг1жен в текущем
фрейме. Этот атрибут не является обязательным, поскольку спецификация HTML
4.0 допускает пустые ф р е й м ы . Однако во избежание непредсказуемых результатов
при работе с Netscape атрибут SRC желательно задавать.
Внимание!

Элемент FRAME, ДЛЯ которого задан атрибут NAME, НО не указан SRC,


может привести к возникновению непредсказуемых результатов
при работе с Netscape.

NAME
Атрибут NAME присваивает имя текущему фрейму. Атрибут TARGET элементов А,
AREA, BASE и FORM может быть использован для отобра>1се1П1Я во ф р е й м е нового
документа. К тому же результат)^ приведет вызов Java-метода showDocument, для
которого вторым параметром задано имя фрейма. Имя должно начинаться с бук­
вы, однако существуют четыре заранее определенных имени, начинающиеся с
символа подчеркивания.

FRAMEBORDER
Атрибут FRAMEBORDER определяет, должны ли отображаться разделители с ими­
тацией трехмерного представления. З н а ч е н и е FRAMEBORDER элемента FRAME пе­
реопределяет значение одноименного атрибута, который принадлежит включаю­
щему элементу FRAMESET. Считается, что разделитель не должен отображаться
только в том случае, если в двух смежных фреймах его вывод запрещен соответст­
вующими значениями FRAMEBORDER. Netscape 3.0, Internet Explorer 4.0 и более но­
вые версии этих броузеров поддерживают значение атрибута FRAMEBORDER YES,
или 1, указывающее на то, что разделители должны отображаться, и значение N0,
или О, запрещающее вывод разделителей!.

BORDERCOLOR
Атрибут BORDERCOLOR задает цвет разделителя между фреймами. В качестве зна­
чения задается либо шестнадцатеричное число, определяющее цвет в ф о р м а т е
RGB, либо имя цвета (см. табл. 1.1 в разделе 1.6). В случае конфликта цвета прини­
мается цвет вложенного элемента.
4.3. Определение содержимого фреймов 119

MARGINWIDTH
Атрибут MARGINWIDTH определяет размеры левой и правой границ.

MARGINHEIGHT
Атрибут MARGINHEIGHT определяет размеры верхней и нижней границ.

SCROLLING
Атрибут SCROLLING определяет, должна ли в составе ф р е й м а отображаться полоса
прокрутки. В Netscape значение YES указывает на то, что полоса прокрутки всегда
должна присутствовать в составе фрейма. Если задано значение AUTO (принимает­
ся по умолчанию), то полоса прокрутки отображается только в том случае, если
документ не помещается в отведенном для него пространстве. Для Internet Ex­
plorer YES (значение по умолчанию) означает то же, что и AUTO. Значение N0 за­
прещает вывод полосы прокрутки как в Netscape, так и в Internet Explorer.

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

LONGDESC
Атрибут LONGDESC задает URI документа, в котором приводится детальное описа­
ние фрейма. О б ы ч н о LONGDESC применяется для невизуальных броузеров.

Элемент: <NOFRAMES> ... < / N O F R A M E S >


Атрибуты: отсутствуют
Броузер, поддерживающий ф р е й м ы , игнорирует текст, который содержится в со­
ставе контейнера NOFRAMES. П р о ч и е броузеры не обрабатывают дескрипторы
<NOFRAMES> и </NOFRAMES>, однако текст и элементы разметки, находящиеся между
этими дескрипторами, интерпретируются как содержимое обычного документа. В ре­
зультате автор получает возможность реализовать версию Web-страницы без фрей­
мов либо предоставить пользователю ссылки на несколько основных документов.
Приведенный ниже п р и м е р не дает пользователю никакой полезной информации о
документе, но демонстрирует возможности элемента NOFRAMES.
<NOFRAMES>
Your b r o w s e r d o e s n ' t s u p p o r t frames.
Get a < B > r e a l < / B > b r o w s e r .
</NOFRAMES>
Спецификация HTML 4.0 позволяет использовать в составе дескриптора NOFRAMES
атрибуты, предназначенные для управления событиями (ONCLICK, ONDBLCLICK,
0NKEYDOWN, ONKEYPRESS, ONKEYUP, ONMOUSEDOWN, ONMOUSEMOVE, ONMOUSEOUT,
ONMOUSEOVER, ONMOUSEUP). Подробная информация об обработке событий JavaScript-
программами содержится в главе 24. Спецификация HTML 4.0 также определяет для
элемента NOFRAMES атрибуты DIR и LANG (они были описаны в разделе L6).
120 Глава 4. Фреймы

Примеры
Код, приведенный в листинге 4.4, создает в окне броузера две строки; первая
строка делится на три столбца, а вторая — на два. Результат показан на рис. 4.4.

Л и с т и н г 4 . 4 . Frame-Examplel.htinl

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">


<HTML>
<HEAD>
<TITLE>Frame Example 1</TITLE>
</HEAD>
<FRAMESET ROWS="55%,45%">
<FRAMESET COLS="*,^,*">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
</FRAMESET>
<FRAMESET COLS="*,*">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
</FRAMESET>
<NOFRAMES>
<BODY>
Your browser does not support frames. Please see
<A HREF="Frame-Cell.html">nonframes version</A>.
</BODY>
</NOFRAMES>
</FRAMESET>
</HTML>

\Щ Flame Exairade 1 • Netscape


Re £<4( View go jQommunicdJof He^

'i 4 i^' Д r?l ^-^ :й -i^ ^ 3 a


Frame Cell Frame Cell Frame Cell
This IS a sample HTML This IS a sample HTML This IS a sample HTML
document to be used in frame document to be used in document to be used in frame
ceUs. frame cells cells

Frame Cell Frame Cell


This IS a sample HTML document to be used ш This IS a sample HTML document to be used in
frame cells. frame cells.

.:^-:^...m..
Рис. 4.4. Окно броузера разделено на две строки; в первой из них
созданы три столбца, а во второй — два
4.3. Определение содержимого фреймов 121

Код, представленный в листинге 4.5, делит окно на два столбца. В первом столбце
создаются три строки, а во втором — две. Результат показан на рис. 4.5.

Листинг 4.5. Frame-Example2 .html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">


<HTML>
<HEAD>
<TITLE>Frame Example 2</TITLE>
</HEAD>
<FRAMESET COLS="55%,45%">
<FRAMESET ROWS="*,*,*">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
</FRAMESET>
<FRAMESET ROWS="*,*">
<FRAME SRC="Frame-Cell.html">
<FRAME SRC="Frame-Cell.html">
</FRAMESET>
<NOFRAMES>
<BODY>
Your browser does not support frames. Please see
<A HREF="Frame-Cell.html">nonframes version</A>.
</BODY>
</NOFRAMES>
</FRAMESET>
</HTML>

^ Fiaee EiMMiple г * Netsoane


fie £сЙ View fio ^omrriurticaloi |ie^

^.~ ^ ^ a Ш Ш
Frame Cell Frame Cell
This IS a sample HTML document to be used in This IS a sample HTML document to be
frame ceDs. used in frame cells.

Frame Cell
This is a sample HTML document.to be used in
frame cells. Frame Cell
This is a sample HTML document to be
Frame Cell used in frame cells.

This is a sample HTML document to be used in


frame cells.

i j ^ ri»»^J>« : DoctmwrA: Don* jys- „ ^ ^ ^ , L 3 ..••^:.

Рис. 4.5. Окно броузера разделено на два столбца. В первом столб­


це созданы три строки, а во втором — две
122 Глава 4. Фреймы

4.4. Определение фрейма для отображения


документа
Автор Web-страницы может создать ее так, чтобы при активизации ссылки доку­
мент, на который она указывает, отображался в конкретном, заранее заданном фрей­
ме. Чтобы сделать это, надо присвоить требуемому фрейму имя, а в состав гипертек­
стовой ссылки включить атрибут TARGET, указав в качестве значения этого атрибута
имя фрейма. Заметьте, что имена, определяемые пользователями, не должны начи­
наться со знака подчеркивания. П р и отсутствии атрибута TARGET документ, соответ­
ствующий активизированной ссылке, отображается в том ф р е й м е , в котором нахо­
дится эта ссылка. Если в атрибуте TARGET вы укажете имя несуществующего фрейма,
документ будет открыт в новом окне броузера и этому окну будет присвоено имя, за­
данное в качестве значения TARGET. Атрибут TARGET может присутствовать в элемен­
тах А, AREA, BASE и FORM. Java-аплеты могут обращаться к именованным фреймам, за­
давая имя как второй параметр метода g e t A p p l e t C o n t e x t () . s h o w D o c u m e n t .

М е т о д и к а профессионалов

Не присваивайте фреймам имена, начинающиеся со знака подчер­


кивания.

Часто ф р е й м ы используются для создания небольшой панели инструментов или


таблицы, представляющей содержание документа. Такая панель или таблица распола­
гается либо в верхней, либо в левой части окна броузера. Остальное пространство в
окне предназначено для отображения главного документа. После щелчка на пункте
таблицы с содержанием в основной области выводится документ, на который указы­
вает ссылка. Рассмотрим в качестве примера Web-страницу, показанную на рис. 4.6.

ШЕШШ2ШШШШ1 щшт
£1е £ Л Yiew fio Cownwiicala ЦеЬ

- ^^ ^ Ш fi^ ^^ ^
TntTOfhirtio» Tnvpsring

Introduction
А new breakthrough m cold fusion technology!

A ripe opportunity for the Kicky investor!

Accepted by the scientific community! Documented in The Journal of Irreproducible Results

'OocumentDone :, v;^ •'м, 'Л--^. Г?1 л*^

Рис. 4.6. Web-страница, содержащая два фрейма: таблицу с


содержанием и основной фрейм, в котором отображается раздел
документа
4.4. Определение фрейма для отображения документа 123

Web-страница создается так, чтобы под таблицу с содержанием отводилось про­


странство фиксированного размера. Остальная часть окна предназначается для вы­
вода док)ТУ1ента (имя этого ф р е й м а Main). В листинге 4.6 представлен HTML-код до­
кумента верхнего уровня.

Листинг4.6. Cold--Fusion.html

<!DOCTYPE xHTML PUBLIC "-//W3C//DTD HTML 4 . 0 F r a m e s e t / / E N " >


<HTML>
<HEAD>
< T I T L E > I n v e s t i n g i n Cold F u s i o n < / T I T L E >
</HEAD>
<FRAMESET ROWS="75,*">
<FRAME SRC="TOC.html" NAME="TOC">
<FRAME S R C = " I n t r o d u c t i o n . h t m l " NAME="Main">
<NOFRAMES>
<BODY>
T h i s p a g e r e q u i r e s F r a m e s . For a n o n - F r a m e s v e r s i o n ,
<A H R E F = " I n t r o d u c t i o n . h t m l " > t h e i n t r o d u c t i o n < / A > .
</BODY>
</NOFRAMES>
</FRAMESET>
</HTML>

Каждая из ссылок в д о к ) ^ е н т е ТОС. h t m l содержит атрибут TARGET, для которого


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

Листинг 4 . 7 . ТОС.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 T r a n s i t i o n a l / / E N " >


<HTML>
<HEAD>
<TITLE>Table of C o n t e n t s < / T I T L E >
</HEAD>
<BODY>
<TABLE WIDTH="100%">
<TR><TH><A H R E F = " I n t r o d u c t i o n . h t m l " TARGET="Main">
Introduction</A></TH>
<TH><A H R E F = " P o t e n t i a l . h t m l " TARGET="Main">
Potent ial</AX/TH>
<TH><A H R E F = " I n v e s t i n g . h t m l " TARGET="Main">
Investing</A></TH>
<TH><A HREF="References.html" TARGET="Main">
References</A></TH></TR>
</TABLE>
</BODY>
</HTML>

П р и выборе ссылки в таблице содержимое верхнего фрейма остается неизмен­


ным. Того же э ф ф е к т а можно достичь, вовсе отказавшись от атрибутов TARGET в со-
124 Глава 4 . Ф р е й м ы

ставе гипертекстовых ссылок и включив в раздел HEAD выражение <BASE


TARGET="Main">. На рис. 4.7 показано состояние окна после выбора ссылки
I n v e s t i n g . Документ, содержащий атрибут TARGET, не считается строго соответст­
вующим HTML 4.0, поэтому в начало этого документа должна быть включена проме­
жуточная декларация DOCTYPE. Очевидно, что четыре документа, на которые указы­
вают ссылки в ТОС. h t m l , должны соответствовать HTML 4.0 и не должны содержать
атрибуты TARGET, поскольку при активизации ссылки без этого атрибута документ
выводится в текущем фрейме.
М е т о д и к а профессионалов _

Если все ссылки на Web-странице должны выводить документы в


одном и том же фрейме, то указать целевой фрейм можно, включив
в раздел HEAD выражение <BASE TARGET=". . . ">.

Зарезервированные имена фреймов


в качестве значения атрибута TARGET можно задавать одно из четырех встроенных
имен: b l a n k , t o p , p a r e n t и s e l f . Поскольку имена фреймов, определенные
пользователем, не могут начинаться со знака подчеркивания, указанные выше имена
интерпретир)тотся одинаково для всех фреймов док)ТУ1ента. В табл. 4.1 перечислены
действия гипертекстовых ссылок, связанные с зарезервированными именами.

Таблица 4 . 1 . Зарезервированные имена ф р е й м о в

Нмя Дейапвие
_Ь1апк Если в гипертекстовой ссылке в качестве целевого имени указывается
имя b l a n k , документ, на который указывается ссылка, отображается
в новом неименованном окне
_top Использование t o p в качестве целевого имени приводит к тому, что
документ, на к о т о р ы й указывает ссылка, занимает все окно броузера.
Несмотря на т о что такой документ не включается в конкретный
фрейм, считается, что Web-страница содержит ф р е й м ы
_parent Если в качестве целевого имени указано _ p a r e n t , документ распола­
гается в области, занимаемой элементом FRAMESET, родительским по
отношению к данному документу. Если Web-страница не содержит
вложенных ф р е й м о в , то использование имени _ p a r e n t приводит к
тому же результат)^ что и использование имени _ t o p
_self Если в гипертекстовой ссылке в качестве целевого имени указывается
имя s e l f , документ отображается в текущем ф р е й м е . Присутствие
_ s e l f необходимо только в том случае, если это имя переопределяет
целевой ф р е й м , заданные! с помощью элемента BASE. Если выраже­
ние <BASE TARGET="имя_фpeймa"> не задано, т о по умолчанию до­
кумент, на к о т о р ы й указывает ссылка, выводится во ф р е й м е , содер­
жащем эту ссылку
4.5. Разрешение типичных проблем... 125

4.5. Разрешение типичных проблем,


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

Создание закладок для фреймов


Предположим, что вы просматриваете Web-страницу, содержащую ф р е й м ы . Назо­
вем ее U r l l . Некоторое время вы работали с этой страницей и, переходя по ссылкам,
нашли интересующий вас документ. Назовем его U r l 2 . Предположим также, что вы
создали закладку на U r l 2 . Если через некоторое время вы выберете созданную за­
кладку, броузер вместо требуемого документа ( U r l 2 ) отобразит исходную страницу с
фреймами ( U r l l ) . Проблема заключается в том, что при создании закладки с помо­
щью меню Boormarks или Favohties (в зависимости от броузера) сохраняется не URL
документа, отображаемого в выбранном вами фрейме, а URL документа верхнего
уровня. Иногда такой результат выбора ссылки оказывается полной неожиданностью
для пользователя. Если разделители не отображаются, пользователь может даже не
знать, что он имеет дело с фреймами. Об этом можно догадаться по URL, показанно­
му в строке ввода адресов, но при работе на него редко обращают внимание.
Броузеры Netscape и Internet Explorer, работающие в системе Windows, после
щелчка правой кнопкой мыши отображают контекстное меню. Один из пунктов этого
меню позволяет создать закладку на документ, отображаемый в конкретном ф р е й м е .
Однако впоследствии при выборе этой закладки в окне броузера отобрг1жается не вся
структура фреймов, а один документ.
Пользователи должны знать, как создавать закладки на документы, отображаемые
в отдельных фреймах. В свою очередь, разработчики Web-страниц с фреймами долж­
ны иметь в виду, что при создании закладок у пользователей часто возникают про­
блемы. Во-первых, необходимо хорошо продумать взаимосвязь между документами,
чтобы пользователь, который создал закладку на документ верхнего уровня, мог бы­
стро найти требуемые данные. Во-вторых, для страниц, на которые ожидается боль­
шое количество ссылок, надо включить в тело документа URL в текстовом виде. В-
третьих, желательно создать версию Web-страницы без фреймов, содержащую ссыл­
ки на все требуемые документы. Если содержимое документов часто меняется, версию
без ф р е й м о в поддерживать трудно. В этом случае можно создавать ссылки, с помо­
щью которых документы отображались бы, полностью занимая окно броузера. При­
мер такой ссылки приведен ниже.
<А HREF="http://some-site.com/some-page.html TARGET="_top">
http://some-site.com/some-page.html</A>.
126 Глава 4 . Ф р е й м ы

Вывод фреймов на печать


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

Совет

Перед тем как выводить на печать часть документа с фреймами, не­


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

В Internet Explorer 5.x вывод фрейма на печать происходит намного проще. После
выбора пункта Print меню File броузер предложит вам следующие действия на выбор:
• печать всех ф р е й м о в так, как они отображаются на экране;
• печать только выбранного фрейма;
• печать каждого ф р е й м а по отдельности.
Выбрав нужную опцию, вы можете вывести документ на печать в требуемом виде.
Для выбранных ф р е й м о в Internet Explorer 5.x поддерживает дополнительные опции
печати. Вы можете задать вывод на п р и н т е р всех связанных документов (при выборе
этой опции надо соблюдать осторожность), а также вывод таблицы ссылок.
Как автор Web-страницы вы можете создать ее так, чтобы уменьшить трудности,
возникающие при пользовании ею, в частности при выводе на печать. С атрибутом
o n C l i c k гипертекстовой ссылки (содержащей также атрибут TARGET) можно связать
JavaScript-код, который при активизации ссылки передавал бы фокус целевому фрейму.
Дополнительную информацию о JavaScript-сценариях вы найдете в главе 24. Кроме то­
го, для печати пользователю можно предоставить составной документ. Это очень удоб­
но в том случае, когда в состав Web-страницы входят много отдельных документов.

Одновременное обновление нескольких фреймов


в HTML не предусмотрено одновременное обновление нескольких ф р е й м о в
с помощью одной гипертекстовой ссылки. Решить эту задачу можно следующими спо­
собами:
• объединить несколько ф р е й м о в в составе одного элемента FRAME;
• использовать JavaScript.
4.5. Разрешение типичных проблем... 127

Каждое из этих решений подробно описано ниже.

Объединение фреймов в одном элементе FRAME


Предположим, что раздел FRAMESET выглядит следующим образом:
<FRAMESET ROWS="*,*, *">
<FRAME SRC="Top.html">
<FRAME SRC="Middle.html" NAME="MIDDLE">
<FRAME SRC="Bottom.html" NAME="BOTTOM">
</FRAMESET>
В этом случае средствами H T M L нельзя одновременно обновить M i d d l e . h t m l и
B o t t o m , h t m l . Чтобы это стало возможным, надо изменить структуру документа.
<FRAMESET R0WS="*,2*">
<FRAME SRC="Top.html">
<FRAME SRC="Middle+Bottom.html" NAME="LOWER">
</FRAMESET>
Здесь M i d d l e + B o t t o r n , h t m l сам содержит элемент FRAMESET.
<FRAMESET ROWS="*,*">
<FRAME SRC="Middle.html" NAME="MIDDLE">
<FRAME SRC="Bottom.html" NAME="BOTTOM">
</FRAMESET>

Т е п е р ь для ссылок целевым является ф р е й м LOWER, определяющий URL докумен­


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

Использование JavaScript
Данный способ состоит в том, что автор подключает JavaScript-код с помощью ат­
рибута o n C l i c k гипертекстовой ссылки. Фрагмент кода, обрабатывающий событие
o n C l i c k , может содержать любое число команд JavaScript, включая выражение
top .имя_фрейма. location = URL, с помощью которого во ф р е й м е отображается
новый документ. Таким образом мог)Т' обновляться любые ф р е й м ы , при этом не тре­
буется изменять структуру документа верхнего уровня. Очевидно, что подобное ре­
шение возможно только для броузеров, поддерживающих JavaScript. Подробно во­
просы, связанные с JavaScript-кодом, обсуждаются в главе 24, здесь же мы рассмотрим
небольшой пример. В листинге 4.8 приведен HTML-код документа, содержащего один
ф р е й м в верхней строке и три ф р е й м а в нижней строке.
128 Глава 4. Фреймы

Листинг 4.8. Multiple-Updates.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN">


<HTML>
<HEAD>
<TITLE>Updating Multiple Frames Simultaneously</TITLE>
</HEAD>
<FRAMESET ROWS="75,*">
<FRAME SRC="Top-Frame.html">
<FRAMESET COLS="*,*^">
<FRAME SRC="Bottoml.html" NAME="Bottoml">
<FRAME SRC="Bottom2.html" NAME="Bottom2">
<FRAME SRC="Bottom3.html" NAME="Bottom3">
</FRAMESET>
</FRAMESET>
</HTML>

Ч т о б ы при активизации ссылки в верхней строке результаты отображались в пер­


вом и третьем ф р е й м а х нижней строки, надо включить в состав документа JavaScript-
программу, которая обращается к целевым фреймам по именам B o t t o m l и B o t t o m S .
Документ, содержащий фрагмент JavaScript-кода, показан в листинге 4.9. В документе
определена функция u p d a t e C e l l s и задана связь этой функции с атрибутом o n C l i c k
гипертекстовой ссылки. На рис. 4.7 и 4.8 показан внешний вид Web-сграницы до и по­
сле активизации ссылки.

Листинг4.9. Top-Frame.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Table of Contents</TITLE>
<SCRIPT TYPE="text/javascript">
<! —
function updateCells() {
top.Bottoml.location = "Resultl.html";
top.Bottoms.location = "Result3.html";
}
// — >
</SCRIPT>
</HEAD>
<BODY BGCOLOR="WHITE" TEXT="BLACK">
When selected on JavaScript-capable browsers,
<A HREF="Resultl.html" TARGET="Bottoml" OnClick="updateCells()">
this link</A> will update cell one and three below.
</BODY>
</HTML>
4.5. Разрешение типичных проблем. 129

швшашшва^ штт
?! 1^ -У 3 rii'^'ai <.!•rfа ш jjj
When selected on JavaScript-с ар able browsers, tins bi^:. will update ceil une and tliree below

Original Original Original


Bottom Bottom Bottom Cell
Celll Cell! 3
mp^' Оосшда* Oone :«- '^ J^:' en -.г'. '

Рис. 4.7. Внешний вид документа до активизации ссылки

StflMrtteneoudly - Hetsdape
fie £(* View £о Qomnurwc^arjd:^^:—^^^^^^^

When selected on JavaScnpt-capable browsers, tins 1шк will update cell one and three below.

Result Cell Original Result Cell


1 Bottom 3
Cell 2
У*«Ф^, ;Docurnenit. Done .>-'„„:ii,A^-.

Рис. 4.8. Внешний вид документа после активизации ссылки

Запрет вывода документа в составе фрейма


Н е к о т о р ы е авторы считают, что их документы не предназначены для отображе­
ния в составе Web-страниц с ф р е й м а м и и стараются принять меры для того, чтобы
запретить подобные действия. Одно из решений данной задачи — включить в раздел
HEAD документа выражение <BASE T A R G E T = " t o p " > . Несмотря на т о что данное вы­
ражение не предотвращает начальный вывод документа, о н о запрещает его появле­
ние в составе документа с ф р е й м а м и после активизации ссылки. Используя JavaScript,
можно полностью запретить о т о б р а ж е н и е документа во ф р е й м е . Для этого в раздел
HEAD надо включить следующий фрагмент кода:
<SCRIPT TYPE="text/javascript">
<! —
if ( t o p . f r a m e s . l e n g t h > 0)
top.location = document.location;
/ / —>
</SCRIPT>
Поскольку некоторые пользователи запрещают выполнение JavaScript-сценариев,
для того, чтобы предотвратить появление документа в составе фрейма, бывает необ­
ходимо использовать оба способа.
130 Глава 4 . Ф р е й м ы

Создание пустого фрейма


Internet Explorer 3.0 и более поздние версии этого броузера поддерживают эле­
менты FRAME, в которых содержится атрибут NAME, но отсутствует атрибут SRC.
В этом случае для такого фрейма резервируется место, определенное посредством
включающего элемента FRAMESET. Если в гипертекстовой ссылке в качестве значения
атрибута TARGET задано имя пустого фрейма, при активизации ссылки в составе этого
фрейма отобразится документ, на который указывает данная ссылка. Резервирование
места для фреймов поддерживается также и в Netscape. Однако гипертекстовые ссыл­
ки, в которых в качестве целевого задан пустой фрейм, ведут себя так, как будто этого
фрейма вовсе не существует, т.е. при активизации ссылки документ выводится в но­
вом окне броузера. Такое несоответствие в поведении броузеров создает определен­
ные неудобства, поскольку автор Web-страницы может посчитать целесообразным
вывести информацию в некоторых фреймах, а другие оставить незаполненными до
тех пор, пока пользователь не выберет соответствующую ссылку. Чтобы созданные
вами Web-страницы не отображались по-разному в разных броузерах, атрибут SRC
лучше рассматривать как обязательный. В этом случае пустой фрейм будет создавать­
ся за счет отображения документа с пустым разделом BODY.
Внимание!

В Netscape при активизации гипертекстовой ссылки, для которой


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

4 . 6 . Встроенные фреймы
в Internet Explorer и Netscape б реализована возможность включать фреймы в со­
став HTML-документа подобно тому, как в документ включаются изображения. Если
вы зададите высоту, ширину и тип выравнивания, встроенный, или плавающий, фрейм
займет определенную позицию в составе Web-страницы. Этим встроенные фреймы
отличаются от обычных фреймов, которые занимают фиксированную позицию в ок­
не броузера. Встроенные фреймы удобно использовать для включения персональных
данных и другой информации, которая должна присутствовать в неизменном виде во
многих документах. Несмотря на то что встроенные фреймы предусмотрены специ­
фикацией HTML 4.0, они реализованы только в Internet Explorer и Netscape 6. Более
ранние версии Netscape не позволяют использовать встроенные фреймы, но поддер­
живают слои (layers), которые дают возможность решать подобные задачи. Чтобы
обеспечить соответствие HTML 4.0, в Netscape 6 была исключена поддержка слоев; об
этом следует помнить, разрабатывая Web-страницы. По адресу h t t p : / / s i t e s .
n e t s c a p e . n e t / e k r o c k / s t a n d a r d s . h t m l вы найдете сведения о том, как использо­
вать встроенные фреймы и слои для работы с различными типами броузеров и для
обеспечения обратной совместимости.
Проиллюстрируем использование встроенных фреймов на следующем примере.
Предположим, некий профессор ведет целый ряд курсов, связанных с компьютерами.
В современных университетах программа курса и прочая информация для студентов
публикуется на Web-страницах. Поэтому профессор должен включать в каждый доку-
4.6. Встроенные фреймы 131

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

Листинг 4.10.Contact-Info,html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">


<HTML>
<HEAD>
<TITLE>Prof. Al Gore Ithim</TITLE>
</HEAD>
<BODY>
Prof. Al Gore Ithim<BR>
Computer Science Departinent<BR>
Podunk University<BR>
<A HREF="mailto:algy@podunk.edu"> algy@podunk.edu</A>
</BODY>
</HTML>

Файл с контактной информацией включается в каждую Web-страницу с помощью


элемента IFRAME. В листинге 4.11 показан упрощенный вариант Web-страницы, по­
священной курсу Computer Science 401.

Листинг 4.11. CS-401.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">


<HTML>
<HEAD>
<TITLE>Design and Analysis of Algorithms</TITLE>
</HEAD>
<BODY>
<Hl>Design and Analysis of Algorithms</Hl>
This course covers the techniques required to design and
analyze computer algorithms. The textbook is <I>Introduction
to Algorithms</I> by Gormen, Leiserson, and Rivest
(McGraw Hill, 1990, ISBN 0-07-013143-0).

<P>
Blah, blah, blah, algorithms. Yada, yada, yada, time. Blah,
blah, blah, space. Yada, yada, yada, iterative. Blah, blah,
blah, recurrences. Yada, yada, yard, data structures. Blah,
blah, blah, sorting. Yada, yada, yada, dynamic programming.
Blah, blah, blah, graph algorithms. Yada, yada, yada,
NP-Completeness.
<P>
<IFRAME SRC="Contact-Info.html" FRAMEBORDER=OX/IFRAME>
</BODY>
</HTML>

Теперь, если отобразить эту Web-страницу в окне Internet Explorer, контактная ин-
форхмация разместится в нижней части Web-страницы, как показано на рис. 4.9 и 4.10.
132 Глава 4. Фреймы

Ш DesMin and Analysis of AlgofHhms - Miaosofl tr^efrtdt EnnAoft»


£ite £ * Yivf* fflvra*e* loot» НФ

Design and Analysis of Algorithms


Ш
This course covers the techniques required to design and analyze computer algorithms The textbook ^^
is Introduction to Algorithms by Cormen, Leiserson, and Rivest (McGraw Hill, 1990. ISBN 0-07- Iv
013143-0). ''
Blah, blah, blah, algorithms. Yada, yada, yada, time. Blah, blah, blah, space Yada, yada, yada,
iterative Blah, blah, blah, recurrences. Yada, yada, yard, data structures. Blah, blah, blah, sorting.
Yada, yada, yada, dynamic programming Blah, blah, blah, graph algorithms. Yada, yada, yada, N P -
Completeness

d
, Щ My CornpUe»
m^^
Рис. 4.9. Верхняя часть документа c s - 4 0 l . h t m l : встроенный фрейм
не отображается

^ Design and Analysis of Algorithms - Microsoft Internet BtfAwm


£ile Edit if«w F^vontes lock НФ

тттшчзу •
Blah, blah, blah, algonthntis. Yada, yada, yada, time. Blah, blah, blah, space. Yada. yada, yada.
Iterative. Blah, blah, blah, recurrences. Yada, yada, yard, data structures Blah, blah, blah, sorting
Yada, yada. yada, dynamic programming Blah, blah, blah, graph algorithms. Yada, yada, yada. I n ­
completeness.

Prof. Al Gore Ithim


Computer Science Department
Podunk University
algy @P 0 dunk, e du

jd
; ^ Done"" i i ^ My Computer

Рис. 4.10. Нижняя часть документа c s - 4 0 1 . h t m l : встроенный фрейм


выводится в окне

Как видите, в отличие от обычных фреймов, встроенные фреймы не занимают


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

Элемент: <IFRAME SRC="..." •..> ... </IFRAME>


А т р и б у т ы : SRC, WIDTH, HEIGHT, ALIGN, NAME, FRAMEBORDER, MARGINWIDTH, MARGINHEIGHT,
SCROLLING, LONGDESC
Элемент I FRAME определяет встроенный, или плавающий, фрейм. Он поддержи­
вается только в Internet Explorer 3.0 и более поздних версиях. Между открывающим и
закрывающим дескрипторами помещается текст, предназначенный для тех броузе­
ров, которые не обрабатывают встроенные фреймы. Если встроенные фреймы под­
держиваются, текст игнорируется.

SRC
Атрибут SRC определяет URL документа, который должен отображаться во встро­
енном фрейме.
4.6. Встроенные фреймы 133

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

ALIGN
Атрибут ALIGN задает тип выравнивания ф р е й м а относительно окружающего тек­
ста. Данный атрибут интерпретируется как и атрибут ALIGN для встроенного изо­
бражения. Допустимыми значениями являются LEFT, RIGHT, CENTER, TOP, BOTTOM
и MIDDLE.

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

FRAMEBORDER
Атриб)п: FRAMEBORDER определяет, должно ли отображаться обрамление вокруг
плавающего фрейма. Значение FRAMEB0RDER=1 указывает на то, что обрамление
должно отображаться, а значение FRAMEBORDER=0 соответственно запрещает вы­
вод обрамления. П о )^1олчанию обрамление выводится.

MARGINWIDTH
Атрибут MARGINWIDTH задает ширину правой и левой границ в пикселях.

MARGINHEIGHT
Атрибут MARGINHEIGHT задает высот)^ верхней и нижней границ в пикселях.

SCROLLING
Атрибут SCROLLING указывает на то, что полоса прокрутки должна выводиться
(SCROLLING="YES"), либо запрещает вывод полосы прокрутки (SCROLLING="NO").

LONGDESC
Атрибут LONGDESC задает URI подробного описания ф р е й м а и в основном исполь­
зуется в невизуальных броузерах.

4.7. Резюме
Фреймы являются важным дополнением к HTML 4.0 и поддерживаются большин­
ством современных броузеров. Элемент FRAMESET делит окно либо текущий ф р е й м
на несколько прямоугольных областей, с которыми связываются HTML-документы.
Для связи документов с областями используется элемент FRAME. Гипертекстовые
ссылки, ф о р м ы и Java-аплеты могут ссылаться на ф р е й м ы , используя имена, опреде­
ленные пользователем, либо стандартные имена. Для того чтобы минимизировать
134 Глава 4. Фреймы

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


ходимо тщательно продумывать структуру Web-страницы и при необходимости при­
менять JavaScript-сценарии. Разновидностью фреймов являются встроенные, или
плавающие, фреймы.
Еще одним дополнением к H T M L 4.0 являются каскадные листы стилей. О н и
обеспечивают дополнительный контроль структуры и внешнего вида создаваемых
вами Web-страниц. Расширение каскадных листов стилей позволяет создавать "слои",
посредством которых можно определять разметку абсолютных или относительных
областей страницы. Слои представляют собой более мощное средство, чем ф р е й м ы ,
поскольку определяемые области могут перекрываться, а их размеры и расположение
могут динамически изменяться при выполнении JavaScript-сценариев. Рассмотрению
листов стилей посвящена следующая глава.
КАСКАДНЫЕ
ЛИСТЫ СТИЛЕЙ

В этой главе...

Определение правил стилей.


Связывание правил стилей с HTML-документом.
Способы, позврляющие определить,
поддерживает ли документ правила стилей.
Управление характеристиками шрифтов.
Использование цвета и изображений.
Форматирование текста с использованием стилей.
Управление обрамлением HTML-элементов.
Свойства изображений и плавающих элементов.
Представление списков с помощью листов стилей.
Использование единиц длины и определение цвета.
Организация слоев в документе.
mamJ штат « M J ^ ^^тш^шштш^^ ^mmtammmmi^^ "ттттшшшш^^

аскадные листы стилей— мощное средство форматирования Web-страниц.

К С помощью листов стилей автор может определить начертание и размер шриф­


та, цвет ф о н а и переднего плана, фоновое изображение, размеры границ и дру­
гие характеристики HTML-элементов. Листы стилей не только позволяют управлять
отображением стандартных элементов, но и дают возможность определять новые эле­
менты и накладывать о ф а н и ч е н и я на их характеристики. Правила форматирования
имеют иерархическую, или "каскадную", структуру и позволяют сочетать установки бро­
узера, используемые по умолчанию, с непосредственными инструкциями, задаваемыми
автором док)^ента и пользователем, работающим с Web-страницей. Листы стилей
можно загружать с других узлов, что дает возможность организовывать их совместное
использование. Изменив содержимое одного файла с листами стилей, можно изменять
внешний вид целого набора документов. В настоящее время действует стандарт CSS1
(Cascading Style Sheets, Level 1— Каскадные листы стилей, уровень 1). Листы стилей
поддерживаются версиями 4.01 Netscape и Internet Explorer, а также более поздними
реализациями этих броузеров. Internet Explorer 3.0 частично поддерживает CSS1.
На замену CSS1 World Wide Web Consortium представил CSS2, в котором добавлена
поддержка листов стилей для различных сред. CSS2 позволяет автору создать доку­
мент, предназначенный для отображения в окне обычного броузера, воспроизведе­
ния речи, вывода на п р и н т е р , представления брайлевским ш р и ф т о м и т.д. Кроме то­
го, CSS2 поддерживает позиционирование содержимого, позволяет использовать за­
гружаемые ш р и ф т ы , управлять расположением таблиц, применять национальные
кодировки, автоматическую нумерацию и т.д. В настоящее время ведутся работы по
расширению листов стилей на различные прикладные области. Н и ж е перечислены
документы, в которых содержится и н ф о р м а ц и я о CSS.

Cascading Style S h e e t s , Level 1


http://www.w3.org/TR/REC-CSSl
138 Глава 5. Каскадные листы стилей

Cascading Style S h e e t s , Level 2


http://www.w3.org/TR/REC-CSS2

E x t e n s i b l e Stylesheet L a n g u a g e
http://www.w3.org/Style/XSL/

Новости и предлагаемые расширения листов стилей


http://www.w3.org/Style/
В этой главе будут рассмотрены только средства CSS1.

5 . 1 . Правила стилей
Для управления HTML-элементами используются правила стилей. О б ы ч н о правила
стилей располагаются в отдельном текстовом файле, на который ссылается элемент
LINK, находящийся в разделе HEAD документа. Правила стилей могут также разме­
щаться непосредственно в разделе HEAD HTML-документа и даже в теле Web-
страницы. Правила стилей задаются в следующем виде:
селектор { свойство: значение ]
или
селектор { свойство!: значение!;
СВ0ЙСТВ02: значение2;

СВОЙСТВОМ: значением; }
Если в составе одного селектора определяется несколько свойств, свойства отде­
ляются друг от друга точкой с запятой. За последним свойством точка с запятой мо­
жет не ставиться.
В этой главе будут рассмотрены различные типы селекторов. Самый простой се­
лектор представляет собой имя HTML-элемента и означает, что свойства, указанные в
фигурных скобках, должны применяться ко всем экземплярам этого элемента, при­
сутствующим в составе документа. Свойства и их значения описаны ниже в этой главе.
Рассмотрим простой HTML-документ, код которого представлен в листинге 5.L
Внешний вид документа показан на рис. 5.L

Листинг5.1. F i z z i c s l . h t m l

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>New Advances in Physics</TITLE>
</HEAD>
<BODY>
<Hl>New&nbsp;Advances&nbsp;in&nbsp;Physics</Hl>

<H2>Turning Gold into Lead</H2>


In a startling breakthrough, scientist B.O. "Gus" Fizzics
has invented a <STRONG>practical</STRONG> technique for
5.1. Правила стилей 139

transmutation! For more details, please see


<A HREF="give-us-your-gold.html">our transmutation thesis</A>.

<H2>Perpetual Inactivity Machine</H2>


In a radical approach that turned traditional attempts to
develop perpetual motion machines on their heads, Prof.
Fizzles has developed a verified, bona-fide perpetual
<STRONG>inaction</STRONG> machine. To purchase your own for
only $99.00 (plus $43.29 shipping and handling), please see
<A HREF="rock.html">our order form</A>.
</BODY>
</HTML>

i j Mew Advances in Physics - Microsoft Internet Expio


f^i'o PdJt View Qo Ffiwoiites Help
ИШ
m ж^- О:
3!.
New Advances in Physics
Turning Gold into Lead
In a startling breakthrough, scientist B.O. "Gus" Fimcs has invented a practical
technique for transmutation! For more details, please see our transmutation thesis.

Perpetual Inactivity Machine


In a radical approach that turned traditional attempts to develop perpetual motion
machines on their heads, Prof Fizzics has developed a verified bona-fide perpetual
inaction machine. To purchase your own for only $99.00 (plus $43.29 shipping and
handling), please see our order form.
HI
pone

Рис. 5.1. Документ F i z z i c s l . h t m l , не исполказующий информацию о стилях

Если в раздел HEAD документа включить приведенный ниже фрагмент кода, доку­
мент будет выглядеть так, как показано на рис. 5.2. Для того чтобы броузеры, не под­
держивающие CSS, не отображали текст между дескрипторами <STYLE> и </STYLE>,
этот текст о ф о р м л е н как комментарии.
<STYLE TYPE="text/css">
<! —
BODY { background: URL(images/confetti-background.jpg) }
HI { text-align: center;
font-family: Blackout }
H2 { font-family: MeppDisplayShadow }
STRONG { text-decoration: underline }
— >
</STYLE>
140 Глава 5. Каскадные листы стилей

Ш New Advances in Physics - Microsoft Internet Explorer


б5б £d'ft yiew iQo Fisp*rt3rites Jjelp
ШШ
О D Й ® a- Ж S- Й
J

"(МгаЛсйз @ < ^ №0® IL^s^


In a startling breakthrough, scientist B.O. "Gus" Fizzics has invented a practical
technique for transmutation! For more details, please see our transmutation thesis.

[p@i^l^tkaal] QiflaeMO^ (N^sx^iiiite


In a radical approach that turned traditional attempts to develop peфetual motion
machines on their heads. Prof Fizzics has developed a verified bona-fide peфetual
inaction machine. To purchase your own for only $99.00 (plus $43.29 shipping and
handling), please see our order fomi.
J
Done

Рис. 5,2. Документ F i z z i c s l . h t m l с использованием информации о стилях

5.2. Внешние и локальные листы стилей


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

Внешние листы стилей


Если вы хотите использовать одинаковые стили для ф о р м а т и р о в а н и я нескольких
документов, можете определить их в отдельном файле. Этот файл надо разместить
так, чтобы WW4V-cepBep имел доступ к нему. Для связывания файла, содержащего
листы стилей, с HTML-документами надо использовать элемент LINK, разместив его в
разделе HEAD. Атрибут REL должен иметь значение STYLESHEET, атрибут HREF опре­
деляет размещение файла, а атрибут TYPE— его тип ( t e x t / e s s ) . Предположим, на­
пример, что внешние листы стилей определены в файле S i t e - s t y l e . e s s , располо­
женном в каталоге e s s . Для того чтобы связать листы стилей с текущим документом,
элемент LINK должен выглядеть следующим образом:
<LINK REL=STYLESHEET
HREF="http://www.oursite.com/css/Site-style.ess"
TYPE="text/css">
Правила стилей определяются для каждого селектора, как это показано в листин­
ге. 5.2. Включать в файл дескрипторы <STYLE> необязательно, поскольку тип данных
определяется посредством атрибута TYPE элемента LINK. Многие авторы используют
дескрипторы <STYLE> и о ф о р м л я ю т правила стилей как HTML-комментарии, однако
в этом нет никакой необходимости.
5 . 2 . В н е ш н и е и локальные листы с т и л е й 141

М е т о д и к а профессионалов

Поддержку HTML'документов на Web-ysne можно упростить, раз­


мещая листы стилей во внешнем файле.

Листинг 5.2.Sitestyle.ess
^9
/* Пример внешнего листа стилей */

HI { text-align: center;
font-family: Arial
}'
H2 { color: #440000;
text-align: center;
font-family: Arial Black, Arial, Helvetica, sans-serif
}

Если правила стилей включаются в раздел HEAD HTML-документа, они помещают­


ся между открывающим и закрывающим дескрипторами <STYLE>.

Элемент: <STYLE TYPE="..." ...> ... </STYLE>


Атрибуты: TYPE (обязательный), MEDIA
Элемент STYLE определяет к о н т е й н е р для правил стилей и может присутствовать
лишь в составе раздела HEAD документа. Элемент STYLE с правилами стилей задается в
следующем формате:
<STYLE TYPE="text/css">
<! —
/* необязательные комментарии */
Правила стилей
-->
</STYLE>
Для того чтобы броузеры, не поддерживающие листы стилей, не отображали
текст между открывающим и закрывающим дескрипторами <STYLE>, правила стилей
оформляются как HTML-комментарии.
М е т о д и к а профессионалов

Оформляйте правила стилей как HTML-комментарии.

TYPE
Атрибут TYPE является обязательным. Он определяет формат, в котором представ­
лены правила. Для каскадных листов стилей задается тип " t e x t / e s s " . Для листов
стилей JavaScript значением атрибута TYPE должно быть " t e x t / j а va s c r i p t " .
142 Глава 5. Каскадные листы стилей

MEDIA
В настоящее время атрибут MEDIA не поддерживается ни Netscape, ни Internet
Explorer. Основное назначение данного атрибута— определять устройство, для
которого должны применяться наборы правил. Предполагается, что в будущем с
документом будут связываться различные наборы правил для различных сред вос­
произведения. Допустимыми значениями атрибута MEDIA являются ALL, AURAL,
BRAILLE, HANDHELD, HELD, PRINT, PROJECTION, SCREEN (значение n o умолча­
нию), SPEECH, TTY и TV.

Элемент STYLE и листы стилей JavaScript


Помимо типа " t e x t / e s s " , Netscape 4.x также поддерживают листы стилей типа
" t e x t / j a v a s c r i p t " . Листы стилей JavaScript используют объекты t a g s и синтаксис
JavaScript. Кроме того, имена свойств представляются несколько по-другому. Например:
<STYLE T Y P E = " t e x t / c s s " >

HI { t e x t - a l i g n : c e n t e r ;
font-family: Arial }
—>
</STYLE>
эквивалентно
<STYLE T Y P E = " t e x t / j a v a s c r i p t " >
<!--
tags.HI.textAlign="center";
tags.HI.fontFamily="Arial";
//—>
</STYLE>
Стандартные листы стилей более универсальны, однако при работе с броузером
Netscape листы стилей JavaScript позволяют не только использовать статические зна­
чения, но и вычислять их. Подробно язык JavaScript рассматривается в главе 24.

Встроенные правила стилей


Спецификация CSS1 позволяет включать и н ф о р м а ц и ю о ф о р м а т и р о в а н и и непо­
средственно в элемент HTML. Для этого используется атрибут STYLE. Встроенные
правила стилей выглядят как обычные правила, но имя элемента и фигурные скобки
не указываются. Например:
<Hl>New Advances in Physics</Hl>
<P STyLE="margin-left: 0.5in;
margin-right: 0.Sin;
font-style: italic">
This paper gives the solution to three
previously unsolved problems: turning lead into gold,
antigravity, and a practical perpetual motion machine.
5.3. Селекторы 143

Встроенные правила переопределяют стили, заданные в разделе HEAD. Стили, за­


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

5.3. Селекторы
Для определения правил стилей в состав элемента STYLE включается элемент,
представленный в следующем виде:
селектор { свойство!: значение!; ...; свойством: значением }
Д о сих п о р мы рассматривали примеры, в которых селекторы представляли собой
имена HTML-элементов и правила применялись ко всем вхождениям указанного эле­
мента в документ. П р и этом стили, связанные с данным элементом, переопределя­
лись. Так, например, чтобы указать, что текст, содержащийся в составе элемента
STRONG, должен отображаться полужирным шрифтом, размер которого на 50% пре­
вышает размер по умолчанию, надо задать следующее выражение:
STRONG { font-weight: bold; font-size: 150% }
Однако типы селекторов не ограничиваются именами HTML-элементов. Каскад­
ные листы стилей также поддерживают селекторы, которые применяются только в
конкретных ситуациях. Н и ж е перечислены четыре наиболее часто применяющихся
типа селекторов:

• HTML-элементы;
• классы, определенные пользователем;
• идентификаторы, определенные пользователем;
• псевдоклассы якоря.
Для указания правил, применяющихся только в определенных условиях, исполь­
зуются атрибуты CLASS, ID и STYLE, которые допустимы для всех элементов за ис­
ключением BASE, BASEFONT (атрибут ID разрешен), HEAD, HTML, МЕТА, PARAM
(атрибут ID разрешен), SCRIPT, STYLE и TITLE. Кроме того, спецификация HTML
4.0 определяет элемент SPAN, с помощью которого стили могут применяться к произ­
вольно выбранным разделам документа.

HTML -элементы
Любой HTML-элемент может быть использован в качестве селектора, однако эле­
мент BR не содержит текст, следовательно, применение к нему правил бессмысленно.
Свойства, установленные с помощью правил, наследуются, например цвет ф о н а для
элемента BODY применяется также и к абзацам в теле документа, а размер шрифта, за­
данный для элемента Р, применяется к содержимому элемента CODE внутри абзаца и т.
д. Передача свойства вложенным элементам продолжается до тех пор, пока это свой­
ство не будет переопределено. Н а п р и м е р , чтобы задать синий цвет для всего текста
за исключением заголовка первого уровня, который должен отображаться красным
цветом, надо указать следующие правила:
144 Глава 5. К а с к а д н ы е листы стилей

BODY { c o l o r : b l u e }
HI { c o l o r : r e d }
Ч т о б ы задать одинаковые стили для нескольких элементов, их надо объединить в
список. Элементы внутри списка разделяются запятыми. Н и ж е приведен п р и м е р ус­
тановки свойств для заголовков различных уровней.
HI, Н2, НЗ, Н4, Н5, Нб { text-align: center;
font-family: sans-serif }
Элемент, содержащийся в составе другого элемента, приобретает свойства вклю­
чающего элемента. Предположим, что для различных элементов стили задаются сле-
д)^ющим образом:
BODY { color: blue }
HI { color: green }
EM { color: red }
В данном примере стиль c o l o r : b l u e , заданный для элемента BODY, наследуется
всеми элементами HTML-документа (Р, UL, 0L, TABLE и т.д.). Поэтому документ будет
отображаться синим цветом за исключением элементов, для которых цвет переопре­
делен, т.е. HI и ЕМ. В данном примере возникает следующая проблема: если элемент
ЕМ прис)а'ствует в составе элемента HI, цвет выделенного текста отличается от цвета
остальной части заголовка. Ч т о б ы это не происходило, необходимо добавить прави­
ло, указывающее на то, что выделенр1ый текст в составе заголовка первого уровня
должен отображаться зеленым цветом.
HI ЕМ { c o l o r : green }
Используя CSS при создании документа, следует помнить, что в броузерах Netscape
4.x имеются н е к о т о р ы е ошибки, связанные с листами стилей. Так, например, иногда
стили некорректно наследуются вложенными контеР1нерами. Чтобы избежать неже­
лательных последствий при отображении документов с помощью этих броузеров, же­
лательно явным образом определять стили для вложенных контейнеров либо приме­
нять классы, определяемые пользователем.

Внимание!

В Netscape 4.x не все стили корректно наследуются дочерними кон­


тейнерами, поэтому тщательно тестируйте свои HTML-документы,
прежде чем отправлять их на Web-yaen.

Классы, определяемые пользователем


Автор документа может определять собствеР1Ные классы селекторов. Имя класса
отделяется от имени НТМЬ-,элемента точкой. Предположим, например, что вам надо
определить некий "абстрактный" тип абзаца с отступами от левой и правой границ, в
котором текст отображается курсивом. Для этого надо указать следующее правило:
Р.abstract { margin-left: 0.5in;
margin-right: 0.5in;
font-style: italic }
5 . 3 . Селекторы 145

Теперь, чтобы использовать класс, надо указать имя класса в качестве значения
атрибута CLASS соответствующего элемента Р. Фрагмент документа, в котором ис­
пользуется "абстрактный" абзац, выглядит следующим образом:
<Hl>New Advances in Physics</Hl>
<P CLASS="abstract">
This paper gives the solution to three previously unsolved
problems: turning lead into gold, antigravity, and a
practical perpetual motion machine.
CSS позволяет определять классы, применимые ко всем HTML-элементам. Такой
класс надо объявлять без указания имени элемента перед именем класса. Например,
следующее выражение определяет класс, в котором задается синий цвет переднего
плана и полужирный шрифт:
.blue { color: blue; font-weight: bold }
Этот стиль может быть использован в уже существующем абзаце
This text is in the default color, but
<SPAN CLASS="blue">this text is blue.</SPAN>
либо применен к целому блоку.
<Н2 CLASS="blue">A Blue Heading</H2>
Заметьте, что в именах классов, определенных пользователем, Netscape не под­
держивает символ подчеркивания. Так, например, Netscape не будет интерпретиро­
вать . b l u e _ f o n t как стиль.
Внимание!

Netscape не распознает имена классов, содержащих символ под­


черкивания ("_").

Идентификаторы, определяемые пользователем


И д е н т и ф и к а т о р ы похожи на классы, но, в отличие от класса, и д е н т и ф и к а т о р мо­
жет применяться в составе документа лишь единожды. Для того чтобы объявить
идентификатор, надо указать перед именем символ "#". Элемент ссылается на опре­
деление идентификатора посредством атрибута ID.
<HEAD>
<TITLE>...</TITLE>
<STYLE TYPE="text/css">
<! —
#foo { color: red }
— >
</STYLE>
</HEAD>
<BODY>

<P ID="foo">

</BODY>
В большинстве случаев классы предпочтительнее идентификаторов.
146 Глава 5. Каскадные листы стилей

Псевдоклассы якоря
Поскольку в языке HTML для определения гипертекстовой ссылки предусмотрен
единственный элемент (элемент А, который п р и н я т о называть якорем), он использу­
ется независимо от того, была ли ссылка просмотрена ранее или выбрана в настоя­
щий момент. Стандарт CSS1 позволяет определять свойства отдельно для каждого ти­
па ссылки. Для указания типа ссылки используются следующие селекторы.

A:link, и л и :link
Этот селектор определяет ссылку только в том случае, если она не была просмот­
рена раньше. Броузер определяет, посещалась ли ссылка раньше, на основании
списка предыстории.

A:visited, и л и rvisited
Д а н н ы й селектор соответствует только тем ссылкам, которые не посещались
раньше.

А:active, и л и :active
Этот селектор определяет, как должна отображаться выбранная ссылка (ссылка
считается выбранной до отпускания кнопки мыши).

Aihover, и л и :hover
Этот селектор поддерживается только Internet Explorer. Он применяется к ссылке,
на которую указывает курсор мыши.
Псевдоклассы могут объединяться с другими селекторами. Н а п р и м е р , следующее
правило применяется только к выбранной ссылке и только в том случае, если она
входит в состав элемента указанного класса:
.bizarre lactive { font-size: 300% }
Приведенное ниже правило применимо к изображению, оформленному в виде ги­
пертекстовой ссылки. Правило применяется до тех пор, пока ссылка не будет активи­
зирована.
А:link IMG { border: solid green }

5.4. Предшествование правил


Для конкретного фрагмента текста могут быть определены различные правила
стилей, поэтому броузер должен знать последовательность применения этих правил.
Правила с наивысшим приоритетом, т.е. правила, которым соответствует наиболь­
шее значение предшествования, применяются в последнюю очередь и замещают зна­
чения, заданные правилами с более низким приоритетом. Порядок определения
предшествования (каскадирование) описан ниже.
1. Правила, помеченные как "important" (валсные), имеют наивысший
приоритет.
5.5. Свойства шрифтов 147

Правило стиля может включать модификатор ! i m p o r t a n t . Например, в сле­


дующем примере этим модификатором помечено свойство, которое задает
цвет переднего плана:
HI { c o l o r : b l a c k ! i m p o r t a n t ;
font-family: sans-serif }
Модификатор ! i m p o r t a n t используется крайне редко.
2. Правила, определенные автором, предпочтительнее правил, определен­
ных пользователем, просматривающим документ.
Броузеры позволяют пользователям, просматривающим документ, создавать
стили, заменяющие установки по умолчанию. В этом случае установки, выпол­
ненные автором Web-страницы, более приоритетны, чем установки, выпол­
ненные пользователем.
3. Конкретные правила приоритетнее более общих правил.
При сравнении правил наибольший приоритет имеют идентификаторы. В ос­
тавшейся группе разделение осуществляется по числу атрибутов класса в селек­
торе. В последнюю очередь учитывается число HTML-элементов, указанных в
селекторе. Приведенные ниже правила рассортированы так, что более кон­
кретные правила расположены в начале, а более общие правила— в конце.
В первом правиле селектором является идентификатор. Во втором правиле
указан класс (big), поэтому оно приоритетнее третьего и четвертого правил.
И, наконец, третье правило более конкретно по сравнению с четвертым пра­
вилом, так как в нем присутствуют два HTML-элемента.
#foo { . . . }
р . b i g HI { . . . }
Р STRONG { .. . }
STRONG { . . . }

4. Если нет оснований предпочесть одно правило другому, правило, определен­


ное последним, имеет более высокий приоритет.
Если в соответствии с описанными выше критериями два или более правил
имеют одинаковый приоритет, правило, определенное в последнюю очередь,
приоритетнее правил, определенных перед ним.

5.5. Свойства шрифтов


CSS1 позволяет автору управлять различными характеристиками шрифтов, зада­
вать отображение полужирным шрифтом или курсивом, определять размер и начер­
тание шрифта и т.д. Броузер Netscape также поддерживает динамические шрифты,
позволяющие связать файл шрифтов с документом; при этом документ перестает за­
висеть от набора шрифтов, установленных в клиентской системе. Текст с подчерки­
ванием, верхние и нижние индексы в данном разделе не рассматриваются; они опре­
деляются свойствами текста t e x t - d e c o r a t i o n и v e r t i c a l - a l i g n , которые будут
рассмотрены далее в этой главе. При рассмотрении стилей значения непосредствен­
но следуют за именами стилей. Значение, принимаемое по умолчанию, выделяется
полужирным шрифтом.
148 Глава 5. Каскадные листы стилей

font-weight
normal I lighter | bold | bolder 110012001... 1900
Этот стиль определяет вес шрифта и задается числовыми значениями от 100
(минимальный) до 900 (максимальный) с шагом 100. Кроме того, могут быть исполь­
зованы символьные обозначения: normal, l i g h t e r , bold и b o l d e r . Например:
HI { font-weight : 200 }
Н2 { font-weight : bolder }
Netscape не поддерживает значение b o l d e r .

font-style
normal I italic | oblique
Это свойство выбирает тип шрифта в составе конкретного семейства шрифтов.
Допустимыми значениями являются normal, i t a l i c и o b l i q u e .
Р { font-style : normal }
ТН { f o n t - s y t l e : italic }
Netscape не поддерживает значение o b l i q u e .

font-size
pt, pc, in, cm, mm | em, ex, px, % |
xx-large I x-large | large | medium | small | x-small | xx-small |
smaller | larger
Данный стиль определяет размер шрифта. Значение задается в стандартных еди­
ницах длины (см. табл. 5.1), с помощью символьных имен либо в процентах. Сим­
вольные значения могут быть абсолютными ( x x - l a r g e , x - l a r g e , l a r g e , medium,
s m a l l , x - s m a l l , x x - s m a l l ) или относительными ( s m a l l e r или l a r g e r ) . Значе­
ние в процентах вычисляется относительно размера шрифта в контейнере. На­
пример, следующее выражение означает, что текст в составе элемента STRONG
должен быть на 50% больше текущего размера шрифта:
STRONG { font-size: 150% }
Ниже приведены примеры использования свойства f o n t - s i z e .
Р { f o n t - s i z e : 14pt }
Р { f o n t - s i z e : 1cm }
Р { font-size: xx-large }
Для того чтобы броузер Netscape распознавал стили, необходимо между числовой
величиной и обозначением единиц измерения вставлять пробел, т.е. вместо
" 14 р t" надо задавать "14 р t".

font-family
имя семейства шрифтов
Данное свойство определяет начертание шрифтов. Например, в листинге 5.3 при­
веден пример простой Web-страницы; ее внешний вид показан на рис. 5.3.
5.5. Свойства шрифтов 149

Листинг 5.3. Web-страница Camp Bear Claw

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Cainp Bear Claw</TITLE>
</HEAD>
<BODY>
<Hl>Camp Bear Claw</Hl>
We have the following activities:
<H2>Archery</H2>
<H2>Arts and Crafts</H2>
<H2>Horseback Riding</H2>
<H2>Hiking</H2>
<H2>Campfire Song Times</H2>
<H2>C++ Prograiraning</H2>
</BODY>
</HTML>

О Camp Bear Claw - Microsoft internet Expio


Die Edit yiew Qp Favorites tjetp
mm
Ф о о Ш Q a- (В м^
"U
Camp Bear Claw
We have the following activities:

Archery
Arts and Crafts
Horseback Riding
Hiking
Campfire Song Times
C++ Programming
Рис. 5.3. Web-страница Bear Claw со
стандартными шрифтами

Добавляя свойства f o n t - f a m i l y (см. листинги 5.4 и 5.5), документ можно отобра­


зить совсем по-другому.

Листинг 5.4. Модифицированный код Web-страницы Camp Bear Claw

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
150 Глава 5. Каскадные листы стилей

<TITLE>Camp Bear Claw</TITLE>


<LINK REL^STYLESHEET HREF="CampBearClaw.ess" TYPE="text/ess">
</HEAD>
<BODY>
<Hl>Camp Bear Claw</Hl>
We have the following activities:
<H2 CLASS="archery">Archery</H2>
<H2 CLASS="arts">Arts and Crafts</H2>
<H2 CLASS="horseback">Horseback Riding</H2>
<H2 CLASS="hiking">Hiking</H2>
<H2 CLASS="campfire">Campfire Song Times</H2>
<H2 CLASS="java">Java Programming</H2>
</BODY>
</HTML>

Листинг 5 . 5 . C a m p B e a r C l a w . c s s

HI { text-align: center;
font-family: Funstuff }
H2.archery { font-family: ArcheryDisplay }
H2.arts { font-family: ClampettsDisplay }
H2.horseback { font-family: Rodeo }
H2.hiking { font-family: SnowtopCaps }
H2.campfire { font-family: Music Hall }
H2.java { font-family: Digiface }

i j Camp Bear Clew - Microsoft Internet Expio


File £dft View Qo fsyohtes tlelp

. о • QD a (й m- 3 M ч1

C^Xhf Bear CUw
We have the following activities:

^Ь aoodi £raf fts

HORSEBACK: RIDIHC
И1К11Ю

JRVR PR05RRmmin5
Dom
Ш: Рис, 5.4. Web-страница Bear Claw со

^ш. шрифтами, определенными автором


5.5. Свойства шрифтов 151

Заметьте, что если задать свойство f o n t - f a m i l y в качестве значения атрибута


STYLE и поместить его в двойные кавычки, то имя шрифта, состоящее из нескольких
слов, должно быть указано в одинарных кавычках. Кроме того, имена шрифтов могут
быть заданы в виде списка, в котором имена разделяются запятыми. Порядок следова­
ния имен в списке отражает предпочтения автора. По возможности броузер выберет
первый шрифт, указанный в списке. Наиболее часто используемые шрифты, например
"sanserif, можно указать в конце списка. Если шрифты, помещенные в начало списка,
окажутся недоступными, такой шрифт будет играть роль значения по умолчанию.
Правильно выбирая шрифты, можно существенно улучшить внешний вид Web-
страниц, особенно в intranet, где на всех компьютерах сети установлен стандартный
набор шрифтов. Создавгш документы для Web, вряд ли возможно выбрать шрифт, ко­
торый был бы установлен на всех клиентских системах. Если вы будете применять
псевдографику для отобрг1жения небольших пиктограмм, то при отсутствии такого
шрифта внешний вид страницы станет неприемлемым. В подобной ситуации лучше
использовать для этих целей GIF-файлы или изображения в другом формате, однако
следует помнить, что время загрузки Web-страницы увеличится. Кроме того, символы
национальных кодировок, представленные как изображения, будут недоступны поис­
ковым роботам, выполняющим индексацию содержимого Web. В CSS2 предложено
полезное расширение — динамические шрифты. Далее в этом разделе будут описаны
свойства f o n t d e f и f o n t - f a c e для управления динамическими шрифтами соответ­
ственно в Netscape и Internet Explorer.

font-variant
normal I small-caps
Данное свойство применяется для отображения текста малыми прописными бук­
вами. Допустимыми значениями являются normal и s m a l l - c a p s . Internet
Explorer отображает s m a l l - c a p s обычными прописными буквами. Netscape не
поддерживает это свойство.

font
Свойство f o n t позволяет объединять свойства f o n t - w e i g h t , f o n t - v a r i a n t ,
f o n t - s t y l e , f o n t - s i z e , l i n e - h e i g h t и f o n t - f a m i l y в одной записи. Компо­
ненты значения могут не указываться, но если они присутствуют, то должны сле­
довать в определенном порядке и разделяться пробелами. Исключение составляют
значения f o n t - s i z e и l i n e - h e i g h t , которые разделяются косой чертой ("/")•
Например, код
Р { f o n t - w e i g h t : demi-bold;
font-style: i t a l i c ;
f o n t - s i z e : 14pt;
l i n e - h e i g h t : 150%;
f o n t - f a m i l y : Times, s e r i f }
можно заменить выражением
P { f o n t : demi-bold i t a l i c 14pt/150% Times, s e r i f }
152 Глава 5. Каскадные листы стилей

fontdef
Поддержка динамических ш р и ф т о в реализована как расширение CSSI. П р и этом с
HTML-документом связывается файл ш р и ф т о в . Для работы с динамическими
шрифтами в Netscape может быть использован как стиль f o n t d e f ,
<STYLE TYPE="text/css">
<! —
@fontdef URL(http://.../font-file.pfr);

-->
</STYLE>
так и элемент LINK, расположенный в разделе HEAD документа.
<LINK REL="fontdef"
SRC="http://.../font-file.pfr">
После связывания документа с файлом . p f r динамически загружаемые ш р и ф т ы
можно использовать как обычные ш р и ф т ы . Internet Explorer не поддерживает
ф о р м а т p r f , однако компания Bitstream выпустила управляющий компонент
ActiveX, позволяющий Internet Explorer обрабатывать файлы . p f r . Дополнитель­
ная и н ф о р м а ц и я о динамических ш р и ф т а х находится по следующим адресам:
http://www.truedoc.com/webpages/intro/
http://www.bitstream.com/
Там же вы найдете свободно распространяемые ф а й л ы шрифтов.

font-face
Для поддержки динамически загружаемых ш р и ф т о в Internet Explorer использует
свойство f o n t - f a c e , определенное в Style Sheets, Level 2 ( h t t p : / / w w w . w 3 . o r g /
T R / R E C - C S S 2 / f o n t s . h t m l # f o n t - d e s c r i p t i o n s ) . Для того чтобы задать дина­
мический ш р и ф т для Internet Explorer, используется код наподобие следующего:
<STYLE TYPE="text/css">
<! —
@font-face {
font-family: fontname;
font-style: normal;
font-weight: normal;
src: url(http://.../font-file.eot)
}
</STYLE>
Заметьте, что Internet Explorer и Netscape работают с различными форматами
файлов ш р и ф т о в . Internet Explorer использует ф о р м а т e o t , а Netscape — p f r . Для
создания файлов . e o t Microsoft предоставляет инструмент Web E m b e d d i n g Fonts
Tool (WEFT). П р и м е р ы динамических ш р и ф т о в Microsoft находятся по адресу
http://www.microsoft.com/typography/
С этого же узла можно скопировать свободно распространяемую программу WEFT
Version 2.
5.6. Свойства для определения фона и переднего плана 153

5.6. Свойства для определения фона


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

color
имя_цвета \ #RRGGBB | #RGB | rgb(rrr, ggg, bbb) | rgb(rrr%, ggg%. bbb%)
Данное свойство определяет цвет текста или цвет переднего плана для раздела доку­
мента. Для определения цвета используются стандартные значения (см. табл. 5.2).
Ниже приведены примеры использования свойства c o l o r .
р { color blue }
HI { color #OOAABB }
Н2 { color #OAB }
НЗ { color rgb(255, 0, 0 ) } /* red -^f
Н4 { color rgb(0, 0, 255 ) } /^ blue */

background-color
transparent |
имя_цвета \ #RRGGBB | #RGB | rgb(rrr, ggg, bbb) | rgb(nT%, ggg%, b b b % )
Данное свойство задает цвет ф о н а для раздела документа. Для определения цвета
используются стандартные значения, кроме того, чтобы задать отображение пер­
воначального цвета сквозь п р о з р а ч н ы й фон, можно использовать ключевое слово
transparent.

background-image
n o n e I иг\{имя_файла)
Данное свойство определяет изображение, которое может быть использовано в ка­
честве фона для раздела документа. На тот случай, если файл с изображением недос­
тупен либо если в броузере запрещена загрузка изображений, автор документа может
также задать цвет фона. Следующее выражение задает фоновое изображение:
Н2 { background-image: url(Bluedrop.gif);}

background-repeat
repeat | repeat-x | repeat-y | norepeat
Данное свойство может приобретать значения r e p e a t , r e p e a t - x , r e p e a t - y или
n o r e p e a t и соответственно означает, что вывод изображения повторяется в двух
направлениях, только по оси х, только по оси у, либо отображается один раз и не
может повторяться. Ниже приведен пример использования свойства b a c k g r o u n d -
repeat.
154 Глава 5. Каскадные листы стилей

BODY {
background-image: url(Bluedot.gif);
background-repeat: repeat-x;

background-attachment
scroll I fixed
Данное свойство определяет, должно ли фоновое изображение прокручиваться
вместе с содержимым документа (значение s c r o l l ) либо оставаться неподвиж­
ным (значение f i x e d ) . Данное свойство не поддерживается Netscape.

background-position
[ top I center | bottom] [ left | center | right ] |
[ pt, pc, in, cm, mm ] [ pt, pc, in, cm, mm ] |
[ em, ex, px, % ] [ em, ex, px, % ]
Свойство b a c k g r o u n d - p o s i t i o n задает позицию фонового изображения отно­
сительно верхнего левого края области. Для данного свойства обычно задаются
два значения, разделенные пробелами. Указанные значения уточняются посредст­
вом ключевых слов l e f t / c e n t e r / r i g h t , t o p / m i d d l e / b o t t o m , знака процента
и обозначения единицы длины (см. табл. 5.1). Так, например, 50% означает, что
центр изображения должен располагаться в центре области. Значение 25рх по го­
ризонтали указывает на то, что левая граница изображения должна отступать на
25 пикселей от левой границы области. Если вместо двух значений задано одно,
считается, что указана позиция по горизонтали, а позиция по вертикали принима­
ется равной 50%. По умолчанию принимается значение "0% 0%". Отрицательные
значения также поддерживаются, в этом случае считается, что изображение вы­
ступает за границы раздела. Ниже приведены примеры использования свойства
background-position.
BODY { background-image: url(Marty.jpg);
background-position: 10% 10%; }
HI { background-image: Bluedrop.gif;
background-position: center; } /* 50% 50% */

Броузер Netscape не поддерживает свойство b a c k g r o u n d - p o s i t i o n .

background
Свойство background позволяет объединять свойства b a c k g r o u n d - c o l o r , b a c k ­
ground-image, b a c k g r o u n d - r e p e a t , b a c k g r o u n d - a t t a c h m e n t и b a c k g r o u n d -
p o s i t i o n в одной записи.
В качестве примера рассмотрим листинги 5.6 и 5.7, которые содержат код Web-
страницы. Заголовок отображается на фоне, имитирующем деревянные панели.
Формат изображения повторяется по горизонтали. Внешний вид Web-страницы в ок­
не броузера Netscape Communicator 4.7 показан на рис. 5.5.
5.6. Свойства для определения фона и переднего плана 155

Листинг 5.6. Cabinets. html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Joe's Cabinets</TITLE>
<LINK REL=STYLESHEET HREF="Cabinets.ess" TYPE="text/css">
</HEAD>
<BODY>
<CENTER>
<TABLE WIDTH=360 HEIGHT=199>
<TR><TD ALIGN="CENTER" CLASS="banner">Joe's Cabinets
</TABLE>
</CENTER>
<P>
Welcome to Joe's Cabinets. We specialize in
<UL>
<LI>Custom Cabinets
<LI>Kitchen Remodeling
<!-- Etc -->
</UL>
< ! — Etc — >
</BODY>
</HTML>

Листинг 5.7. Cabinets.ess

.banner { background: url(images/boards.jpg) repeat-x;


font-size: 50pt;
font-family: Arial Rounded MT Bold }

ШЕВШШВШШ

ltki>'M^mail.,.nM.
Welcome to Joe's Cabinets. We specialize in

• Custom Cabinets ,
• Kitchen Remodebng

Рис. 5.5. Фоновое изображение может применять­


ся при выводе отдельных блоков текста
156 Глава 5. Каскадные листы стилей

5.7. Текстовые свойства


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

word-spacing, letter-spacing
normal I + / - pt, pc, in, cm, m m | + / - em, ex, px
Данные свойства изменяют расстояния между словами и между символами, приня­
тые по умолчанию. Для указания расстояния используются стандартные единицы
длины (см. табл. 5.1) либо ключевое слово n o r m a l . Числовые значения мог)т быть
либо положительными (указанная величина добавляется к стандартному расстоя­
нию), либо отрицательными (заданная величина вычитается из стандартного рас­
стояния). Свойство w o r d - s p a c i n g не поддерживается ни Netscape, ни Internet
Explorer. Кроме того, Netscape не поддерживает свойство l e t t e r - s p a c i n g .

text-decoration
n o n e I underline | overline | line-through | blink
Свойство t e x t - d e c o r a t i o n описывает дополнительные элементы текста. Допус­
тимыми значениями являются п о п е , u n d e r l i n e , o v e r l i n e , l i n e - t h r o u g h и
b l i n k . Например, если вы хотите, чтобы гипертекстовые ссылки отображались
синим цветом, но без подчеркивания, а текст абзаца выводился с подчеркиванием,
надо задать следующие выражения:
А:link { coloriblue; text-decoration: none }
P { text-decoration: underline }
Заметьте, что Internet Explorer не поддерживает значение b l i n k , a Netscape не
поддерживает значение o v e r l i n e .

vertical-align
top I bottom I baseline | middle | sub | super | text-top | text-bottom | %
Данное свойство определяет позиционирование элементов по вертикали. Значение,
заданное в процентах (положительное или отрицательное), определяет смещение
базовой линии элемента от базовой линии родительского элемента. Кроме того,
значение может задаваться посредством символьных имен. Допустимыми символь­
ными именами являются t o p (выравнивание верхней части данного элемента по
верхней части самого высокого элемента строки), b o t t o m (выравнивание нижней
части данного элемента по нижней части самого низкого элемента строки), b a s e ­
l i n e (выравнивание базовой линии данного элемента по базовой линии родитель­
ского элемента), m i d d l e (выравнивание середины элемента по половине расстоя­
ния над базовой линией родительского элемента), s u b (представление элемента как
нижнего индекса), s u p e r (представление элемента как верхнего индекса), t e x t - t o p
(выравнивание верхней границы по верху шрифта родительского элемента), t e x t -
b o t t o m (выравнивание нижней границы по низу шрифта родительского элемента).
5-7- Текстовые свойства 157

text-transform
n o n e I uppercase | lowercase | capitalize
Данное свойство определяет, должно ли выполняться преобразование текста в сим­
волы верхнего регистра ( u p p e r c a s e ) , в символы нижнего регистра ( l o w e r c a s e ) и
следует ли начинать каждое слово с прописной буквы ( c a p i t a l i z e ) .

text-align
left I right I center [justify
Данное свойство задает выравнивание абзаца по левой границе, по центру, по
правой границе и по обеим границам.

text-indent
+ / - pt, рс, in, cm, mm | + / ~ em, ex, px, %
Данное свойство задает отступ первой строки абзаца. Отступ отсчитывается от ле­
вой границы, определенной посредством свойства m a r g i n - l e f t . Значения зада­
ются в стандартных единицах длины либо вычисляются в процентах от ш и р и н ы
родительского элемента. По умолчанию принимается значение 0. Отрицательная
величина означает, что первая строка выступает за левую границу. Например:
Р { text-indent: -25рх } /* Выступ */

line-height
normal I число \ pt, рс, in, cm, mm | em, ex, px, %
Данное свойство задает высоту строки — расстояние между базовыми линиями
двух последовательно расположенных строк абзаца. Значение может быть задано в
стандартных единицах длины, а также в процентах от размера шрифта. Например:
.double { line-height: 200% }
.triple { line-height: 3 } /* Зх the font size */
DIV { line-height: 1.5em }

white-space
normal I pre | nowrap
Свойство w h i t e - s p a c e определяет особенности интерпретации пробелов, сим­
волов табуляции, возврата каретки и новой строки в пределах элемента. Допусти­
мыми значениями являются n o r m a l (преобразование нескольких последователь­
но расположенных пробелов в один пробел), p r e (пробелы интерпретируется так
же, как в элементе PRE) и n o w r a p (перевод строки осуществляется только посред­
ством элемента BR). Броузер Netscape не распознает значение n o w r a p ; Internet
Explorer вовсе не поддерживает свойство w h i t e - s p a c e .
В качестве примера рассмотрим Web-страницу, которая должна выглядеть как де­
ловое письмо. Исходный код этой Web-страницы представлен в листинге 5.8. Рас­
стояние между абзацами уменьшено с помощью следующего выражения:
Р { margin-top: 5рх }
Для даты, адреса получателя и отправителя определены классы абзацев, выров­
ненные по правой ( r h e a d ) и левой ( I h e a d ) границам. Основное содержание доку-
158 Глава 5. Каскадные листы стилей

мента выводится с отступом и выравниванием ( j u s t i f y ) . Кроме того, подпись


( f o o t ) отображается с отступом 60% и увеличенным расстоянием между строками.
На рис. 5.6 показан внешний вид документа, отображаемого в броузере Internet
Explorer, который выполняется в среде Windows 2000.

Листинг 5 . 8 . B a t e s . html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 T r a n s i t i o n a l / / E N " >


<HTML>
<HEAD>
<TITLE>An Open L e t t e r t o t h e IRS</TITLE>
<LINK REL=STYLESHEET H R E F = " B a t e s . e s s " T Y P E = " t e x t / c s s " >
</HEAD>
<BODY BACKGROUND="images/bond-paper.jpg">
<P CLASS="rhead">
April 1, 2001
<HR>
<P CLASS="rhead">
William A. Bates<BR>
Macrosoft Corporation<BR>
Blumond, WA 12345
<P CLASS="lhead">
Internal Revenue Service<BR>
Philadelphia, PA 67890
<P>
<BR>
Dear Sirs,
<P CLASS="body">
I am writing to inform you that, due to financial difficulties,
I will be unable to pay my taxes this year.
<P CLASS="body">
You see, my company has had reduced profits this year. In fact
gross revenues have now dropped below the GDP of <B>twelve</B>
foreign countries! Given this intolerable situation, I am sure
you will understand.
<P CLASS="foot">
Sincerely,<BR>
William A. Bates
</BODY>
</HTML>

Листинг 5.9. Bates. ess

P { margin-top: 5px }
P.rhead { text-align: right;
margin-right: O.Sin;
font-family: sans-serif }
P.lhead { font-family: sans-serif }
P.body { text-align: justify;
text-indent: 0.5in }
P.foot { margin-left: 60%;
line-height: 300% }
5.8. Свойства блоков с обрамлением 159

Ш An Open Letter to the IRS - MkrosofI: MefneiC«ok»^ ^ ^iptxl


Fte Edit View Favorites loot Help

*« - •* - '^ i3 ^ '3^Sedfch ; i j Favorites ^History -^- ^ @ •

April 1,2001
"3

VViiliam A. Bates
Macrosoft Софогайоп
Blumood.WA 12345 f
Internal Revenue Service
Philadelphia, PA 67890

Dear Sirs,
I am writing to inform you that, due to financial difficulties, I wiD be unable to
pay ray taxes this year.
You see, my company has had reduced profits this year. In fact gross
revenues have now dropped bdow the GDP of twelve foreign countries! Given this
intolerable situation, I am sure you will understand

Sincerely,

Williain A. Bates

zl
i^Oone ( ^ My Computer

Рис. 5.6. Текстовые свойства позволяют форматировать документ тре­


буемым образом

5.8. Свойства блоков с обрамлением


При использовании каскадных листов стилей предполагается, что все элементы
отображаются в одной или нескольких прямоугольных областях. Такие области назы­
ваются блоками (box) и содержат обрамление, заполненное пространство и включен­
ные элементы. Ширина и высота блока определяются шириной и высотой включен­
ных элементов, размерами заполненного пространства, окружающего элементы, раз­
мерами обрамлейия вокруг блока и границами вокруг обрамления. Границы вокруг
обрамления всегда прозрачны и не закрывают фон. Пространство вокруг элемента
всегда заполняется цветом фона либо фрагментами фонового изображения, опреде­
ленного для этого элемента. Для обрамления может быть задан отдельный фон. Так,
например, чтобы задать размеры границ, обрамления и заполненной области, рав­
ными четверти дюйма, надо использовать следующий фрагмент кода. При отображе­
нии указанных компонентов будет выводиться разный фон.
Р { margin: 0 . 2 5 i n ;
border; 0.25in solid black;
padding: 0.25in;
background: URL(images/bond-paper.jpg) }
BODY { background: URL(images/bricks.jpg) }
Ha рис. 5.7 показана Web-страница, созданная с применением заданных свойств.
Заметьте, что границы отображаются за пределами обрамления, обрамление — за
пределами заполненной области, а заполненная область — за пределами элемента.
160 Глава 5. Каскадные листы стилей

ЩBaundift9 Box - MftcrosoftliAetiii^Шщ^ШтМ

Jcjk £c8t ^ew Fuvorltes look «elp

I ш1 ^
^Щ^^^^^Лм!

-^Done ^ ^ My Computer

Рис. 5.7. Отображение границ, обрамления и заполнен­


ной области

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

margin-left, margin-right, margin-top, margin-bottom


auto I + / - pt, pc, in, cm, m m | + / - em, ex, px, %
Данные свойства задают левую, правую, верхнюю и н и ж н ю ю границы. Для указа­
ния размеров границ используются стандартные единицы длины (см. табл. 5.1),
относительные значения в процентах или ключевое слово a u t o . По умолчанию
принимается значение 0. Отрицательные значения также допустимы, они опреде­
ляют выступ за левую границу либо перекрытие предыдущего абзаца. П р и м е р ы
определения границ приведены ниже.
Р { m a r g i n - r i g h t : 5ех }
HI { m a r g i n - t o p : 200% }
margin
Данное свойство позволяет задавать верхнюю, правую, нижнюю и л€;вую границы
(в указанном порядке) с помощью одной записи. Если указано только одно значе­
ние, оно применяется для определения всех четырех границ. Если заданы два или
три значения, недостающая величина принимается равной размеру противопо­
ложной границы. Отрицательные значения допустимы, их иногда используют для
создания эффекта расположения текста "в несколько слоев".

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

border-left-width, border-right-width, border-top-width, border-bottom-width


none I thin | medium | thick |
pt, pc, in, cm, mm | em, ex, px
Данные свойства задают размеры левой, правой, верхней и нижней частей обрам­
ления. Для указания размеров используются стандартные единицы длины либо
символьные имена t h i n , medium, t h i c k или none. Отрицательные значения за­
прещены.

border-width
none I thin | medium | thick |
pt, pc, in, cm, mm | em, ex, px
Данное свойство позволяет в одной записи задавать величины b o r d e r - w i d t h -
top, b o r d e r - w i d t h - r i g h t , border-width-bottom и b o r d e r - w i d t h - l e f t
(значения задаются в указанной последовательности). Если задано только одно
значение, оно применяется для определения всех четырех частей обрамления. Ес­
ли заданы два или три значения, недостающая величина принимается равной раз­
меру противоположной части. Например, в приведенном ниже выражении для
верхней и нижней частей обрамления принимается значение medium, а для пра­
вой и левой частей — значение t h i n .
DIV { b o r d e r - w i d t h : medium t h i n }

border-color
имя_цвета \ #RRGGBB | #RGB | rgb(rrr, ggg, bbb) | rgb(rrr%, ggg%, bbb%)
Данное свойство задает цвета различных частей обрамления. Подобно b o r d e r -
width, для данного свойства указываются четыре значения, которые определяют
характеристики соответственно верхней, правой, нижней и левой частей обрам­
ления. Способы определения значений цветов описаны в табл. 5.2. Например:
Р { border-style: solid;
b o r d e r - c o l o r : b l a c k gray gray b l a c k ;
}

Если в составе данного свойства указано больше одного значения, броузер


Netscape может обрабатывать его некорректно.

border-style
none I dotted | dashed | solid | double | groove | ridge | inset | outset
Данное свойство задает способ отображения обрамления. Для него могут быть зада­
ны от одного до четырех значений, определяющих, подобно b o r d e r - w i d t h , харак­
теристики верхней, правой, нижней и левой частей обрамления. Допустимыми яв­
ляются значения попе, d o t t e d , dashed, s o l i d , double, groove, r i d g e , i n s e t и
o u t s e t . В областях обрамления, не заполненных цветом переднего плана, отобра­
жается цвет фона или фоновое изображение включаемого элемента. Значения
dashed и d o t t e d не поддерживаются ни Netscape, ни Internet Explorer. Следует за­
метить, что Netscape не поддерживает свойства b o r d e r - s t y l e ; соответствующие
значения должны задаваться посредством свойства border. Например,
162 Глава 5. Каскадные листы стилей

Р { border-sytle: ridge }
не распознается Netscape; вместо этого следует задать следующую конструкцию:
Р { border: ridge }
Internet Explorer корректно обрабатывает оба выражения.

border-left, border-right, border-top, border-bottom


Данные свойства позволяют задавать размеры, стиль и цвет для каждой из четы­
рех частей обрамления. Так, например, чтобы заголовки первого уровня выводи­
лись красным цветом, а сверху и снизу заголовка отображалась синяя сплошная
линия, надо задать следующее выражение:
HI { c o l o r : red;
border-top: lOpx solid blue;
border-bottom: lOpx solid blue }

border
Данное свойство определяет размеры, стиль и цвет для всех четырех частей об­
рамления. Например, сплошное обрамление черного цвета шириной в четверь
дюйма, показанное на рис. 5.7, задается с помощью следующего выражения:
border: 0.25in s o l i d black

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

padding-left, padding-right, padding-top, padding-bottom


pt, pc, in, cm, mm | em, ex, px, %
Данные свойства позволяют задавать размеры левой, правой, верхней и нижней
частей заполненной области. Заметьте, что если граница отображает фон родитель­
ского элемента (обычно это элемент BODY), а для обрамления задается независимый
фон, то область, о которой идет речь, заполняется фоном, принадлежащим вклю­
чаемому элементу. Размеры могут быть заданы в стандартных единицах длины или в
процентах от размеров элемента. По умолчанию принимается значение 0. Отрица­
тельные значения не допускаются.

padding
Данное свойство позволяет задавать размеры верхней, правой, нижней и левой
частей заполненной области в рамках одной записи. Если для свойства padding
указано только одно значение, оно применяется для всех четырех частей области.
Если же заданы два или три значения, недостающий размер принимается равным
размеру противоположной части. Например, заполненная область шириной чет­
верть дюйма, показанная на рис. 5.7, задается с помощью следующего выражения:
padding: 0.25in
5.9. Изображения и плавающие элементы 163

Типы отображения блока


Большинство HTML-элементов могут содержать границы, обрамление и запол­
ненные области. Однако особенности интерпретации этих компонентов зависят от
того, включен ли текущий элемент в состав абзаца, является ли независимым элемен­
том блокового уровня или представляет собой часть списка. Свойство d i s p l a y по­
зволяет изменить порядок интерпретации блока.

display
block I inline | list-item | none
Данное свойство определяет, должен ли элемент отображаться в составе ограни­
ченного блока, выводиться как абзац, подобно элементам Р или PRE, либо должен
быть представлен как встроенный блок в составе другого блока. Допустимыми
значениями являются b l o c k , i n l i n e , l i s t - i t e m и none. Значение l i s t - i t e m
интерпретируется как b l o c k , за исключением того, что к пункту списка добавля­
ется маркер.

5.9. Изображения и плавающие элементы


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

width, height
auto I pt, pc, in, cm, mm | em, ex, px
Данные свойства задают фиксированные размеры элемента и обычно применяют­
ся к изображениям. Значения указываются в стандартных единицах длины, кроме
того, в качестве значения может быть использовано ключевое слово a u t o . Напри­
мер, тип "bullet" задается следующим образом:
IMG.bullet { width: 50рх; height: 50рх }
Ключевое слово a u t o применяется к изображениям, для которых задана либо ши­
рина, либо высота. Оно означает, что изображение должно быть масштабировано
с сохранением соотношения между исходной шириной и высотой.

float
none I left I right
Данное свойство располагает плавающие элементы по левой или правой границе с
обтеканием текста. Часто это свойство используется для выделения прописных
букв и для размещения плавающих изображений. Например, в листинге 5.10 пока­
зан код документа, в котором выделяется прописная буква "Т" размером 75 пунк­
тов. Внешний вид документа показан на рис. 5.8.
164 Глава 5. Каскадные листы стилей

Листинг5.10. Psalm23.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>The 23rd Psalm</TITLE>
<STYLE>
<! —
SPAN { float: left;
font-family: "Gushing Book";
font-size: 75pt }
-->
</STYLE>
</HEAD>
<BODY>
<H2 ALIGN="CENTER">
The 23rd Psalm (King James Version)</H2>
<SPAN>T</SPAN>he LORD is my shepherd; I shall not want.
He maketh me to lie down in green pastures: he leadeth me
beside the still waters. He restoreth my soul: he leadeth me
in the paths of righteousness for his name's sake. Yea,
though I walk through the valley of the shadow of death, I
will fear no evil: for thou art with me; thy rod and thy
staff they comfort me. Thou preparest a table before me in
the presence of mine enemies: thou anointest my head with oil;
my cup runneth over. Surely goodness and mercy shall follow me
all the days of my life: and I will dwell in the house of the
LORD forever.
</BODY>
</HTML>

шшшшшшв
file g(M ifiew fio £ofwnunic«ioi НФ

The 23rd Psalm


(King James Version)
he LORD is my

T
shepherd; I shall not
want. He maketh me to
lie down in green
pastures: he leadeth me
beside the still waters. He
restoreth my soul he
leadeth me in the paths of
righteousness for his name's sake
Yea, though I walk through the
уаДеу of the shadow of death, I will »j Рис. 5.8. Свойство f l o a t может быть
использовано для выделения прописных букв

clear
none I left I right | both
Данное свойство определяет, допустимы ли плавающие элементы слева или справа
от элемента. В качестве значений могут быть указаны l e f t (продолжить вывод
ниже плавающего элемента, расположенного слева), r i g h t (продолжить вывод
5.10. Свойства списков 165

ниже плавающего элемента, расположенного справа), b o t h (продолжить вывод


ниже любого из плавающих элементов) и п о п е (разрешить плавающие элементы).
Например, код Web-страницы (листинг 5.10), изображенной на рис. 5.8, можно
модифицировать так, чтобы после первого предложения начинался новый абзац.
Если для создания абзаца используется обычный дескриптор <Р>, то документ бу­
дет выглядеть так, как показано на рис. 5.9,а.

The 23 rd Psalm The 23rd Psalm


(King James Version) Й (King James Version)
he LORD is my he LORD is my

T
shepherd; I shall not shepherd; I shall not

^^^
•want.

He maketh me to lie
down m green pastures:
T want.

He maketh me to lie down in green


he leadeth me beside the pastures: he leadeth me beside the
still waters. He restoreth my soul: he still waters He restoreth my soul: he
leadeth me in the paths of leadeth me in the paths of
righteousness for his name's sake z! nfihteousiifsb L r b s name': salce d
Yea, though I walk through the (6)
(а)
Рис. 5.9. (a) По умолчанию текст, принадлежащий новому абзацу, продолжает
обтекание плавающего элемента; (б) новый абзац начинается ниже плавающего
элемента, определенного в предыдущем абзаце

Если же создать абзац с помощью дескриптора <Р S T Y L E = " c l e a r : l e f t " > , то


Web-страница будет выглядеть так, как показано на рис. 5.9,6, т.е. абзац начнется под
нижней границей плавающего элемента (буквы "Т").

5.10. Свойства списков


Каскадные листы стилей позволяют изменить ф о р м а т и р о в а н и е нумерованных
списков (0L), маркированных списков (UL) и списков определений (DL). Данные
свойства не обрабатываются Internet Explorer 3, а Netscape 4 поддерживает только
свойство l i s t - s t y l e - t y p e .

list-style-image
n o n e I иг\{гшя_файла)
Данное свойство позволяет задавать новые маркеры для списков. Используя это
свойство, следует помнить, что оно поддерживается только Internet Explorer. В ка­
честве значения задается URL либо ключевое слово попе. П р и м е р ы использования
l i s t - s t y l e - i m a g e приведены ниже. Первое выражение устанавливает в качестве
маркера по умолчанию для маркированного списка изображение, содержащееся в
файле d i a m o n d . g i f . Второе выражение задает класс s t a r , для которого маркиро­
ванные списки помечаются маркером в виде звездочки (файл s t a r . g i f ) .
UL { l i s t - s t y l e - i m a g e : u r l ( d i a m o n d . g i f ) }
UL.star { l i s t - s t y l e - i m a g e : u r l ( s t a r . g i f ) }
166 Глава 5. Каскадные листы стилей

Если броузер поддерживает анимационные GIF-файлы, их также можно использо­


вать в качестве маркеров. Броузер Netscape не поддерживает свойство l i s t -
style-image.

list-style-type
n o n e I disc | circle | square | decimal | upper-alpha | lower-alpha | upper-roman |
lower-roman
Д а н н о е свойство устанавливает маркер для списка в том случае, когда задано зна­
чение п о п е свойства l i s t - s t y l e - i m a g e (оно принимается по умолчанию для 0L
и DL). Допустимыми значениями являются d i s c (закрашенный круг), c i r c l e
(незакрашенный круг), s q u a r e , d e c i m a l (1, 2, 3 и т.д.), u p p e r - a l p h a (А, В, С
и т.д.), l o w e r - a l p h a (а, Ь, с и т.д.), u p p e r - r o m a n (I, II, III и т.д.), l o w e r - r o m a n (i,
ii, iii и т.д.) и n o n e .

list-style-position
outside I inside
Д а н н о е свойство, допустимыми значениями которого являются o u t s i d e (по
умолчанию) и i n s i d e , указывает, должен ли маркер располагаться в пределах аб­
заца ( i n s i d e ) или выступать влево ( o u t s i d e ) . Н и Netscape, ни Internet Explorer
не поддерживают свойство l i s t - s t y l e - p o s i t i o n .

list-style
Д а н н о е свойство позволяет задавать значения l i s t - s t y l e - i m a g e , list-style-
t y p e и l i s t - s t y l e - p o s i t i o n в одной записи.

5 . 1 1 . Стандартные единицы для


определения значений свойств
Каскадные листы стилей позволяют задавать размеры и цвет в различных форма­
тах. Размеры можно указывать в абсолютных и относительных единицах, используя
целые числа либо десятичные числа с плавающей точкой. Н е к о т о р ы е свойства позво­
ляют задавать отрицательные размеры; в этом случае перед соответствующим значе­
нием ставится знак "минус" ("-").

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

Таблица 5 . 1 . Абсолютные и относительные единицы длины


cm Сантиметры (абсолютная единица)
em Высота текущего ш р и ф т а (относительная единица)
ех Высота буквы "х" в текущем ш р и ф т е (относительная единица)
5.12. Слои 167

Окончание табл. 5 . 1 .
in Дюймы (абсолютная единица)
пил Миллиметры (абсолютная единица)
рс Пика; в дюйме 6 пика; в пика 12 пунктов (абсолютная единица)
pt Пункты; в дюйме 72 пункта (абсолютная единица)
рх Пиксели (относительная единица)

Цвет
Каскадные листы стилей позволяют задавать цвет любым из способов, описанных
в табл. 5.2.

Таблица 5.2. Форматы цвета в CSS1


имя цвета В качестве имени цвета используется одно из стандарт­
ных имен, перечисленных в табл. 1.1. Netscape и Internet
Explorer также поддерживают имена цветов X I 1
#RRGGBB Каждый из компонентов RR, GG и ВВ представляет собой
шестнадцатеричное число в диапазоне от 00 до FF
#RGB Д а н н ы й формат является сокращенным представлением
ф о р м а т а #RRGGBB. Н а п р и м е р , значение #OAF эквива­
л е н т н о значению # О OAAFF
rgb ( r r r , ggg,bbb) В этом формате каждый из компонентов r r r , ggg и
b b b представляет собой десятичное число в диапазоне от
О до 255
r g b {rrr%, ggg%,bbb%) В данном формате компоненты r r r , g g g и b b b являются
десятичными числами в диапазоне от О до 100

5.12. Слои
Netscape 4 поддерживает средство, которое п р и н я т о называть слоями. Слои по­
зволяют размещать элементы разметки в отдельных прямоугольных областях, а затем
располагать эти области в абсолютных и относительных позициях. Области могут пе­
рекрываться, в этом случае, определяя верхнюю область как прозрачную, можно ото­
бражать нижележащие данные. Слои дают возможность ф о р м и р о в а т ь перекрываю­
щиеся заголовки и панели, отображать текст в несколько колонок, аннотировать диа­
граммы и другие рисунки и создавать составные изображения, помещая прозрачные
картинки поверх других. Включая в состав документа JavaScript-сценарии, можно ди­
намически превращать видимые области в невидимые и наоборот. П р и н ц и п динами­
ческого изменения слоев подробно описан в главе 24, здесь же, оценивая преимуще­
ства слоев, достаточно помнить о такой возможности. Слои задаются в теле докумен­
та (раздел BODY) с помощью элементов LAYER и ILAYER. Для обеспечения соответ-
168 Глава 5. К а с к а д н ы е листы с т и л е й

СТВИЯ спецификации HTML 4.0 из Netscape 6 исключена поддержка элементов LAYER


и ILAYER. Internet Explorer поддерживает слои лишь посредством каскадных листов
стилей.
На з а м е т к у

Internet Explorer и Netscape 6 не поддерживают элементы LAYER И


ILAYER. Слои реализуются посредством листов стилей.

Определение слоев с помощью элементов LAYER


и/LAYER
Элемент: <LAYER ...> ... </LAYER>
<ILAYER ...> ... </1ЬАУЕ10
А т р и б у т ы : ABOVE, BACKGROUND, BELOW, BGCOLOR, CLIP, HEIGHT, ID, LEFT, ONBLUR,
ONFOCUS, ONLOAD, ONMOUSEOVER, ONMOUSEOUT, PAGEX, PAGEY, SRC, TOP, V I S I B I L I T Y ,
WIDTH,Z-INDEX
Элемент LAYER создает области и размещает их в абсолютных позициях по отноше­
нию к окн)' или родительскому слою. С помощью элемента LAYER можно сформировать
встроенные слои: области, включенные в текстовый поток. Альтернативный текст для
броузеров, не поддерживающих слои, помещается в состав элемента NOLAYER. Если
броузер поддерживает элемент LAYER, содержимое NOLAYER игнорируется.

ABOVE, BELOW, Z-INDEX


Обычно слои размещаются в том порядке, в котором они появляются в документе:
первый слой считается нижним, а остальные располагаются над ним. Данные атри­
буты позволяют изменить расположение слоев, принятое по умолчанию. Для кон­
кретного слоя может быть задан лишь один атрибут ABOVE, BELOW или Z-INDEX.
Значением атрибута Z-INDEX является положительное целое число, которое при­
сваивается слою. Слои с большими номерами располагаются поверх слоев с меньши­
ми номерами. В качестве значения атрибута ABOVE или BELOW задается идентифика­
т о р слоя, который должен быть расположен непосредственно над или под текущим
слоем. Использование этих слоев взывает у некоторых авторов затруднения. Так,
выражение <LAYER I D = " F o o " ABOVE="Bar"> означает, что слой, идентифициро­
ванный как Ваг, должен располагаться поверх слоя Foo, а не наоборот.

Внимание!

ABOVE И BELOW означают, что слой, на который ссылается соответст-


вующий атрибут, должен располагаться ниже или выше текущего слоя.
Выражение <LAYER ID="currentLayer" ABOVE="referencedLayer">
указывает на то, что слой currentLayer должен находиться ниже слоя
referencedLayer.

П р и м е р применения атриб)тов ABOVE и BELOW приведен в листинге 5.11. Внеш­


ний вид документа показан на рис. 5.10.
5 . 1 2 . Слои 169

Л и с т и н г 5 . 1 1 . Использование атрибутов ABOVE И BELOW

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Using ABOVE and BELOW</TITLE>
</HEAD>
<BODY>
<Hl>Using <CODE>ABOVE</CODE> and <C0DE>BEL0W</C0DE></H1>

<LAYER ID="Top" LEFT=60 TOP=120


WIDTH=500 HEIGHT=100 BGCOLOR="#F5DEB3">
This layer is on top, even though it appears
first in the HTML document.
</LAYER>

<LAYER ID="Bottom" ABOVE="Top" LEFT=10 TOP=70


WIDTH=500 HEIGHT=100 BGCOLOR="gray">
This layer is on the bottom, even though it appears
second in the HTML document.
</LAYER>

</BODY>
</HTML>

f ж Using ABOVE a n d BELOW - NetsGdf№ . .:.." :u^:-:'-^~-:,.<M^'Z^:'^^i^ ШШШ


File £cW ^(ew £ 0 £ommwrec«*o» Н Ф

:•'; ^' ~>r "'S rft *5^»> ^ -S ^ Q Ш Si\


Using ABOVE and BELOW

1 •1|дВ"'"'^<^ layer is on top, even thougii it appears first in Йхе HTML docTjment

IQI* -*.• ;DOGUrf»rtt D o n e ..„: ,:.^^*-,.. ...,. .,,i~ .:^:......, ^Я.: ^лШ-Ш
Рис. 5.10. А т р и б у т ы ABOVE, BELOW И Z - I N D E X ПОЗВОЛЯЮТ
изменять порядок следования слоев

BACKGROUND, BGCOLOR
По умолчанию слои создаются прозрачными. Ч т о б ы сделать слой непрозрачным,
надо задать ф о н о в о е изображение или цвет фона. Так, в предыдущем примере
(листинг 5.10 и рис. 5.10) с помощью атрибута BGCOLOR определялся цвет ф о н а для
каждого слоя. Если атрибут BGCOLOR задает н е п р о з р а ч н ы й ф о н , атрибут
BACKGROUND может использоваться для создания частично прозрачного фона, для
этого в качестве фонового должно быть задано п р о з р а ч н о е GIF-изображение.
170 Глава 5. К а с к а д н ы е листы с т и л е й

CLIP
Значением данного атрибута является набор целых чисел, разделенных запятыми,
которые определяют размеры области, занимаемой слоем. H T M L воспроизводит
всю область, но часть слоя может быть отсечена при выводе. Размеры задаются в
формате ''левая_граница, верхняя_граниг1,а, правая_граница, нижняя_грапица' либо в
формате ''правая_граница, нижняя_граница\ Последняя запись эквивалента "О, О,
правая_граниг^а, нижпяя_граница\

WIDTH, HEIGHT
Д а н н ы е атрибуты задают минимальную ширину и высоту слоя. Если атрибуты
WIDTH и HEIGHT не указаны, ширина и высота определяется содержимым слоя.
Заметьте, что WIDTH и HEIGHT — не максимальные, а минимальные размеры. П р и
необходимости ширина и высота увеличиваются, чтобы требуемая и н ф о р м а ц и я
могла разместиться в пределах области. В примере, приведенном в листинге 5.11 и
на рис. 5.10, атрибуты WIDTH и HEIGHT задавали размеры слоев.

ID
Данный атрибут присваивает слою имя. Это имя может быть использовано в качест­
ве значения атрибутов ABOVE и BELOW либо при выполнении сценария JavaScript.

LEFT, T O P , PAGEX, PAGEY


Для слоев, определенных посредством элемента LAYER, данные атрибуты указы­
вают позицию относительно включающего слоя (LEFT, ТОР) либо относительно
всей Web-страницы (PAGEX, PAGEY). Значения атрибутов задаются в пикселях. Ес­
ли эти атрибуты не указаны, слой располагается в текущей позиции на Web-
странице. В примере, приведенном в листинге 5.11 и на рис. 5.10, атрибуты LEFT и
ТОР использовались для определения позиции слоев.
Для встроенных слоев (ILAYER) значения атрибутов LEFT и ТОР задаются относи­
тельно текущей позиции на Web-странице. В листинге 5.12 атрибут ТОР использу­
ется для размещения каждого слова из предложения "Gently down the stream" ниже
предыдущего слова. Внешний вид документа показан на рис 5.11.

Л и с т и н г 5.12. Использование атрибута ТОР элемента I L A Y E R

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 . 0 T r a n s i t i o n a l / / E N " >


<HTML>
<HEAD>
<TITLE>Row, Row, Row Your Boat</TITLE>
</HEAD>
<BODY>
<IMG S R C = " i m a g e s / R o w b o a t . g i f " ALIGN="RIGHT">
<HR>
<B>Row, Row, Row Your Boat</B><BR>
Row, row, row y o u r boat<BR>
Gently
<ILAYER TOP=10>down</ILAYER>
<ILAYER TOP=20>the</ILAYER>
<ILAYER TOP=30>streain<BR>
5-12. Слои 171

Merrily, merrily, merrily, merrily<BR>


Life is but a dream<BR>
<HR>
</ILAYER>
</BODY>
</HTML>

te4iHHitHiffil'ff1 РШ11
£fe £cft ^lew fio £omfnunical« Цв^

шш^т^?^ ill *^- A ^^'-.if-

Row, Row, Row Your Boat


Row, row, row your boat
Gently
down
the
stream
Memly, memly, memly, merrily
Life IS but a dream

Рис. 5.11. Атрибут TOP элемента i LAYER позволяет перемещать


слова вверх и вниз в пределах текущего абзаца

SRC
Д а н н ы й атрибут задает URL HTML-документа, который должен быть помещен в
указанный слой. Если в документе также определены слои, они рассматриваются
как д о ч е р н и е по отношению к текущему слою. Описанная возможность полезна в
тех случаях, когда необходимо включить фрагмент HTML-кода в несколько доку­
ментов, а также при поддержке Web-страницы, основная часть которой остается
неизменной, а один небольшой фрагмент часто изменяется. Так, например, вы
можете включить контактную и н ф о р м а ц и ю в состав Web-страницы, поместив вы­
ражение <LAYER S R C = " C o n t a c t - I n f o . h t m l " > < / L A Y E R > непосредственно пе­
ред закрывающим дескриптором </BODY>. Для включения в статический документ
динамически изменяющегося фрагмента можно использовать следующий фраг­
мент кода:
<Hl>Menu f o r J o e ' s D i n e r < / H l >
<ILAYER S R C = " B l u e - P l a t e - S p e c i a l . h t m l " > < / I L A Y E R >
<H2>Appetizers</H2> . . .
<H2>Main D i s h e s < / H 2 > . . .
<H2>Vegetables</H2> . . .

VISIBILITY
Д а н н ы й атрибут задает видимость слоя, т.е. определяет, должен ли слой отобра­
жаться в окне броузера. Допустимыми значениями являются SHOW, INHERIT и
HIDDEN. З н а ч е н и е SHOW указывает на то, что слой должен отображаться, значение
INHERIT устанавливает видимость слоя равной видимости родительского слоя, а
значение HIDDEN запрещает отображение. Скрытые слои трудно применять на
172 Глава 5. Каскадные листы стилей

статических Web-страницах, однако возможность запретить или разрешить ото­


бражение слоя можно использовать при создании JavaScript-сценариев.

ONBLUR, ONFOCUS, ONLOAD, ONMOUSEOVER, O N M O U S E O U T


Данные атрибуты задают JavaScript-код, выполняющийся при наступлении опре­
деленных событий. Дополнительную и н ф о р м а ц и ю по этому вопросу вы найдете в
главе 24.

Работа со слоями посредством листов стилей


Листы стилей поддерживают большинство возможностей (но не все), предостав­
ляемых элементами LAYER и ILAYER. Листы стилей не позволяют задавать с помощью
атрибута SRC внешний файл, кроме того, в листах стилей отсутствуют атрибуты, анало­
гичные PAGEX и PAGEY, посредством которых можно было бы размещать дочерние слои
независимо от расположения родительского слоя. Однако Netscape 4 обеспечивает бо­
лее полную поддержку средств работы со слоями посредством листов стилей и позволя­
ет добиться большей надежности по сравнению с использованием элементов LAYER и
ILAYER. Например, если цвет ф о н а для слоя задается с помощью листов стилей, ф о н
нижележащего слоя или Web-страницы виден на границе между абзацами, т.е. фоновые
изображения ведут себя так, как этого и следует ожидать. Заметьте также, что из
Netscape 6 удалены средства поддержки элементов LAYER и ILAYER. П р и работе со
слоями посредством листов стилей поддерживается позиционирование с использова­
нием стандартных единиц длины. Кроме того, соответствующие средства листов стилей
поддерживают как Netscape, так и Internet Explorer, что дает возможность создавать до­
кументы со слоями, которые корректно отображаются в обоих броузерах.
Слои должны описываться либо в заголовке с использованием идентификаторов,
определенных пользователем, либо в составе элемента, например <DIV STYLE=" . . . ">
(блоковый уровень) или <SPAN STYLE=". . . "> (текстовый уровень). П р и определе­
нии слоя должно задаваться свойство p o s i t i o n . Например, правило
#1ауег1 { p o s i t i o n : absolutes-
l e f t : 50рх; t o p : 7 5рх;
. . . }

примененное в элементе
<SPAN I D = " l a y e r l " >

</SPAN>
почти эквивалентно следующему выражению:
<LAYER I D = " l a y e r l " LEFT=50 ТОР=75 ...>

</LAYER>
Аналогично, правило
#1ауег2 { position: relative;
t o p : lOpx;
... }
5.12. Слои 173

примененное в элементе
<SPAN I D = " l a y e r 2 " >

</SPAN>
почти эквивалентно элементу, приведенному ниже.
<ILAYER I D = " l a y e r 2 " ТОР=10 ...>

</ILAYER>
В дополнение к стандартным атрибутам, допустимым в CSS1, при работе со слоями
поддерживаются следующие атрибуты.

clip
З н а ч е н и е данного атрибута задается в виде прямоугольной области, т.е. с помо­
щью выражения гect {верхняя_граница, правая_граница, нижпяя_грапица, ле-
вая_граница) либо с помощью ключевого слова a u t o (по умолчанию). Свойство
c l i p эквивалентно атрибуту CLIP элементов LAYER и ILAYER. Заметьте, что раз­
меры области, как и все другие величины, связанные с позиционированием слоев,
задаются с помощью стандартных единиц длины CSS. Помимо пикселей, исполь­
зуемых в LAYER и ILAYER, могут быть заданы пункты, дюймы и сантиметры.

left, t o p
Д а н н ы е свойства определяют верхний левый угол слоя в стандартных единицах
длины CSS. Эти свойства эквивалентны атрибутам LEFT и ТОР элементов LAYER и
ILAYER.

overflow
Д а н н о е свойство определяет поведение слоя в том случае, когда содержимое эле­
мента превышает высоту или ширину слоя. Значение попе (по умолчанию) указы­
вает на то, что содержимое должно отображаться обычным способом. З н а ч е н и е
c l i p задает отсечение, а значение s c r o l l указывает на то, что броузер должен
выполнить прокрутку, чтобы вместить содержимое.

position
Д а н н о е свойство может приобретать значения a b s o l u t e , r e l a t i v e и s t a t i c .
Эти значения соответствуют элементу LAYER, элементу ILAYER и обычным эле­
ментам, для которых не используются слои. П о умолчанию принимается значение
static.

visibility
Д а н н о е свойство определяет, должен ли слой быть видимым или скрытым. Допус­
тимыми значениями являются v i s i b l e , h i d d e n и i n h e r i t . Они соответствуют
нормально отображаемому элементу, скрытому элементу или элементу, наследую­
щему видимость родительского элемента. Д а н н о е свойство может использоваться
при динамическом о т о б р а ж е н и и элементов посредством JavaScript-сценариев.
174 Глава 5. Каскадные листы стилей

Подробно JavaScript-сценарии будут описаны в главе 24. В листинге 5.13 представ­


лен код простой Web-страницы, в которую включена форма, содержащая две
кнопки. Под кнопками расположены две невидимые области. Внешний вид Web-
страницы представлен на рис. 5.12. При активизации левой кнопки отображается
первый скрытый слой (рис. 5.13), а отображение второго слоя, если это необхо­
димо, запрещается. Модель документа в Internet Explorer и Netscape отличается,
поэтому для обеспечения межплатформенной совместимости добавлена вспомо­
гательная JavaScript-функция d i s p l a y .

Листинг 5.13. Динамическое изменение видимости слоев

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>Changing Visibility Dynamically</TITLE>
<STYLE>
<! —
#layerl { position: absolute; left: 0.25in; top: 1.5in;
color: black; background-color: #F5DEB3;
visibility: hidden }
#layer2 { position: absolute; left: 0.25in; top: l.Sin;
color: #F5DEB3; background-color: black;
visibility: hidden }
HI { text-align: center;
font-family: Arial }
FORM { text-align: center }
-->
</STYLE>
<SCRIPT TYPE="text/javascript">
<! —
function display(valuel,value2){
if(document.layers) { // Проверка для Netscape,
document.layers.layerl.visibility = valuel;
document.layers.Iayer2.visibility = value2;
} else {
document.all.layerl.style.visibility = valuel;
document.all.Iayer2.style.visibility = value2;
}
}
// — >
</SCRIPT>
</HEAD>
<BODY BGCOLOR="WHITE">
<Hl>Changing Visibility Dynamically</Hl>
<FORM>
<INPUT TYPE="BUTTON" VALUE="Show Layerl"
onClick=!"display('visible' , 'hidden') ">
<INPUT TYPE="BUTTON" VALUE="Show Layer2"
onClick="display('hidden','visible')">
</FORM>
<DIV ID="layerl">
<Hl>This is layerl.</Hl>
</DIV>
5.12. Слои 175

<DIV ID="layer2">
<Hl>This is Iayer2.</Hl>
</DIV>
</BODY>
</HTML>

' Changing visflbitily DfnanwcMiy - Nel«cepe


file £dit VJaw До £omniur«ceJ£3r М Ф
Eaai

Changing Visibility
Dynamically

^!^:^^r "" ^С^ал*и!*"б'о»»Щ

Рис. 5.12. Web-страница, содержащая JavaScript-сце-


нарий и два скрытых слоя

Changing Visibility
Dynamically

This is layeM.
^д^-^ =»jl^.- <

Рис. 5. УЗ. При активизации кнопки отображается скры­


тый слой

width, height
Д а н н ы е свойства определяют размеры слоев. О н и выполняют те же функции, что
атрибуты WIDTH и HEIGHT элементов LAYER и ILAYER.

z-index
В о б ы ч н ы х условиях слои располагаются один над другим в том порядке, в кото­
ром они встречаются в HTML-документе. Свойство z - i n d e x изменяет порядок
следования слоев. Значением свойства является целое число, определяющее но­
мер слоя. Слои с меньшими номерами располагаются ниже слоев с большими но­
мерами. Данное свойство эквивалентно атрибуту Z-INDEX элементов LAYER и
ILAYER.
176 Глава 5. Каскадные листы стилей

5.13. Резюме
Каскадные листы стилей представляют собой мощный инструмент форматирова­
ния Web-страниц. П р и работе с документами H T M L 4.0 листы стилей предпочтитель­
нее др)тих средств. Листы стилей позволяют задавать ш р и ф т ы , цвет ф о н а и изобра­
жения для различных разделов текста, определять плавающие элементы, границы и
отступы. Листы стилей также дают возможность ф о р м а т и р о в а т ь списки. Помимо но­
вых возможностей, связанных с выводом текста, каскадные листы стилей позволяют
добиться, чтобы документ имел одинаковый вид в различных броузерах. Благодаря
использованию листов стилей достигается однотипная обработка слоев в Netscape и
Internet Explorer.
Несмотря на обилие возможностей, H T M L все же представляет собой не язык
программирования, а язык разметки, поэтому набор приложений, которые могут
быть созданы посредством HTML, ограничен. Язык Java позволяет создавать про­
граммы, которые включаются в состав Web-страниц и выполняются в среде броузера.
Сфера применения Java не исчерпывается программами, работающими в составе
Web-страниц. Java представляет собой язык программирования общего назначения.
Рассмотрению Java-технологии посвящена часть II данной книги.
-JlEJS^-.

ПРОГРАММИ­
РОВАНИЕ
НА ЯЗЫКЕ JAVA
Глава 6. Общие сведения о языке Java
Глава 7. Объектно-ориентированное программирование на Java
Глава 8. Синтаксис Java
Глава 9. Аплеты и основные действия с графикой
Глава 10. Java 2D: графика в Java 2
Глава 11. События, связанные с мышью и клавиатурой
Глава 12. Диспетчеры компоновки
Глава 13. КомпонентыAWT
Глава 14. Основы Swing
Глава 15. Расширенные средства Swing
Глава 16. Использование потоков
Глава 17. Сетевое программирование
ОБЩИЕ СВЕДЕНИЯ
О ЯЗЫКЕ JAVA

В ЭТОЙ главе...

• Уникальные возможности Java. Средства,


предоставляемые разработчикам.
• Java: мифы и реальность.
• Этапы развития Java.
• Программное обеспечение и документация,
необходимые для работы.
• Компиляция и запуск Java-программы.
• Примеры простых Java-программ.
U~y\zJsJ:EJ

ava— это язык программирования, во многом напоминающий C++. Java использует­

J ся для написания приложений общего назначения, для создания программ, вклю­


чаемых в состав WWW-страниц, а также для построения корпоративных приложе­
ний и организации узлов электронной коммерции. Об этом языке положительно от­
зываются как программисты, так и администраторы систем. Компании IBM и Oracle
уделяют Java настолько большое внимание, что первым шагом участия в программе
Enterprise Developer является получение сертификата (см. h t t p : //www-4 . i b m . com/
software/ad/certify/adedserv.html
и http://education.oracle.com/ c e r t i f i c a t i o n / j avatrack.html).
Популярность Java обусловлена следующими причинами.

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


действие с Web.
• Наличие кроссплатформенной поддержки.
• Простота языка.
• Поддержка объектно-ориентированных средств.
• Наличие большого количества стандартных библиотек.
Поскольку Java-программы могут выполняться в среде Windows и обеспечивают
автоматическую "сборку мусора", н е к о т о р ы е энтузиасты утверждают, что Java— это
"единственный язык", на который должны перевести свои приложения все програм­
мисты. Скептики критикуют Java за недостатки, однако при беспристрастном рас­
смотрении становится ясно, что эти недостатки надуманы, или, по крайней мере,
преувеличены. Одним из таких заблуждений является утверждение, будто язык Java
предназначен только для Web.
Если вы еще не решили, какая версия Java более всего удовлетворяет вашим нуж­
дам, далее в этой главе будут рассмотрены различия между реализациями данного
языка. Если по каким-то причинам на вашем компьютере еще не установлен Java, про-
180 Глава 6. Общие сведения о языке Java

читав эту главу, вы узнаете, где можно найти необходимое программное обеспечение
и документацию. Наконец, в этой главе будут приведены п р и м е р ы простых программ,
которые помогут вам начать изучение Java.
Если вы считаете Java аббревиатурой, вы ошибаетесь. Дело в том, что в Америке
слово "Java" — почти синоним слова "кофе". Этим названием компания Sun заменила
имя Oak, которое конфликтовало с существующим продуктом. Со словом Java ассо­
циируется нечто тонизирующее и стимулирующее к работе.

6 . 1 . Возможности Java
Как бы восторженно ни отзывались разработчики о Java, его нельзя считать уни­
кальным. Действительно, хотя Java — прекрасный язык, он никак не является набором
гениальных решений, которые никогда не встречались прежде. Многие решения уже
были реализованы в других языках. Однако в Java были объединены стандартные вы­
разительные средства (синтаксис C/C++), богатые возможности проблемно-
ориентированных языков (автоматическое управление памятью и интерпретация
байтового кода) и набор API для разработки корпоративных систем. В последующих
разделах описаны некоторые наиболее важные характеристики Java.

Средства сетевого взаимодействия и работа в Web


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

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


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

Доставка п р о г р а м м н о г о о б е с п е ч е н и я ч е р е з Web
Java-аплеты поддерживаются в большинстве реализаций Netscape и Internet
Explorer, следовательно, могут выполняться практически в любой из существую­
щих операционных систем. Использование аплетов становится причиной рас­
смотрения броузера не только как программы, предназначенной для копирования
и отображения документа, но также как среды доставки и выполнения программ­
ного кода. Теперь, если вы работаете с приложением, которое подвергается час­
тым модификациям, у вас нет необходимости следить за выходом новой версии
программы и устанавливать ее. П о существу, вам не надо ничего инсталлировать,
достаточно создать в броузере закладку на Web-страницу, содержащую требуемый
6 . 1 . Возможности Java 181

аплет. Таким образом, обновление версий программы перестает быть обязанно­


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

Рис. 6.1. Аплет, разработаннь1й NASA, который отображает текущее


состояние телескопа

Простота применения сетевой библиотеки Java


Сетевгш библиотека Java используется приблизительно одинаково во всех опера­
ционных системах. Благодаря простоте сетевых средств появилась возможность
отказаться от инструментов типа мастер. Создание сетевого соединения на сторо­
не клиента или на стороне сервера в Java происходит значительно проще по срав­
нению с гнездами Berkeley или POSIX Transport Layer Interface. Кроме того, Java
поддерживает протокол HTTP, позволяя копировать файлы из Web и обращаться
к HTTP, не создавая непосредственно гнезд. На рис. 6.2 показан аплет, реализую-
182 Глава 6. Общие сведения о языке Java

щий Web-интерфейс для настройки портов Ethernet-коммутатора Cisco Catalyst


6000. HTTP-сервер, выполняющийся на коммутаторе Catalyst, позволяет конфигу­
рировать устройство посредством броузера, не прибегая к инструкциям, задавае­
мым из командной строки.

Рис. 6.2, Аплет Cisco OpenView, предназначенный для настройки Ethernet-коммутатора


Catalyst 6000 (данный материал опубликован с разрешения Cisco Systems, Inc.)
6 . 1 . Возможности Java 183

Наличие средств для разработки корпоративных систем


Начиная с 1995 г. компания Sun предлагает многочисленные библиотеки и расши­
р е н и я Java, предназначенные для реализации решений уровня предприятия. Java
поддерживает средства RMI (Remote Method Invocation — вызов удаленных мето­
дов), позволяющие обращаться к методам объектов, размещающихся на удаленных
узлах. RMI также дает возможность передавать произвольные Java-объекты по се­
ти. Пользуясь механизмом Java-сервлетов, можно создавать приложения, выпол­
няющиеся на стороне сервера, и создавать объекты сеанса для отслеживания по­
следовательных обращений одного и того же пользователя к приложению. JDBC
обеспечивает стандартный и н т е р ф е й с с различными базами данных и позволяет
аплетам и сервлетам обращаться к базам, минуя и н т е р ф е й с ы CGI. К о м п о н е н т ы En­
terprise JavaBeans, доступные из сервлетов и JavaServer Pages, дают возможность
реализовывать бизнес-логику в многосвязной архитектуре.

Кроссплатформенная поддержка Java


Язык Java с самого начала разрабатывался так, чтобы программы, написанные на
нем, были полностью переносимыми, т.е. могли без изменений быть запущены на
любой платформе. Каким образом эта задача была решена? Переносимость Java обес­
печивается тремя основными особенностями данного языка.
И с х о д н ы й т е к с т Java компилируется в машинно-независимый б а й т о в ы й к о д
Процесс компиляции и выполнения Java-программ состоит из двух этапов. Н а пер­
вом этапе исходный код Java компилируется в байтовый код, предназначенный для
выполнения на абстрактной виртуальной машине Java (JVM — Java Virtual
Machine). H a втором этапе Java-код запускается в среде выполнения. Среда выпол­
нения представляет собой либо и н т е р п р е т а т о р (эмулятор JVM), либо компилятор
J I T (Just In T i m e ) , который сначала преобразует байтовый код в исполняемую про­
грамму для конкретной архитектуры, а затем запускает ее на выполнение. Основ­
ное преимущество данного процесса состоит в том, что описанные этапы могут
выполняться на различных платформах. Исходный код может быть скомпилиро­
ван с помощью компилятора Borland на машине под управлением Windows 2000, а
полученный байтовый код запущен на Macintosh в среде выполнения, разработан­
ной Apple, либо на Solaris в среде выполнения, созданной Sun. В качестве примера
на рис. 6.3 представлен кроссплатформенный пакет подготовки документов
StarOffice, к о т о р ы й может выполняться в системах Windows, Solaris и Linux.
В большинстве современных Web-броузеров реализована виртуальная машина
Java, что позволяет авторам Web-страниц включать в них байтовый код аплетов.

Java п р е д о с т а в л я е т п е р е н о с и м у ю г р а ф и ч е с к у ю б и б л и о т е к у
Главным фактором, препятствующим переносимости большинства программных
систем, является пользовательский и н т е р ф е й с . Многие разработчики предпочи­
тают стандартным кроссплатформенным графическим средствам оконную систе­
му, ориентированную на конкретную платформу. Следуя подобному подходу, при
переходе на другую платформу компоненты программы, реализующие пользова­
тельский и н т е р ф е й с , приходится переписывать заново. Создатели Java исходили
из того, что переносимый язык должен включать стандартную графическую биб­
лиотеку, поэтому в реализацию Java компания Sun Microsystems включила AWT
184 Глава 6. Общие сведения о языке Java

(Abstract Window Toolkit — инструмент для реализации абстрактных оконных сис­


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

l i ^ S t a r t t f T t c e S ^ -iLrofiS-LanauaQedtittii:.-:;" ^ ':г ^:^'v'' '#::';'V/::':<riiwi:iKyH^^^^^B


1 Е«е EdK i^iew [rwert 'F^mA loots Cata ЙЗгккм» tNp
A i „ . B. _ 1 С D . . i _ E F . [ .<3. ..J „ H ^

JHU/APL T N O / U T w e n t e IRIT U Tampere CWI


0 0 68 0 58 0 62 0 68 0 5
0 1 0 63 0 51 0 46 0 53 0 41
V -А J 0 2 0 54 0 47 0 43 0 43 0 32

ш 76 ^\ 0 3
0 4
0 51
0 47
0 41
0 36
0 38
0 33
0 33
0 28
0 29
0 25
8 0 5 0 43 0 32 0 32 0 26 0 23
06 0 37 026 0 22 0 19 02
__ 9 _ 0 7 0 33 0 22 0 19 0 16 0 16
08 03 021 0.18 0 13 0.13
~ii"' 0.9 0.2 0.14 0.12 0.1 0.1
1 n^6 0 1 0.08 0.07 0.08
; ;М
' 13 1
И ;

; ; '^z
А Cross Language Retrieval
'• Z
г,; ""А liil \ JHU/APL
19 "чХц^
: В^ ' ^ , TNO/UTwente
" 20 0.6-
VIRIT
21
Ч UTartpere
0 5-
''^CWI

O 0.4-
О

2 03-
29'1
30
02-
31

__33j 0 1-

()

л
IMI 0.1 0.2 0.3 0,4 05 06 0.7 0.8 0.9

37 Recall

3%ii: f \ S h e e t i y Sheet2 / S h e e t s / '

М^^ J M l^lCross-Lang... if*


h2:36PM

Рис. 6.3. Кроссплатформенный пакет StarOffice 5.2, предназначенный


для обработки документов, полностью реализован на Java. StarOffice"^^
является зарегистрированной торговой маркой Sun Microsystems, Inc.

Реализуя платформу Java 2, Sun включила в ее состав Swing— графический пакет,


обеспечивающий большие возможности по сравнению с AWT и позволяющий соз­
давать высококачественные пользовательские и н т е р ф е й с ы . Swing рекомендуется
использовать при разработке графических программ за исключением аплетов,
включаемых в Web-страницы. П р и ч и н а в том, что непосредственную поддержку
Swing обеспечивает только Netscape 6. В других версиях Netscape и Internet
Explorer для этой цели приходится устанавливать дополнительные модули.
На рис. 6.4 показан графический пользовательский и н т е р ф е й с аплета, разрабо­
танный NASA. П р и ч и н о й создания этого аплета явилась необходимость предос­
тавления данных аппарата Pathfinder большому числу пользователей, работающих
на разных платформах.
6 . 1 . Возможности Java 185

|^ЩД|ЩД| H^joixil

_J__T ^

;^^Ш)^
~^чй

. ;-|3
v'^^.o>2t3isyT^>y^.:'?^^"^^^^^^
P^»»#Btfe^v#^^ "^v;>;- :-:л;;Г^Й=^^:;^|

m^\ nl4Q||¥®|ffl|^|Al
Rovef:|fOcky7 3 Оа1в:[и^?1 3 Cyde;[l 3 Map:|Eteve(ion 3

Рис. 6.4. Web-интерфейс,


разработанный Jet Propulsion
Lab и используемый для
Pointer Kicxfc отображения данных Mars
Pathfinder
В Java о т с у т с т в у ю т я з ы к о в ы е к о н с т р у к ц и и , с о з д а ю щ и е т р у д н о с т и
при переносе программ
В спецификации Java строго определены размеры простых типов данных, таких
как i n t , b o o l e a n и d o u b l e . Этим Java отличается от большинства других языков,
в которых размеры типов данных зависят от конкретной платформы. Java-прог­
раммы также не зависят от деталей реализации объектов, например от размеще­
ния элементов внутри объекта или от объема используемой памяти (в Java нет не­
обходимости в применении оператора s i z e o f , присутствующего в С/С+-ь). В Java
даже отсутствуют ссылки на локальную файловую систему, вместо этого использу­
ются такие абстрактные понятия, как имена классов и имена пакетов.
186 Глава 6. Общие сведения о языке Java

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

Автоматическое управление памятью


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

Автоматическая п о д д е р ж к а указателей
Если вы передаете Java-функции объект (данные, не принадлежащие к простым
типам), система реально передает указатель или ссылку на этот объект. Это озна­
чает, что в стек записывается не сам объект, а ссылка на него. Все детали этого
процесса скрыты от пользователя; с его точки зрения создается впечатление, что
объект непосредственно передается функции. Создавая программы на Java, у вас
нет необходимости присваивать значения указателям, более того, непосредствен­
ные действия с указателями запрещены. Программист может не думать об указате­
лях, а сосредоточить свое внимание на структуре классов. Несмотря на то что
операции с указателями не допускаются, действия, основанные на указателях, на­
пример создание связных списков и деревьев, без труда реализуются средствами
Java. Описанный подход может показаться странным для программистов, рабо­
тающих на C/C++, однако он успешно зарекомендовал себя в десятках языков, та­
ких как Smalltalk и Lisp.

Объектно-ориентированные средства Java


Java представляет собой объектно-ориентироавнный язык. "Слишком уж объект­
ный", — добавят н е к о т о р ы е пользователи.

Все функции связаны с объектами


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

Практически все типы данных являются объектами


В некоторых объектно-ориентированных языках не все т и п ы данных представля­
ют собой классы. Строки, массивы, структуры, файлы, гнезда и другие типы не
6 . 1 . Возможности Java 187

обязательно являются объектами и их обработка может отличаться от обработки


объектов, определенных пользователем. В Java, напротив, все сложные т и п ы дан­
ных— это объекты, имеющие общего "предка"— класс O b j e c t . Такой подход по­
зволяет создавать массивы и другие наборы, состоящие из разнородных т и п о в
данных. Поскольку в Java существуют также простые типы данных ( i n t , d o u b l e ,
b o o l e a n , c h a r и т.д.), для удобства работы с ними созданы своеобразные
"оболочки" — объекты I n t e g e r , D o u b l e , B o o l e a n , C h a r a c t e r и т.д. П р о с т ы е ти­
пы могут быть преобразованы в объекты путем вызова специальных методов.

Стандартные библиотеки Java


Помимо библиотек, предназначенных для создания графических и н т е р ф е й с о в и
организации взаимодействия " к л и е н т / с е р в е р " , в распоряжение разработчика про­
грамм на Java предоставляются библиотеки, к о т о р ы е позволяют выполнять следую­
щие задачи:

• создавать структуры данных и использовать их;


• выполнять различные действия со строками и потоками;
• сохранять объекты (в том числе графические) на диске для последующего их
восстановления;
• использовать числа с ф и к с и р о в а н н о й точкой произвольной точности;
• вызывать удаленные Java-объекты;
• взаимодействовать с реляционными базами данных;
• организовать многопотоковые вычисления.
Наличие большого количества Java-библиотек позволят создавать п р и л о ж е н и я на
Java, не используя библиотек, специфических для конкретной о п е р а ц и о н н о й систе­
мы. П р и м е р такого приложения приведен на рис. 6.5.
Обилие встроенных средств не всегда однозначно воспринимается как положи­
тельное явление. С одной стропы, большое количество стандартных инструментов,
обеспечивающих переносимость, позволяет выбрать библиотеки, необходимые для
конкретного приложения. С другой с т о р о н ы , объем сведений о Java в целом настоль­
ко велик, что перспектива изучить соответствующие средства может испугать начи­
нающего программиста. К счастью, нет никакой необходимости изучать все возмож­
ности Java. Следует лишь освоить порядок создания и использования объектов (см.
главу 7), а также разобраться в основных языковых конструкциях (см. главу 8). Ос­
тальные разделы Java практически независимы один от другого. Поскольку классы
Java подгружаются динамически, объем исполняемой системы Java и скомпилирован­
ных классов не зависит от объема средств поддержки данного языка. Ч т о б ы добиться
успеха в написании программ определенного типа, нет необходимости изучать все
особенности Java. Если вы собираетесь разработать сервер, вам не обязательно знать
средства создания пользовательского интерфейса, поэтому вы можете отложить изу­
чение AWT (глава 13) и Swing (главы 14 и 15) до тех пор, пока соответствующие сред­
ства действительно не потребуются вам. Аналогично, если вы создаете о б ы ч н ы й ап-
лет, вам не понадобятся сведения об организации сетевого взаимодействия. Присту-
188 Глава 6. Общие сведения о языке Java

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

Н'НТДРДВ!

'~&ш <2ащт'^0тщг$^^Ш: ;^М±шМЁйШ^^1^<


http //md dmso mil/melb(n/iava_query
~вц 3
??>f|%vlgj;?S:-.|;p^|j^
Mijipp!i(iH|irtii>jffMiij?i »»'€'l*?i!iigWS^SW

J96.48 (W 3|23.039

WmaitJmjm X RentMTalH.

j^fe^^^^^Ei
ClicK to start йешш a ieeioti.

ir^
;^App$et3tdrtsd \^i г.ГТЧт'ь^'^ •
Рис. 6.5. Java-интерфейс к Master Environmental Library ( M E L ) ~ биб­
лиотеке для получения географических данных. Java-аплет предостав­
ляет описание выбранной области

6.2. Java: мифы и реальность


Когда Java впервые заявил о себе в 1995 г., многие скоропалительные выводы о ха­
рактере этого языка оказались ложными. Поскольку неверные представления об осо­
бенностях Java до сих пор имеют место, целесообразно посвятить раздел данной гла­
вы их опровержению.
6.2. Java: мифы и реальность 189

Java предназначен исключительно для Web


с р а з у после появления Java на рынке программ возникли оживленные дискуссии
вокруг создания и использования Java-аплетов. Очевидно, что Java-аплеты включают­
ся в состав Web-страниц, тем не менее, с ф е р а применения Java не ограничивается
Web. Java представляет собой многоцелевой язык, с помощью которого можно, на­
пример, реализовать драйвер для цветного п р и н т е р а или программу для численного
интегрирования, не имеющие никакого о т н о ш е н и я к Internet. Конечно же, Java оста­
ется одним из основных языков Internet-программирования. Возможность взаимо­
действия с базами данных, средства создания сервлетов, Enterprise JavaBeans и Java-
Messaging обусловливают выбор Java для решения конкретных задач. Однако с увели­
чением распределенных приложений и программ, предназначенных для обеспечения
взаимодействия бизнес-бизнес, растет число применений Java, не связанных либо
частично связанных с Web. Поэтому не следует думать, что язык Java предназначен
исключительно для Web.

Кроссплатформенная поддержка Java


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

J a v a - п р и л о ж е н и я могут о б р а щ а т ь с я к л о к а л ь н ы м , н е п е р е н о с и м ы м
программам
Метод e x e c класса R u n t i m e позволяет Java-приложениям вызывать локальные
программы. Кроме того, платформенно-зависимый и н т е р ф е й с дает возможность
объединять программы, написанные на Java и С. Вызов локальных п р и л о ж е н и й
делает Java-программы полностью непереносимыми, а объединение с программа­
ми на С обеспечивает переносимость в той мере, в которой ее позволяют реализо­
вать связанные программы на С. Поэтому справедливо будет утверждать, что при­
л о ж е н и е на Java непереносимо лишь потому, что непереносима связанная с ней
программа. Однако такие приложения уже нельзя рассматривать как "чистые" Java-
программы. Несмотря на то что при написании ряда программ удастся избежать
обращения к платформенно-зависимым компонентам, в некоторых случаях необ­
ходимо форматировать диск, получать сведения о пользователях, зарегистриро­
ванных в системе, либо организовать взаимодействие с существующими приложе­
ниями, написанными на С или C++. Н е следует думать, что платформенно-
зависимых операций или взаимодействия с существующими компонентами надо
избегать. Напротив, возможность обращения к локальным средствам часто бывает
важнее переносимости. Плохо, если разработчик при создании программы не от­
дает себе отчет в том, что на определенном этапе она перестала быть переноси­
мой. Поэтому, используя библиотеки независимых производителей, будьте осто­
р о ж н ы и старайтесь выяснить, какая часть библиотеки представляет собой
"чистые" Java-средства, а какая часть зависит от платформы.
190 Глава 6. Общие сведения о языке Java

Поведение планировщика потоков не всегда предсказуемо


Java предоставляет одну из лучших на сегодняшний день библиотек, предназначен­
ных для работы с потоками. Независимые части программы могут выполняться как
разные потоки. Однако описания некоторых особенностей взаимодействия потоков
допускают определенную свободу интерпретации. Например, никто не может пред­
сказать, сколько времени будет выполняться конкретный поток, перед тем как
управление будет передано другому потоку. Можно лишь утверждать, что этот пока­
затель будет изменяться при переходе от одной системы к другой и даже при раз­
личных запусках программы на одной и той же машине. С определенной точки зре­
ния такая недетерминированность может рассматриваться как преимущество ис­
пользования потоков, однако она создает определенные трудности для разработ­
чиков программ. Если выполнение вашей программы существенно зависит от при­
оритета потоков или от процедуры передачи управления между потоками, ее нельзя
переносить с одной платформы на другую. В системах Solaris, Windows NT, и
Macintosh используются различные алгоритмы планирования потоков и различная
структура приоритетов потоков. Поэтому, приступая к написанию многопотоковых
программ на Java, начинайте распространять продукт лишь после тщательного тес­
тирования на всех платформах, для которых он предназначен.

Графические библиотеки могут вести себя по-разному в различных системах


В первых реализациях Java разработчики приняли решение о том, что внешний вид
графических элементов должен по возможности совпадать с внешним видом эле­
ментов локальной оконной системы. Такой подход был во многом оправдан, по­
скольку, например, пользователи Macintosh категорически отказывались работать с
приложениями, предоставляющими интерфейс, типичный для Windows 2000. Одна­
ко оформление интерфейсных элементов Abstract Window Toolkit в стиле текущей
операционной системы привело к тому, что размеры полос прокрутки, кнопок, по­
лей ввода текста и других компонентов слегка изменялись при переходе от одной
платформы к другой. Несмотря на то что размеры элементов могут быть согласова­
ны путем правильного выбора диспетчера компоновки, специалисты Sun пришли к
решению, что для обеспечения реальной переносимости программ зависимость
графических компонентов от операционной системы должна быть устранена.
Для платформы Java 2 компания Sun предложила графический пакет Swing, в ко­
тором отображение элементов не зависит от операционной системы. В результате
графический интерфейс, реализованный с использованием Swing, стал полностью
переносимым. К сожалению, в настоящее время большинство броузеров может под­
держивать Swing только при наличии дополнительных модулей. Компоненты AWT,
напротив, поддерживаются практически всеми броузерами.

Простота Java
Несколькими страницами выше было сказано, что Java — простой язык. Об этом
стоит поговорить особо.
Дело в том, что простота— относительное понятие. По сравнению с С и C++ син­
таксические конструкции Java кажутся простыми в изучении и применении. Разра­
ботчики, которым довелось выяснять, почему не освобождается фрагмент памяти
6.2. Java: мифы и реальность 191

или откуда берется то или иное значение указателя, скажут, что автоматическая
"сборка мусора" освобождает программиста практически от всей работы. Однако не
следует забьщать, что Java — это все же язык программирования, а программирование
никогда не было простым делом. Тот, для кого основным занятием было создание
HTML-документов, скажет, что Java — чрезвычайно сложный язык. Из-за возрастаю­
щего количества стандартов и библиотек независимых производителей становится
все труднее следить за их появлением и изучать их.
Не говоря о том, что программирование — нелегкая работа сама по себе, программи­
сты постоянно стремятся решать более сложные задачи. Так, например, используя дру­
гие языки, только компьютерные гуру берутся за создание систем "клиент/сервер" или
многопотоковых приложений. В Java решением подобных задач часто занимаются про­
граммисты среднего уровня. Хорошо это или плохо? С одной стороны, разработчики
могут создавать программы, недоступные им ранее. С другой стороны, при написании и
отладке таких программ неизбежно возникают дополнительные трудности.
Таким образом, язык Java совсем не прост. Однако синтаксис языка понять доста­
точно легко, а тот факт, что компоненты Java можно изучать независимо друг от дру­
га, обусловливает привлекательность Java для программистов.

Java — объектно-ориентированный язык (для тех,


кто придерживается соответствующего подхода)
"Разве это не так?" — спросите вы. Дело в том, что программирование можно рас­
сматривать с разных точек зрения. Для некоторых программирование — это религия
и основная задача, как считают они, — проповедовать и обращать новичков "в свою
веру". Таких программистов отличает абсолютная верность конкретным операцион­
ным системам и языкам программирования и полное неприятие других. Однако вряд
ли это идеальная позиция. Наверное, лучше подходить к созданию программ "с точки
зрения плотника", который применяет по мере необходимости самые разные инст­
рументы. Одни инструменты используются часто, другие предназначены для выпол­
нения специфических задач. С часто используемыми инструментами можно сравнить
объектно-ориентированные средства, именно они составляют основу "инструмен-
тальнного набора" разработчика. Однако функциональное и структурное программи­
рование, программы, управляемые событиями, принцип "разделяй и властвуй" также
имеют право на существование и используются для решения конкретных задач. Объ­
ектно-ориентированный подход дополняет одни принципы программирования и
противоречит другим.
В основу Java положены объектно-ориентированные средства, что, несомненно,
является правильным выбором. Однако отказываться от применения некоторой тех­
нологии только потому, что она не соответствует объектно-ориентированному под­
ходу, по меньшей мере, неразумно.

Java — язык для разработки различных типов


программ
Java — язык общего назначения. Для решения ряда задач -- это прекрасный и даже
наилучший инструмент. Однако не следует думать, что Java одинаково хорошо подхо­
дит для написания любых программ. Иногда утилиты для работы в системе UNIX
192 Глава 6. Общие сведения о языке Java

удобнее создавать на С, для Windows-программ часто используется Visual Basic, а для


Web-приложений — JavaScript или VBScript. Продолжая аналогию с инструментами
плотника, можно сказать, что хороший специалист представляет себе преимущества
и недостатки различных языков и выбирает наиболее подходящий для решения кон­
кретной задачи. Однако следует заметить, что переносимость и способность взаимо­
действовать с другими компонентами системы являются важными характеристиками
любой программы. Поэтому в ряде случаев программисты отдают предпочтение Java
даже для тех программ, для которых использование другого языка было бы связано с
меньшими усилиями. Ч т о б ы правильно выбрать инструмент разработки, необходимо
иметь определенный опыт программирования.

6.3. Версии Java


Версия Java 1.0 была реализована компанией Sun Microsystems в 1995 г. В 1996 г.
компания Netscape реализовала виртуальную машину Java в броузере Netscape 2.0. Это
был первый ш и р о к о распространенный броузер, поддерживающий Java-аплеты. По­
сле незначительной доработки была выпущена версия Java 1.02; именно ее большин­
ство программистов называли Java 1.0. В начале 1997 г. компания Sun разработала
версию Java 1.1, в к о т о р о й был предусмотрен ряд новых возможностей.

• Новая модель обработки событий, основанная на использовании объектов про­


слушивания.
• RMI (Remote Method Invocation — вызов удаленных методов) и сериализация
объектов.
• Поддержка внутренних и анонимных классов.
• Поддержка целых чисел и чисел с плавающей точкой произвольной точности.
• JDBC (Java Database Connectivity) API для взаимодействия с р е л я ц и о н н ы м и ба­
зами данных.
• Компоненты JavaBeans (Java-ответ на появление ActiveX).
• Аплеты, заверенные ц и ф р о в о й подписью, для использования расширенного
набора привилегий (вместо подхода "все или ничего", применяемого при рабо­
те с дополнительными модулями и ActiveX).
П р и разработке аплетов лучше всего ориентироваться на Java 1.1 API, поскольку
именно этот и н т е р ф е й с поддерживается Netscape 4.06 и Internet Explorer 4.0, а также
более поздними версиями этих броузеров. Если создаваемые вами аплеты используют
возможности, предоставляемые новыми версиями Java, они могут н е к о р р е к т н о рабо­
тать в броузерах некоторых пользователей.
Платформа Java 2, поддерживаемая инструментальным пакетом JDK 1.2 (Java De­
velopment Kit 1.2), была реализована в декабре 1998 г. Н и ж е перечислены новые
средства, включенные B J D K 1.2.
• Компоненты пользовательского и н т е р ф е й с а Swing, полностью реализованные
средствами Java.
• Java 2D для профессиональной высококачественной двухмерной графики.
6.3. Версии Java 193

• Collection Framework с поддержкой таких структур данных, как связанные спи­


ски, деревья и множества.
• Аудиорасширения для поддержки форматов . wav, , a i f f, . a u , . m i d i и . rmf.
• Вывод на печать графических объектов.
• Java IDL API, с помощью которого в Java реализуется поддержка CORBA.
Весной 2000 г. Sun выпустила JDK 1.3. В этой версии были устранены некоторые
недостатки и реализованы новые средства API. Среди выполненных доработок наи­
более существенными можно считать следующие.

• Java Naming and Directory Interface (JNDI) — служба каталогов, предназначенная


для регистрации и поиска ресурсов (объектов).
• RMI-IIOP — протокол взаимодействия с распределенными клиентами, напи­
санными на CORBA-совместимом языке.
Теперь, когда перечень версий и пакетов, поддерживающих их, приобрел вн}тпи-
тельные размеры, следует заметить, что на самом деле JDK 1.2 и JDK 1.3 соответствуют
платформе Java 2, Standard Edition. Наряду со Standard Edition Sun предложила Java 2,
Enterprise Edition, в рамках которой были реализованы следующие возможности.

• Java-сервлеты и Jav2iServer Pages — ответ Sun на появление Microsoft Active


Sei-ver Pages и ColdFusion.
• Компоненты Enterprise JavaBeans для реализации бизнес-логики и построения
програхмм, выполняющихся на стороне сервера.
• Расширенные возможности просмотра результатов, предоставляемых средст­
вами JDBC.
• Использование JavaMail для передачи и приема почты посредством протоколов
STP, РОРЗ или IMAP4.
• JAXP для разбора XML-документов.
• Использование Java Message Service для асинхронного взаимодействия корпо­
ративных приложений.

Какой версии отдать предпочтение


Вы, конечно же, хотите работать с самой последней версией Java! Однако в зави­
симости от предполагаемого использования программы, которую вы собираетесь
создать, применение последней версии может оказаться нежелательным. П р и выборе
версии языка след)^ет принимать во внимание следующие соображения.

• А п л е т ы . Для создания аплетов лучше всего выбирать Java Development Kit 1.1
(JDK 1.1, последней реализацией которого была JDK 1.1.8_005). Netscape 4.06,
Internet Explorer 4.01 и даже более поздние версии этих броузеров без допол­
нительных модулей поддерживают только версию 1.1 и более ранние версии
Java. Исключением является только Netscape 6, который, однако, не поддержи­
вает JDK 1.3. Распространяя аплеты по Internet, вы не можете знать, с какими
194 Глава 6. Общие сведения о языке Java

броузерами работают пользователями, для которых создаются аплеты, поэто­


му, приступая к созданию аплета, лучше ориентироваться naJDK 1.1 API.
• Приложения. Для создания независимых приложений можно воспользоваться
JDK 1.3, известным также под названием Java SDK, Standard Edition, Version 3.0.
Если вы создаете приложения для работы на стороне сервера, взаимодейст­
вующие с программами других производителей, выбор версии JDK определяет­
ся возможностями, которые предоставляют эти программы.
Итак, наилучший выбор для вас— использовать JDK 1.3, но учитывать возмож­
ность перехода naJDK 1.1 API для написания аплетов.

Основные сведения о Java


Платформа Java 2 предоставляет богатые возможности. В данной книге вы найдете
информацию, достаточную для того, чтобы начать разработку распределенных при­
ложений на Java.
В главах 7 и 8 приводятся общие сведения о синтаксисе Java. В главе 9 будут рас­
смотрены аплеты, кроме того, в главе 12 вы узнаете о диспетчерах компоновки, ис­
пользуемых при разработке графических пользовательских интерфейсов средствами
AWT (они описаны в главе 13) либо Swing (о них речь пойдет в главах 14 и 15).
После рассмотрения базового материала мы перейдем к обсуждению распреде­
ленных программ. Сначала речь пойдет о ТСР-соединениях, с помощью которых реа­
лизуется взаимодействие различных компьютеров в Internet (подробно об этом в гла­
ве 17). Для эффективной обработки клиентских запросов распределенные приложе­
ния часто реализуются в виде многопотоковых программ. Работе с потоками и
синхронизации данных (предотвращению проблем, возникающих при одновремен­
ном доступе к ресурсам) посвящена глава 16.
После этого мы перейдем к программам, выполняющимся на стороне сервера.
В глава 19 вы познакомитесь с Java-сервлетами, а в главе 20— с JavaServer Pages. Здесь
же будут рассмотрены cookie, поддержка сеансов и JavaBeans. Основные сведения о
взаимодействии с базами данных посредством JDBC вы получите в главе 22. Наконец,
в главе 23 мы затронем вопросы использования XML и JAXP для поддержки платфор-
менно-независимых бизнес-транзакций.
Усвоив указанный материал, вы сможете приступить к созданию распределенных
приложений на Java, а также изучать более сложные вопросы, включая Enterprise
JavaBeans, JNDI и JavaMessaging.

6.4. Начинаем работу


Итак, заканчиваем рассуждать и начинаем работать.
Если вы хотите, чтобы изучение Java продвигалось быстро, не стоит без остановки
читать эту книгу. <ШУТКА> Несомненно, она написана так интересно, что оторваться
от нее будет крайне сложно, но вам все же придется сделать это. </ШУТКА> Если гово­
рить серьезно, то лучше всего для вас будет как можно скорее инсталлировать Java и,
немного почитав, тут же проверить полученные знания на практике. По мере изуче­
ния материала примеры, реализованные вами, будут усложняться. Как можно быстрее
6.4. Начинаем работу 195

приступайте к написанию реальных программ и пробуйте применять при этом самые


разные походы. Опыт невозможно заменить ничем. Основные действия, которые вам
желательно выполнить, перечислены ниже.
• Инсталлируйте Java.
• Инсталлируйте броузер с поддержкой Java.
• Скопируйте документацию по Java API либо создайте закладку на соответст­
вующий адрес Internet.
• Установите интегрированную среду разработки (это не обязательно).
• Создайте и запустите Java-программу.

Установка Java
Средства Java поставляются со многими операционными системами (например,
OS/2, MacOS 10, Solaris 2.6), поэтому не исключено, что Java уже инсталлирован на
вашем компьютере. Если это не так, вам доступны свободно распространяемые вер­
сии для Windows MacOS, OS/2, Novell IntranetWare, Solaris, Irix, HP-UX, AIX, SCO
UnixWare, Linux, Amiga, BeOS и многих других операционных систем. Ниже перечис­
лены адреса основных узлов, с которых можно скопировать различные версии Java.
Что касается других операционных систем и коммерческих продуктов, информацию
о них вы найдете на сервере Sun по адресу
http://Java.sun.com/cgi-bin/java-ports.cgi
Заметьте, что информация, расположенная по многим URL, приведенным в этой
книге, доступна также по адресу h t t p : //www. corewebprogramming. com/.

Java SDK, Standard Edition, Version 1.3 (JDK 1.3)


Microsoft Windows
http://Java.sun.com/j2se/l.3/download~windows.html

Solaris SPARC/x86
http://Java.sun.com/j2se/l.3/download-solaris.html

Linux x86
http://Java.sun.com/j2se/l.3/download-linux.html

Java SDK, Standard Edition, Version 1.2 (JDK 1.2)


Microsoft Windows
http://Java.sun.com/products/jdk/1.2/download-windows.html

Solaris SPARC/x86
http://Java.sun.com/products/jdk/1.2/download-solaris.html
196 Глава 6. Общие сведения о языке Java

L i n u x х86
http://Java.sun.com/products/jdk/1.2/download-linux.html

Java Development Kit, Version 1.1 (JDK 1.1)


Microsoft Windows
http://Java.sun.com/products/jdk/1.1/downlead-windows.html

Solaris SPARC/x86
http://Java.sun.com/products/jdk/1.2/download-jdk-solaris.html

Инсталляция броузера с поддержкой Java


Инсталлировав броузер с поддержкой Java, вы сможете запускать Java-программы,
встроенные в Web-страницы, т.е. аплеты. В состав интегрированных сред разработки и
свободно распространяемых версий Java входит утилита a p p l e t v i e w e r — своеобраз­
ный "мини-броузер", игнорирующий все компоненты Web-страницы за исключением
аплетов. Такую утилиту удобно использовать для тестирования аплетов. Для более тща­
тельной проверки можно использовать Netscape Navigator или Communicator, Microsoft
Internet Explorer, Hotjava производства Sun либо другой броузер. П р и этом возникает
"проблема первичности", так как для того, чтобы обратиться к Web-узлу и скопировать
броузер, надо иметь программу, поддерживающую протокол HTTP, т.е. броузер. Для
некоторых платформ броузер входит в состав операционной системы, часто их предос­
тавляют Internet-провайдеры. Кроме того, вы можете обратиться на FTP-узел Netscape.

N e t s c a p e Navigator
http://home.netscape.com/download/

Microsoft I n t e r n e t E x p l o r e r

http://www.microsoft.com/ie/download/

Hotjava
http://Java.sun.com/products/hotjava/

Доступ к документации по Java API


О ф и ц и а л ь н ы й док)т^1ент, описывающий Java API, предоставляет и н ф о р м а ц и ю обо
всех переменных (кроме переменных, объявленных как p r i v a t e ) и методах каждой
из стандартных библиотек. Таких исчерпывающих сведений вы не найдете ни в этой,
ни в какой-либо другой книге. HTML-версия документа для JDK 1.1, 1.2 и 1.3 распро­
страняется Sun и поставляется в составе многих интегрированных пакетов разработ­
ки. С документом можно работать в интерактивном режиме, обращаясь к Web-узлу
Sun, однако серьезные разработчики предпочитают копировать его на локальный
диск (для этого требуется 5-10 Мбайт дискового пространства).
6-4. Начинаем работу 197

Java 2 SDK, Version 1.3 (JDK 1.3)


Спецификация API
http://Java.sun.com/j2se/l.3/docs/api/

Узел, с которого можно скопировать документацию API


http://Java.sun.com/j2se/l.3/docs.html

Java 2 SDK, Version 1.2 (JDK 1.2)


Спецификация API
http://Java.sun.com/products/jdk/1.2/docs/api/

Узел, с которого можно скопировать документацию API


http://Java.sun.com/products/jdk/1.2/download-docs.html

Java 1.1 (JDK 1.1)


Спецификация API
http://Java.sun.com/products/jdk/1.1/docs/api/packages.html

Узел, с которого можно скопировать документацию API


http://Java.sun.com/products/jdk/1.l/#docs

Для того чтобы получить список всех доступных продуктов, надо обратиться к узлу
Sun по адресу h t t p : / / J a v a . s u n . c o m / p r o d u c t s / .

Установка интегрированного пакета разработки


(необязательное действие)
Помимо Java-компилятора, вы, возможно, захотите установить интегрированный
пакет разработки, включающий графический отладчик, броузер классов, средства
создания интерфейсов, шаблоны для реализации соединений с базами данных и дру­
гими инструментами. В настоящее время доступны самые различные среды разработ­
ки, в частности, набор подобных пакетов расположен по адресу h t t p : / / J a v a ,
miningco . com/msub9 . htm. Ниже перечислено несколько дополнительных ссылок.

Borland JBuilder
http://www.boгland.com/jbuilder/

IBM VisualAge
http://www-4.ibm.com/software/ad/vajava/
198 Глава 6. Общие сведения о языке Java

Oracle J D e v e l o p e r

http://www.oracle.com/ip/develop/ids/jdeveloper.html

WebGain Visual Cafe

http://www.visualeafe.com/Products/VisualCafe_Overview.html

Sun Forte D e v e l o p e r
http://www.sun.com/forte/ffj/

Создание и запуск иауа-программы


Создание файла с исходным текстом
Создайте и сохраните файл (с именем T e s t . J a v a ) , содержащий общедоступный
класс T e s t . Заметьте, что имя файла и имя класса должны совпадать, кроме того, в
этих именах учитывается регистр символов. Если вы не используете окружение,
специально предназначенное для разработки, создайте файл с исходным текстом с
помощью обычного текстового редактора. П р и м е р исходного кода программы
приведен в следующем разделе.

Компиляция
Если вы работаете в системе Windows или UNIX и используете компилятор j a v a c
из пакета Sun JDK, скомпилируйте текст, выполнив команду j a v a c T e s t . J a v a .
В системе Macintosh перетащите исходный файл на Java-компилятор. Если вы ра­
ботаете в и н т е г р и р о в а н н о й среде, следуйте инструкциям поставщика. В результа­
те компиляции создается файл T e s t , c l a s s .

Запуск п р о г р а м м ы
Для запуска независимого Java-приложения с консольным и н т е р ф е й с о м можно
вызвать команду J a v a T e s t . Заметьте, что утилита называется не j a v a c , а J a v a ,
кроме того, в качестве параметра задается T e s t , а не T e s t . c l a s s . В Mac доста­
точно перетащить файл класса на программу запуска. Для выполнения аплета вам
потребуется броузер, в котором необходимо открыть Web-страницу, содержащую
аплет. Так, например, чтобы запустить аплет в составе Web-страницы T e s t . h t m l ,
эта страница должна ссылаться на файл T e s t , c l a s s посредством дескриптора
<APPLET>. Подробно о запуске аплетов мы поговорим позже.

6.5. Несколько простых Java-программ


В этом разделе представлено несколько очень простых программ, посредством
которых состоится ваше знакомство с Java. Если вы не совсем понимаете некоторые
детали — не стоит беспокоиться; в дальнейшем мы подробно рассмотрим структуру
типичной программы на Java. Ж е л а т е л ь н о скомпилировать эти программы и запус­
тить их на выполнение. После того как они выполнятся успешно, постарайтесь вне­
сти в них хотя бы минимальные изменения.
6 . 5 . Несколько простых J a v a - п р о г р а м м 199

Приложение Hello, World


Java-приложениями (в отличие от Java-аплетов) принято называть независимые
Java-программы. Приложение должно содержать имя, которое в точности (с учетом
регистра символов) совпадает с именем исходного файла. Этому классу должен при­
надлежать метод main, определенный как p u b l i c s t a t i c void. При вызове метода
main ему передается строковый массив, определяемый как S t r i n g [ ] имя_параметра
либо как S t r i n g гшя__параметра[ ]. В листинге 6.1 представлен код простого прило­
жения, которое выводит после запуска сообщение "Hello, world". Другие примеры
приложений приведены в главе 7. Часто Java-приложения обеспечивают графический
пользовательский интерфейс. Общие сведения о графических интерфейсах будут
представлены в главе 9, а более подробно они будут рассмотрены в главе 13, посвя­
щенной компонентам AWT.
М е т о д и к а профессионалов

Исходный код общедоступного класса SomeClass должен содер­


жаться в файле SomeClass. Java. Поскольку в системе Windows
98/NT/2000 учитывается регистр символов, имя файла не может
быть SOMECLASS. Java ИЛИ someclass. Java.

Л и с т и н г 6 . 1 . HeiioWorid.Java

public class HelloWorld {


public static void main(String[] args) {
System.out.println{"Hello, world.");
}
}

Компиляция:
javac HelloWorld.Java
Запуск:
Java HelloWorld
Результаты выполнения:
H e l l o , world.

Параметры командной строки


в листинге 6.3 показан код программы, которая реагирует на данные, введенные
пользователем. Данный пример выглядит почти так же, как программа, написанная
на языке С, однако имеет несколько важных отличий. Объект S t r i n g является ча­
стью Java, с каждым из Java-массивов связано свойство l e n g t h , а имя файла не входит
в состав параметров командной строки. Если вы никогда не видели программы на С
или C++, вам следует ознакомиться с циклами и условными операторами, сведения о
которых приведены в главе 8. Заметьте, что в Macintosh вы также можете читать па-
200 Глава 6. Общие сведения о языке Java

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

Листинг 6 . 2 . S h o w A r g s . J a v a

p u b l i c c l a s s ShowArgs {
public s t a t i c void main(String[] args) {
f o r ( i n t i = 0 ; i < a r g s . l e n g t h ; i++) {
System.out.println("Arg " + i + " is " + args[i];
}
}
}

Компиляция:
javac ShowArgs.Java
Запуск:
Java ShowArgs fee fie foe fum
Результаты выполнения:
Arg 0 is fee
Arg 1 is fie
Arg 2 is foe
Arg 3 is fum

Аплет Hello, World


Аплет отличается от приложения тем, что он входит в состав Web-страницы и вы­
полняется в среде, реализуемой броузером. Подобно приложению, в исходном файле
аплета определен класс, имя которого совпадает с именем файла, однако данный
класс не содержит метод m a i n . Инициализация аплета обычно осуществляется в теле
метода i n i t , а вывод данных— в теле метода p a i n t . В листинге 6.3 содержится код
простого Java-аплета, который выводит в небольшом окне сообщение "Hello, World
Wide Web". В листинге 6.4 показан HTML-документ, включающий данный аплет. За­
метьте, что имя HTML-файла может быть произвольным; оно не обязательно должно
совпадать с именем исходного Java-файла. В данном случае имена выбраны совпадаю­
щими исключительно для удобства рассмотрения примера. Дополнительную инфор­
мацию об аплетах и выводе данных в окнах вы найдете в главе 9.

Листинг 6 . 3 . HelloWWW. J a v a

import Java.applet.Applet;
import java.awt.*;

p u b l i c c l a s s HelloWWW e x t e n d s A p p l e t {
p r i v a t e i n t f o n t S i z e = 40;
6.5. Несколько простых Java-программ 201

public void initO {


setBackground(Color.black);
setForeground(Color.white);
setFont(new Font("SansSerif", Font.BOLD, fontSize));

public void paint(Graphics g) {


g.drawstring("Hello, World Wide Web.", 5, fontSize+5);

Лиcтинг 6.4. HelloWWW.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>HelloWWW: Simple Applet Test.</TITLE>
</HEAD>
<BODY BGCOLOR="WHITE">

<Hl>HelloWWW: Simple Applet Test.</Hl>


<P>
<APPLET CODE="HelloWWW.class" WIDTH=460 HEIGHT=50>
<B>Error! You must use a Java enabled browser.</B>
</APPLET>

</BODY>
</HTML>

Компиляция:
javac HelloWWW.Java
Запуск:
HelloWWW. h t m l загружается в Web-броузер.

Результаты выполнения:
Т и п и ч н ы е результаты показаны на рис. 6.6.

F^ HelloWWW: Simple Aopiet Tesl.


£ile £(A» Yiew Qo Communcatc»
Nfstscape
ЦФ
ШШ
a
HelloWWW: Simple Applet Test.

Hello. World Wide Web.


Ci?''^'<' App{(s{netoWV,Vf<^Д11^Ш^|рШ!|р.Р га Z
Рис. 6.6. Простой аплет, отображаемый в окне бро­
узера Netscape Navigator 4.7, который выполняется в
среде Windows 98
202 Глава 6. Общие сведения о языке Java

Параметры, передаваемые аплету


Аплет не получает параметры из командной строки по той причине, что он запус­
кается в среде броузера. Для того чтобы передать параметры аплету, надо использо­
вать элемент PARAM, помещаемый между дескрипторами <APPLET . . .> и
</APPLET>. Аплет читает параметры, вызывая метод g e t P a r a m e t e r . В листинге 6.5
представлен код модифицированного аплета HelloWWW, который отображает текст,
переданный ему в качестве параметра. В листинге 6.6 показан HTML-документ, кото­
рый четырежды вызывает аплет, передавая ему различные параметры. Подробно ис­
пользование элемента PARAM будет рассмотрено в главе 9.

Листинг 6.5. Message.java

import Java . a p p l e t . Applets-


import j a v a . a w t . * ;
p u b l i c c l a s s Message extends Applet {
private int fontSize;
p r i v a t e S t r i n g messages-
p u b l i c void i n i t O {
setBackground(Color.black);
setForeground(Color.white);
/ / Установка размера шрифта на базе области,
/ / выделяемой для аплета.
f o n t S i z e = g e t S i z e О . h e i g h t - 10;
setFont(new F o n t ( " S a n s S e r i f " , Font.BOLD, f o n t S i z e ) ) ;
/ / Чтение сообщения, переданного посредством
/ / HTML-элемента PARAM.
message = getParameter("MESSAGE");
}
p u b l i c void p a i n t ( G r a p h i c s g) {
i f (message != n u l l ) {
g . d r a w s t r i n g ( m e s s a g e , 5, f o n t S i z e + 5 ) ;
}
}

Листинг 6.6. Message.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">


<HTML>
<HEAD>
<TITLE>The Message Applet</TITLE>
</HEAD>
<BODY BGCOLOR="WHITE">
<Hl>The <CODE>Message</CODE> Applet</Hl>
<P>
<APPLET CODE="Message.class" WIDTH=325 HEIGHT=25>
<PARAM NAME="MESSAGE" VALUE="Tiny">
6.5. Несколько простых Java-программ 203

<B>Sorry, these exampl es require Java</B>


</APPLET>
<P>
<APPLET CODE="Message.cl ass" WIDTH=325 HEIGHT=50>
<PARAM NAME-"MESSAGE" VALUE="Small">
<B>Sorry, these exampl es require Java</B>
</APPLET>
<P>
<APPLET CODE="Message.cl ass" WIDTH=325 HEIGHT=75>
<PARAM NAME="MESSAGE VALUE="Medium">
<B>Sorry, these exampl es require Java</B>
</APPLET>
<P>
<APPLET CODE="Message.cl ass" WIDTH=325 HEIGHT=100>
<PARAM NAME="MESSAGE" VALUE="Giant">
<B>Sorry, these exampl es require Java</B>
</APPLET>
</BODY>
</HTML>

Компиляция:
javac Message.Java
Запуск:
M e s s a g e . h t m l загружается в Web-броузер.
Результаты выполнения:
На рис. 6.7 показана Web-страница, в которой один и тот же аплет загружается че­
тыре раза. П р и вызове аплета в составе дескриптора APPLET задаются разные значе­
ния атрибута HEIGHT, а в дескрипторе PARAM — разные значения атрибута VALUE.

JSIxJ
, Ete 1 * iiew Favorites lools Неч

>i-iBack ' ->- - . J J 'JU 'i^Search

d
T h e Message A p p l e t

Small

Medium
Giant
i^jOone ;уЗ My Computer
J
Рис. 6.7. Один и тот же аплет четырежды
отображается в окне броузера Explorer 5.5,
который выполняется в системе Windows 2000
204 Глава 6. Общие сведения о языке Java

6.6. Резюме
Язык Java был впервые представлен несколько лет назад и бурно развивался все
эти годы. Большинство разработчиков не встречались прежде с н е к о т о р ы м и средст­
вами Java, тем не менее, идеи, на базе которых созданы эти средства, уже были неод­
нократно реализованы в других языках. Целью данной главы было предоставить чи­
тателю общие сведения о Java и развеять л о ж н ы е представления о данном языке. По­
сле инсталляции Java, броузера с поддержкой Java и документации по Java API можно
приступать к созданию первых программ.
Дальнейшие ваши действия зависят от того, насколько богат ваш опыт программи­
рования. Если вы никогда не работали с объектно-ориентированными языками, вам
следует внимательно прочитать главу 7. Если же объектно-ориентированный подход —
не новость для вас, то достаточно бегло просмотреть эту главу для того, чтобы узнать о
некоторых особенностях, отличающих Java от других объектно-ориентированных язы­
ков. Аналогично, если вы ничего или почти ничего не знаете о С или C++, вам надо вни­
мательно прочитать главу 8, где рассматривается синтаксис Java, и попытаться написать
несколько простых программ. Если же ваш опыт программирования на C/C++ доста­
точно велик, вам следует лишь пролистать главу 8 и перейти к более сложному материа-
лу. В последующих главах будут рассмотрены работа с окнами и графикой, поддержка
событий, многопотоковая обработка, создание программ, взаимодействующих по сети,
Java-сервлеты, JavaServer Pages и прочие вопросы.
ОБЪЕКТНО-
ОРИЕНТИРОВАННОЕ
ПРОГРАММИРО­
ВАНИЕ НА JAVA

В ЭТОЙ главе...

Переменные экземпляра: создание классов


с именованными полями.
Методы: добавление функций к классам.
Конструкторы: функции, используемые при построении
классов.
Деструкторы: почему в Java не используются функции,
предназначенные для освобождения ресурсов.
Javadoc: создание гипертекстовой документации для классов.
Наследование: повторное использование классов
и обеспечение новых возможностей.
Интерфейсы: описание поведения различных классов.
Пакеты: организация классов.
CLASSPATH: поиск файлов классов.
Модификаторы: управление доступом к различным частям
классов.
Tly\:EJ^zJ

О сновным понятием при программировании на языке Java являются объекты.


Начинающем)' программисту, работающем)' на Java, необходимо разобраться,
как создаются и используются объекты. П о н я т ь п р и н ц и п ы работы с объекта­
ми важнее даже, чем изучить основные синтаксические конструкции, описанные в
главе 8. Если вы никогда на занимались объектно-ориентированным программирова­
нием, уделите особое внимание материалу, изложенному в этой главе. Как уже было
сказано, выполнять п р и м е р ы не менее важно, чем читать текст главы. В процессе
изучения материала постарайтесь создать несколько собственных классов. Время, по­
траченное на работу с примерами, многократно окупится при решении конкретных
задач. Если вы работали с объектами на других языках программирования, данная
глава вряд ли будет вам полезна; со многими разделами вам достаточно лишь бегло
ознакомиться. Однако в любом случае необходимо уделить пристальное внимание
разделу 7.7, посвященному Javadoc, разделу 7.9, в котором описываются и н т е р ф е й с ы
и абстрактные классы, а также разделу 7.10, в котором рассматриваются пакеты, пе­
ременная окружения CLASSPATH и архивы JAR.

7 . 1 . Переменные экземпляра
Класс можно упрощенно представить себе как структуру или запись. О б ы ч н о для
создания объекта (экземпляра класса) используется о п е р а т о р new, после которого
указывается конструктор класса. Конструктор — это метод, имя которого совпадает с
именем класса. Н а п р и м е р :
Point р1 = new Point(2, 4);
Color red = new Color(255, 0, 0);
В некоторых случаях использование оператора new остается скрытым от разра­
ботчика. Н а п р и м е р , объект может возвращаться в результате выполнения метода, в
этом случае о п е р а т о р new выполняется в теле метода, либо метод вовсе не обращает­
ся к данному оператору, а возвращает существующий экземпляр класса. П р и м е р ы
объектов, возвращаемых методами, приведены ниже.
208 Глава 7. Объектно-ориентированное программирование.

OutputStream out = someSocket.getOutputStream();


Point pi = someWindow.location 0 ;
В некоторых случаях, например при работе со строками и массивами, для созда­
ния объектов используются упрощенные конструкции. Например, ниже показаны два
способа создания объекта S t r i n g .
String stringl = new String("A String");
String string2 = "Another String";
Поля, или свойства, класса в Java принято называть переменными экземпляра. Для об­
ращения к ним используются выражения, подобные следующему:
objectReference.variableName
Как видите, имя переменной экземпляра отделяется точкой от ссылки на реаль­
ный объект.
В листинге 7.1 показан пример класса с именем S h i p l (он может представлять
судно в некоторой системе моделирования). В теле метода m a i n посредством выра­
жений new S h i p l () создаются два экземпляра класса S h i p l , а затем инициализиру­
ются переменные каждого объекта. Значения переменных изменяются, моделируя
"движение" судна, после чего скорость и координаты судов выводятся на экран.

Листинг 7 . 1 . T e s t l . j a v a

// Создание к л а с с а с пятью переменными э к з е м п л я р а ( п о л я м и ) :


// X, у, s p e e d , d i r e c t i o n и name. З а м е т ь т е , ч т о к л а с с S h i p l
// не о б ъ я в л е н к а к p u b l i c , поэтому он может быть о п р е д е л е н
// в том же файле, ч т о и T e s t l . В J a v a - ф а й л е может быть
// о п р е д е л е н т о л ь к о один общедоступный ( p u b l i c ) к л а с с .

class Shipl {
public double x, у, speed, direction;
public String name;
}

// Класс, предназначенный для запуска программы,


// содержащий метод main.

public class Testl {


public static void main(String[] args) {
Shipl si = new Shipl();
s1.X = 0.0;
si.у = 0.0;
si.speed = 1.0;
si.direction = 0.0; // Восток
si.name = "Shipl";
Shipl s2 = new Shipl();
s2.x = 0.0;
s2.y = 0.0;
s2.speed = 2.0;
s2.direction = 135.0; // Северо-запад
s2.name = "Ship2";
sl.x = sl.x + si.speed
* Math.cos(si.direction * Math.PI / 180.0);
7 . 1 . Переменные экземпляра 209

si.у = si.у + si.speed


* Math.sin(sl.direction * Math.PI / 180.0)
s2.x = s2.x + s2.speed
'^ Math, cos (s2.direction * Math.PI / 180.0)
s2.y = s2.y + s2,speed
* Math.sin(s2.direction * Math.PI / 180.0)
System.out.println(si.name + " is at ("
+ si.X + "," + si.y + ").");
System.out.println(s2.name + " is at ("
+ s2.x + "," + s2.y + ").");
}

Компиляция и запуск:
javac T e s t l . j a v a
Java T e s t l
Результаты выполнения:
Shipl is at (1,0).
Ship2 is at (-1.41421,1.41421).
П р о с м о т р е в текст данного примера, вы, возможно, заметили в именах перемен­
ных и классов н е к о т о р ы е особенности. В соответствии со стандартными соглаше­
ниями об именовании Java имена локальных переменных и переменных экземпляра
начинаются со с т р о ч н о й буквы (например, s o m e S t r i n g , window, o u t p u t S t r e a m l ) , а
имена классов начинаются с прописной буквы (например. S t r i n g , Window,
O u t p u t S t r e a m ) . Если имя переменной или класса состоит из нескольких "слов", каж­
дое из последующих "слов" п р и н я т о начинать с прописной буквы (например,
s o m e l n s t a n c e V a r i a b l e , S o m e C l a s s ) . Н е к о т о р ы е разработчики предпочитают раз­
делять "слова" знаками подчеркивания (например, someinstancevariable,
S o m e C l a s s ) . Имена констант состоят из прописных букв (например, P I ) . Данное
соглашение делает код более удобочитаемым, по имени можно сразу сказать, является
ли оно именем класса или переменной.

Методика профессионалов
Имя переменной начинается со строчной буквы (myVar), а имя клас­
са—с прописной (myCLass).

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


не соблюдаются соглашения об именовании. Действительно, скажет читатель, если
Math— это глобальная переменная, содержащая объект с константой P I , т о ее имя
должно начинаться со строчной буквы. Почему же тогда в тексте примера указано
Math вместо m a t h ? Дело в том, что Math — не глобальная переменная (в языке Java во­
все не существует такого понятия), а класс. Помимо переменных экземпляра в Java
определены переменные iciacca, или статические переменные, которые совместно исполь­
зуются всеми экземплярами одного и того же класса. П р и объявлении таких перемен­
ных задается ключевое слово s t a t i c , и для обращения к ним достаточно указать имя
класса. Таким образом, соглашение об именовании позволяет разобраться с реальным
210 Глава 7. Объектно-ориентированное программирование..

положением дел и в этом случае; читатель, который никогда не слышал о существова­


нии класса Math, глядя на выражение M a t h . P I , может сказать, что р е ч ь идет о пере­
менной s t a t i c f i n a l (константе) P I , которая является переменной класса Math.

7.2. Методы
В предыдущем примере один и тот же фрагмент кода повторялся несколько раз
для того, чтобы присвоить значения переменным экземпляра х и у двух объектов. Та­
кой стиль программирования считается плохим не только потом)% что одинаковые
фрагменты повторяются многократно, сколько потому, что при модификации про­
граммы надо вносить изменения сразу в нескольких ее частях. Для того чтобы решить
эт)^ проблему, включим функцию в состав класса, который до сих п о р содержал только
данные. Код такого класса показан в листинге 7.2. Функции, входящие в состав класса,
п р и н я т о называть, как и в L i s p / C L O S , методами (в языке C++ они называются функ­
циями-членами). Заметьте, что в отличие от C++, в Java переменные экземпляра могут
инициализироваться при объявлении.
public double х=0.0;
П р и объявлении переменных и методов могут использоваться ключевые слова
p u b l i c и p r i v a t e , которые п р и н я т о называть модификаторами. П о д р о б н о они буд)т
описаны ниже в этой главе, сейчас же достаточно заметить, что м о д и ф и к а т о р p u b l i c
разрешает дост)'п к переменной или методу из других объектов. Модификатор p r i ­
v a t e , напротив, ограничивает доступ рамками данного класса.

Листинг 7.2. T e s t 2 . j a v a

/ / К к л а с с у S h i p д о б а в л я ю т с я методы move и p r i n t L o c a t i o n ,
/ / объявленные к а к p u b l i c

class Ship2 {
public double x=0.0, y=0.0, speed=1.0, direction=0.0;
public String name = "UnnamedShip";

private double degreesToRadians(double degrees) {


return(degrees * Math.PI / 180.0);
}
public void move() {
double angle = degreesToRadians(direction);
X = X + speed * Math.cos(angle);
у = у + speed * Math.sin(angle);
}
public void printLocation() {
System.out.println(name + " is at " +
" (" + X + ", " 4- у + " ) . " ) ;
}
}
public class Test2 {
7 . 3 . Конструкторы и ссылка this 211

public static void main(String[] args) {


Ship2 si = new Ship2();
si.name = "Shipl";
Ship2 s2 = new Ship2();
s2.direction = 135.0; // Северо-запад
s2.speed = 2.0;
s2.name = "Ship2";
s1.move();
s2.move();
si.printLocation();
s2.printLocation();
}

Компиляция и запуск:
javac Test2.java
Java Test2
Результаты выполнения:
Shipl is at (1, 0) .
Ship2 is at (-1.41421,1-41421).

7.3. Конструкторы и ссылка this


Конструктор класса — специальная процедура, используемая для создания объекта.
Конструктор указывается в вырг1жении типа new C l a s s N a m e ( . . . ) . По сути, конст­
руктор представляет собой общедоступный метод, на который накладываются два ог­
раничения. Во-первых, имя конструктора должно совпадать с именем класса, а во-
вторых, при объявлении конструктора не должен указываться возвращаемый тип. Ес­
ли возвращаемый тип будет указан (например, p u b l i c v o i d S h i p 2 ( . . . ) {...}),
то при компиляции не выводятся предупреждающие сообщения, но объявленный ме­
тод не будет вызываться как конструктор.

Внимание!

Убедитесь, что при объявлении конструктора не указан тип возвра­


щаемого значения.

П р и определении конструктора можно указать любое количество параметров. Па-


р а м е т р ы п о з в о л я ю т разработчику передавать данные для инициализации объекта в
процессе его создания. Если вы не определите ни одного конструктора, Java автома­
тически создаст конструктор, вызываемый без параметров, в теле которого не содер­
жится ни одного оператора.
p u b l i c SomeClassO { }
Если же вы определите любой конструктор для класса, конструктор по умолчанию
создаваться не будет. Таким образом, если вы задали конструктор, которому переда­
ется один или несколько параметров, но хотите, чтобы конструктор без параметров
также существовал, вам надо определить его явным образом.
212 Глава 7 . Объектно-ориентированное п р о г р а м м и р о в а н и е . . .

На з а м е т к у

Если вы не определили ни одного конструктора для класса, Java ав­


томатически создает конструктор с нулевым числом параметров.
Если же вы определите хотя бы один конструктор, то конструктор по
умолчанию не будет создан.

Недостаток класса S h i p 2 состоит в том, что изменение полей происходит в не­


сколько этапов. Удобнее было бы задавать их значения при создании объекта. Более
того, наличие значений по умолчанию затрудняет чтение текста программы, по­
скольку глядя на команду создания объекта, приходится учитывать величины, автома­
тически присваиваемые переменным. Ч т о б ы избежать этого недостатка, создадим
класс S h i p 3 , конструктор которого выглядит следующим образом:
public Ship3(double х, double у, ...) {
// Инициализация полей
}
Однако здесь также возникает небольшая проблема: локальные п е р е м е н н ы е х и у
маскируют переменные экземпляра с теми же именами. Фрагмент кода, показанный
ниже, синтаксически корректен, но абсолютно бесполезен.
public Ship3(double х, double у, ...) {
X = х;
У = у;

}
Единственным результатом выполнения этого кода будет п о в т о р н о е присвоение
локальным переменным тех же значений. Один из выходов из создавшегося положе­
ния — использовать различные имена для локальных переменных и переменных эк­
земпляра.
public Ship3(double inputX, double inputY, ...) {
X = inputX;
у = inputY;

Другое решение проблемы состоит в использовании переменной t h i s . В любом


классе переменная t h i s ссылается на текущий экземпляр класса. Эта переменная мо­
жет быть, в частности, использована для передачи внешним программам ссылки на
объект. С помощью переменной t h i s можно также ссылаться на переменные экземп­
ляра и методы, как это показано ниже.
public void move() {
double angle = this.degreesToRadians(this.direction);
this.x = this.x + this.speed * Math.cos(this.angle);
this.у = this.у + this.speed * Math.sin(this.angle);
}
Этот фрагмент абсолютно идентичен следующему, записанному более просто:
public void move() {
double angle = degreesToRadians(direction);
7.3. Конструкторы и ссылка this 213

X = X + speed * Math.cos(angle);
у = у + speed * Math.sin(angle);
}
Указывать переменную t h i s перед именем каждой переменной экземпляра или
метода нет никакой необходимости, однако в некоторых случаях данная переменная
оказывается полезной. Так, например, с ее помощью можно отделить локальные пе­
ременные от полей класса с теми же именами.

Листинг 7 . 3 . T e s t 3 . J a v a

/ / В к о н с т р у к т о р е S h i p 3 при с о з д а н и и о б ъ е к т а происходит
/ / и н и ц и а л и з а ц и я переменных э к з е м п л я р а .

class Ship3 {
public double x, у, speed, directions-
public String name;
public Ship3(double x, double y, double speed,
double direction, String name) {
this.x = x; // Переменная "this" позволяет отделить
this.у = у; // переменные экземпляра от локальных переменных,
this.speed = speed;
this.direction = direction;
this.name = name;

private double degreesToRadians(double degrees)


return(degrees * Math.PI / 180.0);

public void move() {


double angle = degreesToRadians(direction)
X = X + speed * Math.cos(angle);
у = у + speed * Math.sin(angle);

public void printLocation() {


System.out.println(name + " is at " +
" (" + X + ", " + у + ") . ")

public class Tests {


public static void main(String[] args) {
Ships si = new ShipS(0.0, 0.0, 1.0, 0.0, "Shipl")
Ships s2 = new ShipS(0.0, 0.0, 2.0, 135.0, "Ship2")
s1.move();
s 2.move();
si.printLocation();
s2.printLocation();
214 Глава 7. Объектно-ориентированное программирование.

Компиляция и запуск:
javac Test3.java
Java T e s t s
Результаты выполнения:
Shipl is at (1,0).
Ship2 is at (-1.41421,1.41421).

Статические инициализационные блоки


Если вам необходима более сложная языковая конструкция, чем значения, при­
сваиваемые по )ти[олчанию, но более простая, чем конструкторы, вы можете приме­
нить статический инициализационный блок, который помечается модификатором
s t a t i c и выполняется при загрузке класса. Класс загружается при создании первого
его экземпляра, при первом обращении к переменной класса либо при первом вызове
метода класса. П р и м е р статического блока приведен ниже.
public class SomeClass {
int[] values = new int[12];

static {
for (int i=0; i<values . length; i-»-+) {
values[i] = 2 * i + 5;
}
}

int lastValue = values[11];

}
В большинстве случаев действия по инициализации выполняются в теле конструк­
тора. Статические инициализационные блоки применяются крайне редко.

7.4. Деструкторы
Д а н н ы й раздел вполне мог бы отсутствовать.
Дело в том, что в Java нет необходимости в использовании деструкторов
(функций, предназначенных для разрушения объектов). После удаления последней
ссылки на объект система "сборки мусора" освобождает память, занимаемую этим
объектом. Если ссылка на объект содержится в локальной переменной, объект удаля­
ется после завершения работы метода либо раньше, при изменении значения пере­
менной. Если на объект ссылается переменная экземпляра, то объект удаляется после
присвоения этой переменной нового значения. Следует признать, что деструкторы —
не самая удобная конструкция, используемая в языке С. В Java деструкторов нет, но
программы продолжают работать нормально. В Java не может быть указателей, ссы­
лающихся на неиспользуемые области памяти. Пока переменная ссылается на объект,
этот объект продолжает существовать. В Java не могут оставаться неиспользуемые об­
ласти памяти: система "сборки мусора" освобождает память, занимаемую объектами,
7-5- Переопределение 215

ссылки на которые отсутствуют. Данная система также выявляет "кольцевые ссылки",


когда объекты ссылаются друг на друга, по не существует ни одной ссылки вне преде­
лов некоторого набора. При разработке программ на Java остается лишь проблема
"забытых" объектов, ссылки на которые существуют, но не используются, однако этот
вопрос стоит не так остро, как проблемы, характерные для языка C++.
Несмотря на операцию "сборки мусора", при разработке программ может возник­
нуть необходимость предусмотреть выполнение некоторых действий перед удалени­
ем объекта. В такой ситуации может использовать метод f i n a l i z e объекта.
p r o t e c t e d void f i n a l i z e ( ) throws Throwable {
doSomeBookkeeping();
s u p e r . f i n a l i z e { ) ; / / Использование метода f i n a l i z e r
/ / родительского класса.
}

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


throws и откуда Java знает о наличии метода f i n a l i z e . Эти вопросы будут подробно
рассмотрены несколько позже. Сейчас же вам достаточно знать, что если вы включи­
те в программу приведенный выше код, то в теле метода doSomeBookkeeping можно
выполнять необходимые действия.

7.5. Переопределение
Подобно C++ и другим объектно-ориентированным языкам, Java допускает сущест­
вование нескольких методов с одинаковыми именами. Эти методы различаются по
числу и типу передаваемых им параметров. Например, вы можете определить два ме­
тода i s B i g : один из них выявляет "большие", согласно выбранному вами критерию,
объекты S t r i n g , а другой определяет, превышает ли значение целочисленной пере­
менной некоторую заранее заданную величину.
public boolean i s B i g ( S t r i n g s) {
r e t u r n ( s . l e n g t h 0 > 10);
}

public boolean i s B i g ( i n t n) {
r e t u r n ( n > 1000);
}

Заметьте, что выражение


r e t u r n ( n > 1000);
выполняет те же действия, что и следующий фрагмент программы:
if (п > 1000) {
return(true);
} else {
return(false);
}

В листрп1ге 7.4 переопределяются конструктор Ship4 и метод move. Один конст­


руктор вызывает другой с помощью выражения t h i s ( a r g s ) . Этот вызов должен
осуществляться в первой строке конструктора. Не следует путать вызов конструктора
с переменной t h i s .
216 Глава 7. Объектно-ориентированное программирование.

public class SomeClass {


public SomeClassО {
this(12); // Вызов другого конструктора
doSomething();
}
public SomeClass(int num) {
doSomethingWith(num);
doSomeOtherStuff();
}

Вновь объявленный вариант метода move позволяет задавать число "шагов" при
перемещении судна. Определяя новый метод, вы можете создать в его тело вызов
старого метода, а можете построить программу так, что два метода будут выполняться
независимо друг от друга. В следующем примере при выполнении второго из указан­
ных методов вызывается первый метод move:
p u b l i c void move() {
double angle = d e g r e e s T o R a d i a n s ( d i r e c t i o n ) ;
X = X + speed * M a t h . c o s ( a n g l e ) ;
у = у 4- speed * Math, s i n (angle) ;
}

p u b l i c void move(int s t e p s ) {
for ( i n t 1=0; K s t e p s ; i++) {
move();
}
}

Код метода move ( i n t s t e p s ) можно переписать так, чтобы он выполнялся неза­


висимо от метода move ().
p u b l i c void move() {
double angle = d e g r e e s T o R a d i a n s ( d i r e c t i o n ) ;
X = X + speed * M a t h . c o s ( a n g l e ) ;
у = у + speed * M a t h . s i n ( a n g l e ) ;
}

p u b l i c void move2(int s t e p s ) {
double angle = d e g r e e s T o R a d i a n s ( d i r e c t i o n ) ;
X = X + ( d o u b l e ) s t e p s * speed * M a t h . c o s ( a n g l e ) ;
у = у + ( d o u b l e ) s t e p s * speed * M a t h . s i n ( a n g l e ) ;
}

Преимуществом первого из приведенных выше примеров является тот факт, что


при необходимости модификации программы изменения вносятся только в один ме­
тод. Этот пример не свободен и от недостатков; в частности, при выполнении про­
граммы производятся лишние вычисления. Противоречие между пригодностью к по­
вторному использованию программы и производительностью типично для объектно-
ориентированного программирования. В некоторых случаях это противоречие уда­
ется обойти. В других случаях производительность приносится в жертву расширяе­
мости и пригодности к повторному применению. В данном примере можно постро­
ить код метода следующим образом:
7.5. Переопределение 217

p u b l i c void move{) {
move(1);

p u b l i c void move{int s t e p s ) {
double angle = d e g r e e s T o R a d i a n s ( d i r e c t i o n ) ;
X = X + ( d o u b l e ) s t e p s * speed * M a t h . c o s ( a n g l e ) ;
у = у + ( d o u b l e ) s t e p s * speed * M a t h . s i n ( a n g l e ) ;
}

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

Листинг 7 . 4 . T e s t 4 , j a v a

class Ship4 {
public double x=0.0, y=0.0, speed=1.0, direction=0.0;
public String name;

// При вызове данному конструктору передаются параметры.

public Ship4(double х, double у, double speed,


double direction, String name) {
this.x = x;
this.у = у;
this.speed = speed;
this.direction = direction;
this.name = name;

// Данному конструктору требуется параметр name, а значения


// X, у, speed и direction принимаются по умолчанию.

public Ship4(String name) {


this.name = name;

private double degreesToRadians(double degrees) {


return(degrees * Math.PI / 180.0);

// Перемещение на один шаг.

public void move() {


move(1);

// Перемещение на N шагов.

public void move(int steps) {


double angle = degreesToRadians(direction);
X = X + (double)steps * speed * Math.cos(angle);
218 Глава 7. Объектно-ориентированное программирование...

у = у + (double)steps * speed * Math.sin(angle);


}

public void printLocation() {


System.out.println(name + " is at (" + x + "," + у + " ) . " ) ;
}
}

public class Test4 {


public static void main(String[] args) {
Ship4 si = new Ship4("Shipl");
Ship4 s2 = new Ship4(0.0, 0.0, 2.0, 135.0, "Ship2")
s1.move();
s2.move(3);
si.printLocation();
s2.printLocation();
}
}

Компиляция и запуск:
javac Test4.java
Java Test4
Результаты выполнения:
Shipl is at (1,0).
Ship2 is at (-4.24264,4.24264).

7.6. Подготовка классов к повторному


использованию
Классы, предназначенные для р е ш е н и я одной задачи, обычно определяются в од­
ном файле, как это было сделано в предыдущих примерах. Иногда при разработке
классов учитывается возможность их повторного использования. Н а п р и м е р , в лис­
тинге 7.5 представлен код класса S h i p , а в листинге 7.6— программа, предназначен­
ная для тестирования класса. Для создания повторно используемого класса надо при­
ложить гораздо больше усилий, чем обычно, в частности, необходимо добиться рас­
ширяемости кода и снабдить его документацией. П р и этом желательно использовать
описанные ниже подходы.

Заменять переменные public специальными методами доступа


Вместо непосредственного чтения и записи данных для обращения к переменным
рекомендуется использовать специальные методы, позволяющие читать и записы­
вать значения переменных. Так, например, в предыдущем примере лучше объя­
вить переменные х и у как p r i v a t e и определить методы g e t X , g e t Y , s e t X и
s e t Y (методы доступа). Несмотря на то что такой подход предполагает дополни­
тельный объем работы по созданию программ, если класс будет широко использо­
ваться, затраты впоследствии окупятся.
7.6. Подготовка классов к повторному использованию 219

Прежде всего, методы дост)^па предоставляют возможность для дальнейшей мо­


дификации класса. Предположим, например, что разработчик решил реализовать
проверку на отсутствие ошибок и собирается следить за тем, чтобы значение на­
правления не было отрицательным, либо за тем, чтобы не превышалась макси­
мально допустимая скорость судна. Если другие объекты могут непосредственно
обращаться к переменным, реализация указанных выше проверок означает моди­
ф и к а ц и ю кода всех объектов, взаимодействующих с экземплярами данного класса.
Если же для установки значений переменных применяются методы s e t X и s e t Y ,
проверка реализуется без изменения других объектов. Предположим также, что
объект S h i p является частью сложной системы моделирования и каждое измене­
ние переменных х и у должно графически отображаться на экране. Методы s e t X
и s e t Y — наилучшее место для реализации соответствующего кода.
Использование методов доступа также защищает пользователей класса от измене­
ний его структуры. Предположим, например, что разработчик решил отказаться
от хранения координат в отдельных переменных х и у и использовать для этой
цели класс P o i n t . Если из других объектов производится непосредственное обра­
щение к переменным х и у, код этих объектов должен быть изменен. Если же для
чтения и записи значений переменных применяются методы дос1упа, изменению
подлежат лишь методы g e t X и g e t Y .

Использовать javadoc для создания электронной документации


Комментарии, находящиеся между последовательностями символов " / * * " и " * / " ,
используются программой j a v a d o c для создания гипертекстовых описаний всех
методов и переменных, в объявлении которых не было использовано ключевое
слово p r i v a t e . Утилита j a v a d o c будет рассмотрена в разделе 7.7. Как и раньше,
данный подход предполагает затрату дополнительных усилий по док)ТУ1ентирова-
нию программ, но при интенсивном использовании классов затраты окупаются.
Документ, представленный на рис. 7.1, непосредственно сгенерирован по коммен­
тариям, которыми снабжен код класса S h i p . j a v a (листинг 7.5).

Листинг 7 . 5 . S h i p . j a v a

/** Пример, демонстрирующий с о з д а н и е объектно-ориентированных


* программ на J a v a .

* @author <А H R E F = " m a i l t o : l a r r y @ c o r e w e b p r o g r a i r a n i n g . c o m " >


* L a r r y Brown</A>
* @version 2.0
V

public class Ship {


// Переменные экземпляра

private double x=0.0, y=0.0, speed=1.0, direction=0.0;


private String name;

// Конструкторы

/*^ Явное указание параметров при создании объекта Ship. */


220 Глава 7. Объектно-ориентированное программирование.

public Ship(double х, double у, double speed,


double direction, String name) {
setX(x);
setY(y);
setSpeed(speed);
setDirection(direction);
setName(name);
}
/** Создание объекта Ship с использованием значений
* по умолчанию(х=0, у=0, speed=1.0, direction=0.0).

public Ship(String name) {


setName(name);
}
/** Перемещение модели судна на один шаг. При перемещении
* используются текущие скорость и направление.

public void move() {


movelnternal(1);
}
/'^'^ Перемещение на N шагов. */

public void move(int steps) {


movelnternal(steps);

private void movelnternal(int steps) {


double angle = degreesToRadians(direction);
X = X + (double)steps * speed ^ Math.cos(angle);
у = у + (double)steps * speed ^ Math.sin(angle);
}
private double degreesToRadians(double degrees) {
return(degrees * Math.PI / 180.0);
}
/** Вывод данных о размещении в стандартный выходной поток. */
public void printLocation() {
System.out.println(getName() + " is at (" + getX() +
"," + getYO + " ) . " ) ;
}
/** Определение текущей позиции X. */
public double getX() {
return(x);
}

/•k-k Установка текущей позиции X. */

public void setX(double x) {


7.6. Подготовка классов к повторному использованию 221

this.x = х;
}
/** Определение текущей позиции Y. */

public double getY() {


return(у);

/•• Установка текущей позиции У. */

public void setY(double у) {


this.у = у;
}
/** Определение текущей скорости. */

public double getSpeedO {


return(speed);
}
/•• Установка текущей скорости. '^/

public void setSpeed(double speed) {


this.speed = speed;
}
/** Получение текущего направления (О=восток, 90=север,
* 180=запад, 270=юг). В данном случае вместо мореходной
* системы (0=север, 90=запад и т.д.) используются углы,
* принятые в математике.
V
public double getDirection() {
return(direction);

j-k-k Установка текущего направления (О=восток, 90=север,


* 180=запад, 270=юг).

public void setDirection(double direction) {


this.direction = direction;
}
/** Получение имени. Имя не может быть модифицировано
* пользователем.

public String getName() {


return(name);
}
private void setName(String name) {
this.name = name;
222 Глава?. Объектно-ориентированное программирование...

It'Hn^ffiPi'illfffflllHWIWIl
File Edk View Fjvofites Tools Help

[JiSIiJ Deprecated Help


eqCVClASS NCCrCtASS
SUMUA4V; 1ЧНИ irgtD lC<;tUS^a ШрЧ^Г'С OITAlL: riCiD ICOMSTB ЫеТЧОС'

Class Ship

I
+—Ship

public class $1ф


extends Object

Ship exunpk to demonstnte OOP in Java.

Itpj &yow}t

Constructor Sununaiy
iSli4fi<<iovaji* X, doubi* y , doubit s p « t d , doublt dirtction,
S'ibSLljUiil пале)
Build a sbp with specified perametere.
:SMp<S':vin:t n*ike)
\ Build a ship with default values (хЧЗ, y-0, sp«ed-l .0, di«ction-0.0).

Method Smmnary
d
; ^ My Compu»«
с
Рис. 7.1. Программа javadoc генерирует гипертек­
стовые документы по исходному коду Java

Листинг7.6. ShipTest.Java

p u b l i c c l a s s ShipTest {
p u b l i c s t a t i c void m a i n ( S t r i n g [ ^ args) {
Ship s i = new S h i p ( " S h i p l " ) ;
Ship s2 = new S h i p ( 0 . 0 , 0 . 0 , г.Or 135.0, "Ship2");
s1.move();
s2.move(3);
si.printLocation();
s2.printLocation();
}
}

Компиляция и запуск:
javac ShipTest.Java
Java ShipTest
Первая из приведенных выше двух команд вызывает программу j a v a c для компи­
ляции файла S h i p . Java. Java-компилятор автоматически проверяет дату создания
7.7. Javadoc 223

каждого из файлов . c l a s s , которые используются компилируемым классом, сравни­


вает ее с датой создания исходного файла (если он дост)'пен) и при необходимости
выполняет повторную компиляцию файла. Таким образом, при работе с Java нет не­
обходимости использовать make-файлы; компилятор непосредственно п р о в е р я е т со­
ответствие файлов классов исходным файлам. Если вы хотите, чтобы файл . c l a s s
остался неизменным, несмотря на то, что файл . J a v a был модифицирован, перемес­
тите исходный файл в отдельный каталог.

На заметку
При работе с Java нет необходимости в применении таке-файлов.
Компилятор javac автоматически проверяет соответствие дат соз­
дания всех непосредственно связанных классов.

Результаты выполнения:
Shipl is at (1,0).
Ship2 i s a t ( - 4 . 2 4 2 6 4 , 4 . 2 4 2 6 4 ) .

7.7.Javadoc
п р о г р а м м а j a v a d o c распространяется в составе JDK, a также вместе с продуктами
независимых производителей. Эта утилита использует для генерации документации
комментарии, помещенные между последовательностями символов " / * * " и " * / " .
В состав документов могут включаться гипертекстовые ссылки на другие системные
классы и классы, определенные пользователем. О б ы ч н о комментарии j a v a d o c по­
мещаются перед определением класса, а также перед методами и переменными, в
объявлении которых не используется ключевое слово p r i v a t e . Первое предложение
в описании метода или переменной используется для ф о р м и р о в а н и я индекса вверху
страницы, а полное описание помещается в нижней части документа. Для построения
документации надо вызвать программу j a v a d o c и предать ей одно или несколько
имен файлов либо пакетов. Например:
javadoc Foo.java
javadoc Foo.java Bar.Java
javadoc graphics.newWidgets
javadoc graphics.newWidgets math.geometry
П р и вызове j a v a d o c можно также задавать различные опции. Допустимые опции
будут рассмотрены ниже в этом разделе, здесь же мы приведем лишь следующие про­
стые примеры:
javadoc -author -version SomeClass.Java
javadoc -noindex -notree somePackage
Рассмотрению пакетов посвящен раздел 7.10.
По умолчанию программа j a v a d o c использует для генерации HTML-данных стан­
дартный доклет-шаблоп. Доклет распознает в составе комментариев не только текст,
но и HTML-разметку. Поэтому вы можете использовать выражения типа <А
HREF=" . . . "> для ф о р м и р о в а н и я ссылок на Web-страницу организации и на другие
ресурсы, элементы IMG для включения копий экрана демонстрирующих программу в
224 Глава 7. Объектно-ориентированное программирование...

работе, и даже элементы APPLET, иллюстрирующие особо важные особенности ваше­


го класса. В состав javadoc-комментариев не стоит включать заголовки, поскольку
они могут нарушить общепринятую структуру документов, сгенерированных
j avadoc. Лишние пробелы, не включенные в состав элемента PRE, игнорируются.
Если вы хотите, чтобы документы генерировались в другом формате, вам надо на­
писать собственный доклет. Док)'ментацию по j a v a d o c и доклетам можно найти по
следующим адресам:

Исходная страница Javadoc 1.3


http://Java.sun.com/j2se/l.3/docs/tooldocs/javadoc/

Javadoc Tool Reference Page


http://Java.sun.com/j2se/l.3/docs/tooldocs/solaris/javadoc.html
http://Java.sun.com/j2se/l.3/docs/tooldocs/win32/javadoc.html

Общие сведения о доклетах и документация по API


http://Java.sun.com/j2se/l.3/docs/tooldocs/javadoc/overview.html
http://Java.sun.com/j2se/l.3/docs/tooldocs/javadoc/doclet/

Дескрипторы javadoc
в дополнение к элементам разметки HTML в j a v a d o c определены специальные
дескрипторы, которые включаются в состав комментариев для достижения требуе­
мых результатов. Так, например, дескриптор @param используется для описания па­
раметров, передаваемых методу, @return — для описания возвращаемых значений, а
@see — для определения ссылок на классы и методы, имеющие отношение к рассмат­
риваемом)^ элементу программы. Ниже приведен фрагмент комментариев, в котором
используются указанные дескрипторы.
/** Преобразование градусов в радианы.
* @param degrees Значение угла в градусах.
* @return Значение угла в радианах.
* @see t r a d i a n s T o D e g r e e s .

p u b l i c double degreesToRadians(double degrees) {


r e t u r n ( d e g r e e s * Math.PI / 1 8 0 . 0 ) ;
}

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


считается текст, помещенный между текущим и следующим дескрипторами либо ме­
жду дескриптором и окончанием комментариев.
Ниже описаны дескрипторы, которые могут быть помещены в состав коммента­
риев. Если не оговорено особо, считается, что дескриптор поддерживается JDK 1.1 и
более новыми версиями пакета.
7.7. Javadoc 225

©author
Д е с к р и п т о р @ a u t h o r задает сведения об авторе. Ч т о б ы данный дескриптор учи­
тывался при создании документа, необходимо задать команду " j a v a d o c - a u t h o r
. . .". В составе дескриптора @ a u t h o r допустимы HTML-элементы разметки, на­
пример:
/** Описание класса SomeClass

* @author <А HREF="mailto:ellison@microsoft.com">


* Larry Ellison</A>
V
©deprecated
Д е с к р и п т о р @ d e p r e c a t e d обозначает классы, поля и методы, которые не реко­
мендованы для дальнейшего использования, но продолжают поддерживаться для
обеспечения совместимости с предыдущими версиями. Не исключено, что в по­
следующих реализациях эти классы, поля и методы будут удалены.

{@docRoot}[Java 1.3]
Д а н н ы й дескриптор представляет относительный путь от сгенерированного доку­
мента до корневого док^'мента в иерархии пакетов. Этот дескриптор удобно при­
менять тогда, когда создается документация для большого пакета со многими под­
каталогами; с его помощью п р и н я т о ссылаться на страницу с лицензионными дан­
ными, расположенную в корневом каталоге. Например, если в документе
c o r e w e b p r o g r a m m i n g / S h i p . J a v a требуется ссылка на лицензионную информа­
цию, то выражение
<а href="{@docRoot}/license.html">
будет и н т е р п р е т и р о в а н о как
<а href="../license.html">
П р и этом предполагается, что файл licence.html находится в каталоге
corewebprograiraning.

©exception
Данный дескриптор, за которым после пробела должно быть указано имя класса
исключения, описывает методы и конструкторы.

{@link}Uaval.2]
Данный дескриптор аналогичен дескриптору 0 s e e , за исключением того, что вме­
сто раздела "See Also" (см. также) в документе генерируется гипертекстовая ссыл­
ка. Д а н н ы й дескриптор применяется в описаниях для создания ссылок на другие
методы. Н а п р и м е р , в описании S h i p . J a v a может содержаться приведенный ни­
же фрагмент.
То change the location of a ship use
{(Slink #move(int) move}.
226 Глава 7. Объектно-ориентированное программирование...

Он будет преобразован следующим образом:


То change the location of a ship use
<a href="Ship.html#move(int)">move</a>.

@param
Дескриптор @param описывает параметры, передаваемые методу (или конструк­
тору). За дескриптором должно следовать имя параметра, за которым после про­
бела располагается описание этого параметра.

©return
Данный дескриптор описывает значение, возвращаемое методом.

@see
Дескриптор @see создает ссылки на описания других методов или классов. Перед
именем метода задаются имя класса и символ "#". Если метод принадлежит теку­
щему классу, имя класса не указывается. Например:

* @see #getWidget
* @see Widget
* @see Frob#setWidget
V
public void setWidget(Widget w) { ... }

@serial[Java 1.2]
@serialData[Java 1.2]
@serialField[Java 1.2]
Эти три дескриптора предназначены для того, чтобы описывать классы, допускаю­
щие вывод в поток ( S e r i a l i z a b l e ) . Первый дескриптор описывает поля, которые
подлежат записи в поток. Второй дескриптор описывает все поля ObjectStream
F i e l d , а третий задает последовательность и типы данных E x t e r n a l i z a b l e . Под­
робную информацию об этих дескрипторах вы найдете в документе h t t p : / / J a v a .
sun.com/j 2 s e / l . 3 / d o c s / g u i d e / s e r i a l i z a t i o n / s p e c / s e r i a l - a r c h . d o c 6 . h t m l .
©since
Данный дескриптор создает раздел "Since", используемый для документирования
добавляемых классов, полей или методов. Его удобно применять при описании
модифицируемых классов и пакетов, так как он позволят отличить вновь создан­
ные элементы от элементов, существующих давно.

©throwsljava 1.2]
Дескриптор @throws описывает исключение, генерируемое классом или методом.
За дескриптором указываются имя класса исключения, пробел и описание исклю­
чения.
7.7. Javadoc 227

©version
Д е с к р и п т о р A v e r s i o n используется при документировании класса и задает номер
версии. Ч т о б ы программа j a v a d o c учитывала данный дескриптор, ее надо вы­
звать следующим образом: " j a v a d o c - v e r s i o n . . . ".

Параметры командной строки javadoc


Программа j a v a d o c позволяет задавать опции, которые управляют ее выполне­
нием. Н а п р и м е р , чтобы разрешить обработку дескрипторов @ a u t h o r и @ v e r s i o n , а
также подавить индексирование и генерацию иерархии классов, можно использовать
следующее выражение.
javadoc -author -version -noindex -notree Class.Java
В JDK l.S при использовании стандартного доклет-шаблона доступны более 40 оп­
ций j a v a d o c . Н и ж е перечислены лишь наиболее часто применяемые опции.

-author
Данная опция )тсазывает j a v a d o c на то, что в результирующий документ должна быть
включена информация об авторе. По умолчанию эта информация игнорируется.

-bottom[Java 1.2]
Опция b o t t o m задает текст, который помещается в нижней части каждого выход­
ного д о к ) ^ е н т а . Текст располагается ниже навигационной строки. Если в тексте
содержатся пробелы, его надо заключить в кавычки.

-classpath
-sourcepath
Д а н н ы е опции указывают j a v a d o c , где надо искать заданные файлы . J a v a .
Для разделения каталогов в Solaris используется двоеточие, а в Windows — точка с
запятой. Каталоги, перечисленные в переменной окружения CLASS PATH, участву­
ют в поиске автоматически.

-d
Д а н н ы й флаг задает целевой каталог для HTML-файлов. В качестве значения мо­
жет быть приведено абсолютное либо относительное имя каталога. Если данная
опция не указана, HTML-файлы помещаются в тот же каталог, в котором находят­
ся исходные файлы. Часто с помощью опции - d задают каталог, в котором уже на­
ходится подкаталог i m a g e s , содержащий файлы, используемые в описаниях.

-encoding
-docencoding
Данная опция позволяет указать кодировку символов для исходного файла
( - e n c o d i n g ) либо для документа ( - d o c e n c o d i n g ) .
228 Глава 7. Объектно-ориентированное программирование...

-link [Java 1.2]


-linkoffline [Java 1.2]
Опция l i n k указывает j a v a d o c , где следует искать информацию для преобразо­
вания ссылок на другие пакеты. Например, при преобразовании ссылок на доку­
менты, содержащиеся на узле j a v a . s u n . c o m , используется следующее значение
опции l i n k :
-link http://Java.sun.com/j2se/l.3/docs/api
Реально программа j a v a d o c использует для преобразования ссылок на внешние
пакеты файл p a c k a g e - l i s t , расположенный по указанному выше URL. При от­
сутствии доступа к Internet для указания локальной копии файла p a c k a g e - l i s t
используется опция l i n k o f f l i n e . Если вы установили локальную копию докумен­
тации JDK 1.3, список Java-пакетов находится в каталоге / r o o t / j d k l . 3 / d o c s /
a p i . Чтобы преобразовать внешние ссылки на платформе Windows, надо исполь­
зовать следующее выражение:
-linkoffline http://Java.sun.com/j2se/l.3/docs/api
c:\jdkl.3\docs\api

-J
Инструмент j a v a d o c сам no себе является Java-программой. Опция - J позволяет
передавать параметры непосредственно в среду выполнения Java. Например, если
набор документов очень велик, вы можете задать большой (24 Мбайт) исходный
размер посредством следующего вырг1жения:
javadoc -J-ms24m . . .

-nodeprecated
-nodeprecatedlist [Java 1.2]
Первая из указанных опций сообщает javadoc о том, что записи о компонентах, не
рекомендованных для применения, должны быть исключены из документов. Вторая
опция запрещает создание документа d e p r e c a t e d - l i s t . h t m l и исключает ссылку
на компоненты, не рекомендованные для применения, из навигационной строки.
Информация о подобных компонентах генерируется и включается в документы.

-noindex
Данная опция указывает j a v a d o c на то, что документ AllNames . html не должен
создаваться. Индексирование удобно при описании пакетов. При создании доку­
ментации на отдельные классы его часто запрещают.

-nonavbar [Java 1.2]


Опция nonavbar запрещает генерацию навигационной строки в верхней и ниж­
ней части документа.

-notree
Данная опция указывает j a v a d o c на то, что иерархия классов t r e e . h t m l не
должна генерироваться.
7.7. Javadoc 229

-public
-protected
-package
-private
Данные опции позволяют указать, какие классы, поля и методы должны быть до­
кументированы. В приведенном выше перечне они расположены так, что каждая
последующая опция приводит к возрастанию объема данных в документе по срав­
нению с предыдущей. По умолчанию предполагается опция p r o t e c t e d , которая
задает документирование всех компонентов, объявленных как p u b l i c и p r o ­
t e c t e d . Такие описания чаще всего требуются пользователям, однако разработ­
чикам, которым приходится модифицировать содержимое классов, могут понадо­
биться данные о компонентах, объявленных как p r i v a t e .

-splitindex [Java 1.2]


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

-verbose
Данная опция указывает j a v a d o c на то, что при работе программы должна выво­
диться информация о времени, затраченном на разбор каждого файла.

-version
Опция v e r s i o n включает в документ номер версии, заданный с помощью деск­
риптора @ v e r s ion. По умолчанию номер версии не включается.

-windowtitle [Java 1.2]


Данная опция задает генерацию в составе HTML-документа заголовка, который
отображается в строке заголовка броузера. Текст, указанный в кавычках после
имени опции, помещается между дескрипторами < t i t l e > и < / t i t l e > созданного
HTML-документа. В заголовке недопустимы элементы разметки.
Приведенный ниже вызов утилиты j a v a d o c используется с JDK L3, установлен­
ным в системе Windows 98, и генерирует HTML-документ, показанный на рис. 7.L
>javadoc - a u t h o r - v e r s i o n -noindex - n o t r e e
-linkoffline
http://Java.sun.com/j2se/l.3/docs/api
c : \ j d k l . 3 \ d o c s \ a p i Ship.Java
Если число опциР! велико, общее количество символов может превысить максималь­
ную длину командной строки в конкретной системе. В таких случаях надо создать make-
файл для javadoc. Примеры make-файлов для Windows приведены в документе, распо­
ложенном по адресу h t t p : / / j a v a . s u n . c o m / p r o d u c t s / j d k / j a v a d o c / m a k e f i l e s .
Подобные файлы для других платформ можно найти в документе Javadoc Tool Reference
Page, расположенном по адресу h t t p : / / j a v a . s u n . e o m / j 2 s e / l . 3 / d o c s t o o l d o c s /
javadoc/index.html.
230 Глава 7. Объектно-ориентированное программирование.

7.8. Наследование
Наследование состоит в том, что новый класс создается на базе имеющегося клас­
са; при этом код существующего класса остается неизменным. Для обозначения на­
следования классов используется ключевое слово e x t e n d s . Исходный класс принято
называть родительским классом, или суперюшссом (в терминологии C++ он называется
базовым классом). Н о в ы й класс, созданный на основе существующего, называют до­
черним классом, или подклассом (в C++ такой класс называют порожденным). Конст­
руктор дочернего класса может непосредственно вызвать конструктор родительского
класса; для этого надо поместить в первой строке нового конструктора выражение
s u p e r . Ниже приведен код простого примера.
// ParentClass.Java: используется в роли суперкласса.
// Содержит поля а и Ь, а также методы foo и bar.
/ / В данном классе определены два конструктора.

public class ParentClass {


public int a;
private int b;

public ParentClass() { ... }


public ParentClass(double z) { ... }

public String foo(int x. String s) { ... }

private void bar() { ... }


}

// ChildClass.Java: подкласс класса ParentClass.


// Наследует поля a и b, a также методы foo и bar.
// Кроме того, в классе объявлены поле с и метод
// baz. Один из конструкторов ChildClass вызывает
// конструктор ParentClass.

public class ChildClass extends ParentClass {


public int c;

public ChildClass(double z) {
super(z); // Вызов конструктора ParentClass

p u b l i c void b a z ( b o o l e a n isReady) {
}

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


суперкласса посредством ключевого слова s u p e r , то перед выполнением первой ко­
манды конструктора подкласса автоматически вызывается конструктор суперкласса
без параметров. В этом случае, если в суперклассе не определен конструктор с нуле­
вым числом параметров, при компиляции отображается сообщение об ошибке. Как
вы уже знаете когда конструктор класса не определен, конструктор с нулевым числом
параметров создается автоматически. Если же разработчик определил хотя бы один
конструктор, другой конструктор автоматически не создается.
7 . 8 . Наследование 231

На з а м е т к у

Для вызова конструктора суперкласса надо поместить в первую


строку конструктора подкласса выражение super. Если вызов кон­
структора суперкласса явно не указан, вызывается конструктор с
нулевым числом параметров.

Одним из преимуществ наследования является возможность переопределять в до­


черних классах методы родительских icTiaccoB. Метод, переопределяемый в дочернем
классе, должен иметь то же имя, то же число параметров и тот же тип возвращаемого
значения. П р и необходимости из метода дочернего класса может быть вызван метод
родительского класса. Для этого используется следующее выражение:
super. имя_переолределенного__метода (...)
Выражение s u p e r , s u p e r недопустимо, поэтому вызвать метод класса, который
выст)щает как родительский по о т н о ш е н и ю к суперклассу, невозможно. П р и необхо­
димости вы можете расширить область видимости переопределенного метода. На­
пример, если в родительском классе метод был определен как p r o t e c t e d , то в дочер­
нем классе его можно объявить как p u b l i c .
С наследованием связано одно распространенное заблуждение: многие считают,
что при обращении к любому методу родительского класса необходимо указывать
ключевое слово s u p e r . На самом деле оно необходимо только в том случае, когда ме­
тод с одним и тем же именем определен как в родительском, так и в дочернем классе,
т.е. когда метод переопределен в дочернем классе. Обращаться из дочернего класса к
методам, которые не были переопределены, можно с указанием только имени; клю­
чевое слово s u p e r не обязательно.

На з а м е т к у

Методы родительского класса доступны из дочернего класса по


имени. Ключевое слово super необходимо только для обращения к
методам родительского класса, которые были переопределены в
дочернем классе.

П р и необходимости разработчик может также переопределять п е р е м е н н ы е роди­


тельского класса, однако на практике эта возможность никогда не используется. По­
добное переопределение приведет к тому, что в экземпляре дочернего класса появят­
ся две переменные с одинаковыми именами: одна будет использоваться при работе
методов дочернего класса, а другая — при выполнении методов родительского класса.
Такую программу очень трудно отлаживать.
Рассмотрим пример наследования и переопределения методов. В листинге 7.7 по­
казан класс S p e e d b o a t , в котором добавлены переменные и методы для работы с
цветом и переопределен метод p r i n t L o c a t i o n . Код, предназначенный для проверки
функционирования класса, приведен в листинге 7.8.
232 Глава 7. Объектно-ориентированное программирование.

Листинг 7.7. Speedboat.java

/** Специальный тип судна. Отображается красным цветом


* и по умолчанию развивает скорость 20 узлов. */

public class Speedboat extends Ship {


private String color = "red";

/** Конструктор класса Speedboat, для которого скорость


* и цвет принимаются по умолчанию. */

public Speedboat(String name) {


super(name);
setSpeed(20) ;
}
/** Конструктор класса Speedboat с параметрами. */

public Speedboat(double x, double y, double speed,


double direction. String name.
String color) {
super(x, y, speed, direction, name);
setColor(color);
}

/** Вывод сообщения о расположении. Метод переопределен. */

public void printLocation() {


System.out.print(getColor().toUpperCase() + " " ) ;
super.printLocation0;

/** Получение информации о цвете объекта Speedboat. */

public String getColor() {


return(color) ;

j-k-k Установка цвета объекта Speedboat. */

public void setColor(String colorName) {


color = colorName;
7.9. Интерфейсы и абстрактные классы 233

Листинг 7.8.SpeedboatTest.Java

/** Программа, использующая объекты Speedboat и Ship. */


public class SpeedboatTest {
public static void main(String[] args) {
Speedboat si = new Speedboat{"Speedboatl");
Speedboat s2 = new Speedboat(0.0, 0.0, 2.0, 135.0,
"Speedboat2", "blue");
Ship s3 = new Ship(0.0, 0.0, 2.0, 135.0, "Shipl");
s1.move();
s 2.move() ;
s 3.move();
si.printLocation()
s2.printLocation()
s3.printLocation()

Компиляция и запуск:
javac -depend SpeedboatTest.Java
Java SpeedboatTest
Первгш из приведенных выше команд автоматически обрабатывает файлы
S p e e d b o a t . j ava и S h i p . j ava.
Результаты выполнения:
RED Speedboatl is at (20,0).
BLUE Speedboat2 is at (-1.41421,1.41421).
Shipl is at (-1.41421,1.41421).
В отличие от C++ и L i s p / C L O S , в Java запрещено множественное наследование.
lOiacc может иметь сколь угодно подклассов, но только один суперкласс. В этом Java
похож на Smaltalk. Несмотря на то что работать с одним суперклассом очень удобно,
множественное наследование также имеет свои преимущества. В Java аналогичных
результатов можно добиться, применяя и н т е р ф е й с ы , которые будут рассмотрены в
следующем разделе.

7.9. Интерфейсы и абстрактные классы


Предположим, что вы собираетесь определить класс, который выступал бы в каче­
стве родительского для других классов, но хотите, чтобы пользователь не мог созда­
вать экземпляр этого класса. Разработчики поступают так в тех случаях, когда необхо­
димо задать в общих чертах поведение класса, но нет достаточной и н ф о р м а ц и и для
того, чтобы детально определить все особенности его работы. Подобный класс объ­
является с помощью модификатора a b s t r a c t как абстрактный, в результате при по­
пытке создать экземпляр этого класса компилятор отображает сообщение об ошибке.
В листинге 7.9 показан код абстрактного класса S h a p e . Подклассы этого класса будут
содержать методы, предназначенные для чтения и установки значений полей класса
(getX, g e t Y и т.д.), однако экземпляр класса S h a p e создать невозможно.
234 Глава 7. Объектно-ориентированное программирование...

Листинг 7.9. Shape.java

/•• Родительский класс для разнообразных форм. */

public abstract class Shape {


protected int x, y;

public int getX () {


return(x);
}
public void setX(int x) {
this.x = x;

public int getYO {


return(y);
}
public void setY(int y) {
this.у = у;
}
}

Java также позволяет создавать абстрактные методы — методы, в которых объяв­


ляются типы параметров и тип возвращаемого значения, а тело которых отсутствует.
public ReturnType methodName(Typel argl, Type2 arg2);
Классы, содержащие абстрактные методы, должны быть объявлены как абстракт­
ные. Если в подклассах этих классов не переопределяются все абстрактные методы,
подклассы также должны быть объявлены как абстрактные. Абстрактные методы по­
лезны в тех случаях, когда необходимо определить набор методов, задающих поведе­
ние всех подклассов данного класса, причем в разных подклассах эти методы должны
реализовываться по-разному.
Поскольк)^ в классе S h a p e абстрактные методы отсутствуют, его подклассы могут
быть как абстрактными, так и обычными классами. В листингах 7.10 и 7.11 показаны
коды двух абстрактных подклассов класса S h a p e . Один из них предназначен для
представления кривых, другой — для представления фигур, составленных из прямых
и отрезков.

Листинг 7 . 1 0 - C u r v e . j a v a

/ • * Форма, с о с т а в л е н н а я и з кривых (открытая или з а к р ы т а я ) .


* В п о д к л а с с ы будут включены с р е д с т в а для п о с т р о е н и я дуг
* и окружностей.
Ч

public abstract class Curve extends Shape {}


7.9. Интерфейсы и абстрактные классы 235

Листинг 7.11.StraightEdgedShape.Java

/*• Форма с углами (открытая или закрытая). Подклассами


* данного класса являются Line, LineSegment,
* LinkedLineSegments и Polygon.

public abstract class StraightEdgedShape extends Shape {}

Предположим теперь, что вам надо создать подкласс C i r c l e класса C u r v e , в ко­


тором будет присутствовать метод, предназначенный для вычисления площади фигу­
ры. Вы можете создать такой подкласс (не объявляя его как a b s t r a c t ) и реализовать
в нем метод g e t A r e а. Д а н н ы й подход вполне устроит вас до тех пор, пока круг оста­
ется единственной геометрической фигурой, площадь которого подлежит вычисле­
нию. Однако вы планируете также создать подкласс R e c t a n g l e класса
S t r a i g h t E d g e d S h a p e , площадь которого также можно вычислить. Т е п е р ь создание
универсальной программы, обрабатывающей площади фигур, вызывает затруднения,
поскольку у классов R e c t a n g l e и C i r c l e нет общего предка, содержащего метод
g e t A r e а. Предположим, например, что вам надо создать массив ф и г ) р , площади ко­
торых необходимо сложить. Массив C i r c l e [] не содержит прямоугольники, а мас­
сив R e c t a n g l e [ ] не может содержать круги. Массив S h a p e [ ] также не подходит для
указанной цели, поскольку^ в нем нет метода g e t A r e а. Если вам надо будет определить
фиг)ру с максимальной площадью, какой параметр вы передадите методу maxArea?
Это не может быть класс S h a p e , поскольку некоторые фигуры не имеют площади
(например, отрезки, д\ти и т.п.). Таким образом, работая с классами, не удается найти
простого решения данной проблемы.
Для решения подобных задач в Java предусмотрен механизм и н т е р ф е й с о в . Интер­
фейс представляет собой "полностью абстрактный" класс, в котором все методы яв­
ляются абстрактными. И н т е р ф е й с отличается от класса только тем, что класс может
реализовать несколько интерфейсов. Класс, реализующий и н т е р ф е й с , должен содер­
жать определения всех методов, объявленных в интерфейсе, либо быть определен
как абстрактный. Простой п р и м е р интерфейса приведен в листинге 7.12.

Листинг 7 . 1 2 . I n t e r f a c e l . j a v a

public interface Interfacel {


ReturnTypel methodl(ArgTypel arg)
ReturnType2 method2(ArgType2 a r g ) ;
}

В данном случае вместо c l a s s используется ключевое слово i n t e r f a c e , а тело


методов отсутствует; заголовок каждого метода заканчивается точкой с запятой (как в
случае абстрактных методов). Заметьте, что ключевое слово p u b l i c не указывается;
методы по умолчанию считаются общедоступными. Класс, реализующий этот интер­
фейс, показан в листинге 7.13.
236 Глава 7. Объе1стно-ориентированное программирование.

Листинг 7.13.Classl.Java

// Данный класс не является абстрактным, поэтому он должен


// содержать определения methodl и method2.

public class Classl extends SomeClass


implements Interfacel {
public ReturnTypel methodl(ArgTypel arg) {
someCodeHere();

public ReturnType2 rnethod2(ArgType2 arg) {


someCodeHere0;

Еще один интерфейс представлен в листинге 7.14.

Листинг 7.14. Interfасе2.java

public interface Interface2 {


ReturnType3 methods(АгдТуреЗ arg) ;

В листинге 7.15 приведен код класса, реализующего оба представленных выше ин­
терфейса.

Листинг 7.15,Class2,java

// Данный класс объявлен как abstract, поэтому в нем


// не обязательно реализовывать методы, объявленные в
// интерфейсах Interfacel и Interfасе2.

public abstract class Class2 extends SomeOtherClass


implements Interfacel,
Interface2 {

}
7.9. Интерфейсы и абстрактные классы 237

Конкретный подкласс класса C l a s s 2 показан в листинге 7.16.

Листинг 7 . 1 6 . C l a s s 3 . j a v a

/ / Данный класс не является абстрактным, поэтому он должен


/ / реализовывать методы methodl, methoci2 и methods.
p u b l i c c l a s s Class3 extends Class2 {
p u b l i c ReturnTypel methodl(ArgTypel arg) {
someCodeHere() ;

public ReturnType2 method2{ArgType2 arg) {


someCodeHere();

public ReturnTypeS methods(АгдТуреЗ arg)


someCodeHere() ;

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


не может быть создан. Однако интерфейс может расширять (но не реализовывать)
один или несколько других интерфейсов (если интерфейс расширяет несколько дру­
гих интерфейсов, они разделяются запятыми). Таким образом, подобно иерархии
классов, может быть создана иерархия интерфейсов. Интерфейс не может содержать
переменные экземпляра, но в нем могут быть определены константы. Ключевые сло­
ва p u b l i c , s t a t i c и f i n a l при определении констант предполагаются по умолча­
нию, поэтому они могут не указываться. Пример определения констант в составе ин­
терфейса приведен в листинге 7.17.

Листинг 7 . 1 7 . I n t e r f a c e s . J a v a

/ / Данный интерфейс наследует объявление трех методов.


/ / Кроме того, в нем определены две константы.
p u b l i c i n t e r f a c e I n t e r f a c e s extends Interfacel,
Interface2 {
i n t MIN_VALUE = 0;
i n t MAX VALUE = 1000;

Каким же образом интерфейсы могут помочь в создании иерархии классов Shape?


Дело в том, что методы могупг ссылаться на интерфейсы так же, как и на реальные
классы. Вы можете создать интерфейс Measurable, показанный в листинге 7.18.
238 Глава 7. Объектно-ориентированное программирование.

Листинг 7.18.Measurable.j ava

/** Используется в классах, позволяющих вычислять


* площади фигур.

public interface Measurable {


double getAreaO;

Затем при определении класса Circle можно указать, что он реализует интер­
фейс Measurable (листинг 7.19).

Листинг 7.19.Circle.Java

/•• Круг (класс Circle). Поскольку площадь круга можно вычислить,


* класс Circle реализует интерфейс Measurable.

public class Circle extends Curve implements Measurable {


private double radius;

public Circle(int x, int y, double radius) {


setX(x) ;
setY(y);
setRadius(radius);
}
public double getRadius() {
return(radius);

public void setRadius(double radius)


this.radius = radius;
}
/** Обращения к интерфейсу Measurable. */

public double getAreaO {


returi> (Math. PI * radius * radius);

Наличие интерфейса Measurable позволяет ссылаться на классы, реализующие


этот интерфейс, не указывая конкретно, какие классы принадлежат к данной катего­
рии. Пример приведен в листинге 7.20.
7.9. Интерфейсы и абстрактные классы 239

Листинг 7.20.MeasureUtil.Java

/** Некоторые операции над классами, реализующим]^! интерфейс


'^ Measurable.
V
public class MeasureUtil {
public static double maxArea(MeasuraUDle ml,
Measurable m2) {
return(Math.max(ml.getArea(), m2.getArea()));
}
public static double totalArea(Measurable[] mArray) {
double total = 0;
for(int i=0; i<mArray.length; i++) {
total = total + mArray[i].getArea0;
}
return(total);
}
}

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


M e a s u r a b l e , автоматически становятся доступны методам класса M e a s u r e U t i l .
В качестве примера в листингах 7.21 и 7.22 показаны абстрактный класс P o l y g o n и
один из его конкретных подклассов. Все многоугольники имеют площадь, которая
может быть измерена, но для каждого типа многоугольника площадь вычисляется по
конкретному алгоритму.

Листинг7.21. Polygon.java

/ * * З а к р ы т а я форма с у г л а м и . */

p u b l i c a b s t r a c t c l a s s Polygon e x t e n d s StraightEdgedShape
implements Measurable {
p r i v a t e i n t numSides;

p u b l i c i n t getNumSides() {
return(numSides);

protected void setNumSides(int numSides) {


this.numSides = numSides;
}
}
240 Глава 7. Объектно-ориентированное программирование..

Листинг 7.22. Rectangle. java

/** В классе Rectangle определен метод getArea, объявленный


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

public class Rectangle extends Polygon {


private double width, height;

public Rectangle(int x, int y,


double width, double height) {
setNumSides (2);
setX(x);
setY(y);
setWidth(width);
setHeight(height);
}
public double getWidth() {
return(width);

public void setWidth(double width) {


this.width = width;
}
public double getHeightO {
return(height);

public void setHeight(double height) {


this.height = height;
}
/** Данный метод необходим, если класс реализует
* интерфейс Measurable.
Ч
public double getAreaO {
return(width * height);
}
}

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


не приводит к существенному увеличению объема кода в иерархии классов S h a p e .
Определение интерфейса M e a s u r a b l e занимает три строки, а для того, чтобы ука­
зать, что класс расширяет данный и н т е р ф е й с , в определении класса достаточно доба­
вить " i m p l e m e n t s M e a s u r a b l e " . Однако применение данного интерфейса экономит
много времени и усилий при создании класса M e a s u r e U t i l и делает его код нечувст­
вительным к изменениям, вносимым в классы, содержащие ^методы g e t A r e a . Простая
программа для проверки работы класса M e a s u r e U t i l приведена в листинге 7.2S.
7.9. Интерфейсы и абстрактные 1слассы 241

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


ют абсолютно все преимущества множественного наследования (способность класса
иметь более одного родительского класса), но гораздо проще в использовании. Даже
если учесть, что такие утверждения исходят от программистов, не имеющих доста­
точного опыта в применении множественного наследования, все равно следует при­
знать, что и н т е р ф е й с ы — удобный механизм, упрощающий р е ш е н и е многих задач.
И н т е р ф е й с ы буд\т часто встречаться далее в этой книге. Если же вы программирова­
ли прежде на языке, поддерживающем множественное наследование (например, C++,
Eiffel, L i s p / C L O S ) , вы, наверное, скажете, что Java не реализует все возможности, к
которым вы привыкли.

Листинг 7.23. MeasureTest.java

/** Проверка работы MeasureUtil. Заметьте, что в состав


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

public class MeasureTest {


public static void main(String[] args) {
Measurable[] measurables =
{ new Rectangle(0, 0, 5.0, 10.0),
new Rectangle(0, 0, 4.0, 9.0),
new Circle(0, 0, 4.0) ,
new Circle(0, 0, 5.0) };
System.out.print("Areas:");
for(int i=0; i<measurables.length; i++)
System.out.print(" " + measurables[i].getArea());
System.out.println();
System.out.println("Larger of 1st, 3rd: " +
MeasureUtil.maxArea(measurables[0] ,
measurables[2]) +
"\nTotal area: " +
MeasureUtil.totalArea(measurables));

С точки зрения пользователя класса (разработчика M e a s u r e U t i l ) интерфейсы


предпочтительнее; благодаря им класс может принадлежать различным иерархиям,
при этом не возникают проблемы, типичные для множественного наследования. Од­
нако с точки зрения разработчика класса и н т е р ф е й с ы мало чем могут помочь ему.
В частности, и н т е р ф е й с ы не позволяют наследовать реализации методов, что сокра­
тило бы время, требуемое для разработки. Предположим, наприхмер, что у вас есть
набор кнопок, окон и полей ввода текста, каждое из которых содержит поле с име­
нем, предназначенное для отладки, а также метод d e b u g , к о т о р ы й выводит данные о
расположении, родительском окне и имя компонента. Работая на Java, приходится
повторять этот код в каждом подклассе, в то время как множественное наследование
позволило бы сосредоточить всю необходимую логику в рамках родительского класса
(Debuggable).
242 Глава 7. Объектно-ориентированное программирование...

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


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

7.10. Пакеты, CLASSPATH и JAR-архивы


Java дает возможность объединять библиотеки классов в отдельные модули, или
пакеты. Это позволяет избежать конфликтов имен и упрощает процесс сопровожде­
ния. Например, если бы при работе над реальным проектом иерархии классов Ship и
Shape находились в различных пакетах, работать с ними было бы намного удобнее.
Для создания пакета с именем packagename надо создать каталог с таким именем и
поместить в него все исходные файлы. В начале каждого из файлов должно содер­
жаться следующее выражение:
package packagename;
Файлы, в которых декларация пакета отсутствует, автоматически помещаются в
неименованный пакет. Файлы, использующие пакет, должны содержать выражение
import packagename.ClassName;
или
import packagename.*;
Это выражение должно находиться перед определением класса, но после деклара­
ции пакета. Подобное выражение означает, что указанные классы (символ "*" поме­
чает все классы пакета) дост)'пны для использования. При отсутствии операции
import компилятор будет искать классы только в текущем каталоге и в каталогах, ука­
занных в переменной окружения CLASSPATH (переменная CLASSPATH будет рассмот­
рена ниже в этом разделе).
Имя пакета может содержать точку (". "). Компоненты имени, разделенные точка­
ми, соответствуют иерархии каталогов. Предположим, например, что ваше приложе­
ние разрабатывается в системе Windows 2000 или NT и находится в каталоге
С: \ J a v a \ c l a s s e s . Предположим также, что в процессе работы вы создали классы,
коды которых показаны в листингах 7.24-7.27, Эти классы размещены в следующих
пакетах.
• Пакетpackagel (С: \ J a v a \ c l a s s e s \ p a c k a g e l ) —содержит класс C l a s s l .
• Пакет package2 (С : \ J a v a \ c l a s s e s \ p a c k a g e 2 ) — содержит класс C l a s s 2 .
• Пакет р а с к а д е 2 . р а с к а д е З ( C : \ J a v a \ c l a s s e s \ p a c k a g e 2 \ p a c k a g e 3 ) — со­
держит класс C l a s s 3 .
• Пакетpackage4 (С: \ J a v a \ c l a s s e s \ p a c k a g e 4 ) — содержит класс C l a s s l .
Заметьте, что в пакетах p a c k a g e l и package4 находятся классы с одинаковыми
именами ( c l a s s l ) . Если оба этих класса должны применяться в одной программе,
следует отказаться от операции i m p o r t и использовать выражение типа имя_пакета.
C l a s s l . Такое имя называется полностью определенным именем класса. Так, например,
7.10. Пакеты, CLASSPATH и JAR-архивы 243

при получении доступа к классу A p p l e t можно каждый раз указывать полное имя
j a v a . a p p l e t . A p p l e t , a можно включить в файл выражение i m p o r t j a v a . a p p l e t .
A p p l e t (или i m p o r t J a v a , a p p l e t . *) и обращаться к классу по имени A p p l e t .
Обратите внимание, что при объявлении методов p r i n t l n f o указан модификатор
s t a t i c . Для вызова методов класса необязательно создавать экземпляр класса, доста­
точно указать имя класса (например, M a t h . c o s ) .

Листинг 7 . 2 4 . С : \ J a v a \ c l a s s e s \ p a c k a g e l \ C l a s s l . J a v a

package p a c k a g e l ;

public class Classl {


p u b l i c s t a t i c void p r i n t l n f o ( ) {
S y s t e m . o u t . p r i n t l n ( " T h i s i s C l a s s l in p a c k a g e l . " )
}
}

Листинг 7.25. С:\Java\classes\package2\Class2.java

package package2;

public class Class2 {


public static void printlnfo() {
System.out.println("This is Class2 in package2.");
}
}

Листинг 7.26. С:\Java\classes\package2\package3\Class3.java

package package2.раскадеЗ;

public class Class3 {


public static void printlnfo() {
System.out.println("This is Class3 in " +
"package2.раскадеЗ.");
}
}

Листинг 7.27.С:\Java\classes\package4\Classl.java

package package4;

public class Classl {


public static void printlnfo() {
System.out.println("This is Classl in package4."),
}
}
244 Глава 7. Объектно-ориентированное программирование.

Теперь напишем тестовую программу, использующую созданные классы (листинг


7.28). Эта программа размещается вне пакетов в каталоге С: \ J a v a X c l a s s e s .

Листинг 7.28.С:\Java\classes\PackageExample.Java

import packagel.*;
import package2.Class2;
import package2.packages.*;
p u b l i c c l a s s PackageExample {
p u b l i c s t a t i c void m a i n ( S t r i n g [ ] args) {
Classl.printlnfo() .
Class2.printlnfo() ,
C l a s s 3 . p r i n t l n f o (),
package4.Classl.printlnfo(
}

Компиляция и запуск:
j a v a c PackageExample.Java
Java PackageExample
Первая из приведенных выше команд автоматически компилирует все четыре
класса.

Результаты выполнения:
This is Classl in packagel.
This is Class2 in package2.
This is Class3 in package2.раскадеЗ.
This is Classl in package4.
В приведенном примере компиляция файла PackageExample. Java автоматиче­
ски влечет за собой компиляцию остальных исходных файлов, поскольку Р а с к а д е -
Example непосредственно обращается к соответствующим классам. Если вы хотите
скомпилировать исходные файлы по отдельности, вам надо указать в командной
строке также подкаталог.
javac packagel/Classl.Java
javac package2/Class2.Java
javac package2/package3/Class3.Java
javac package4/Classl.Java

Для того чтобы файлы, принадлежащие разным пакетам, компилировались авто­


матически, надо воспользоваться одним из двух следующих способов.
1. Запустить компиляцию из каталога, вышестоящего по отношению к каталогам
пакетов. Например, по команде j a v a c p a c k a g e 2 / C l a s s 2 . Java, вызванной из
каталога C : \ J a v a \ c l a s s e s \ , будет скомпилирован класс C : \ J a v a \ c l a s s e s \
p a c k a g e 2 \ C l a s s 2 . Java, находящийся в пакете package2.
7.10. Пакеты, CLASSPATH и JAR-архивы 245

2. Включить каталог, в котором созданы подкаталоги, соответствующие пакетам,


в состав переменной окружения CLASSPATH и запустить процесс компиляции
из каталога, в котором находится исходный текст программы. Например, рабо­
тая с классами из приведенного выше примера, надо указать в составе
CLASSPATH каталог С: \ J a v a \ c l a s s e s .

Переменная окружения CLASSPATH


До сих пор мы считали, что все Java-файлы расположены в подкаталогах одного
каталога. Такой подход неприменим в том случае, когда в системе ведется работа над
различными приложениями. Java позволяет задать список каталогов для поиска клас­
сов. Этот механизм не заменяет пакеты, а дополняет их. В списке каталогов указыва­
ются только корневые каталоги иерархий пакетов; подкаталоги соответствуют от­
дельным пакетам. Таким образом, каталоги, указанные в списке задают, стартовые
точки для поиска классов, а выражение i m p o r t указывает, в каких подкаталогах нахо­
дятся эти классы. В большинстве систем Java допускается задавать в качестве старто­
вых точек для поиска классов JAR-архивы. П р и этом упрощается перемещение иерар­
хии классов из одного каталога в другой.
Путь для поиска классов задается двумя способами. Во-первых, вы можете указать
при вызове j a v a c или J a v a опцию - c l a s s p a t h . Во-вторых, набор каталогов можно
задать в качестве значения переменной окружения CLASSPATH. Этот способ исполь­
зуется разработчиками чаще всего. Если переменная CLASSPATH не установлена, сис­
тема Java ищет требуемые классы относительно текущего каталога. Очень часто про­
граммисты размещают классы в подкаталогах рабочего каталога; в этом случае в пе­
ременной окружения CLASSPATH, помимо прочего, надо указать текущий каталог (.).
Для разделения каталогов в списке используется (в зависимости от операционной
системы) двоеточие либо точка с запятой. Н а п р и м е р , в системе UNIX ( c s h , t c s h )
выражение, задающее значение CLASSPATH, имеет следующий вид:
setenv CLASSPATH .:-/classes:/home/mcnealy/classes
В Windows 9 8 / 2 0 0 0 / N T переменная окружения определяется следующим образом:
set CLASSPATH=.;С:\BillGates\classes;D:\Java\classes
В MacOS понятие переменных окружения отсутствует, но требуемый набор ката­
логов можно задать, изменяя ресурс 'STR МО). Многие системы Java, работающие в
среде Мае, обеспечивают более простые способы достижения требуемого эффекта.
В частности, в большинстве случаев нет необходимости явно указывать путь к стан­
дартным Java-классам; соответствующие значения задаются автоматически. Более то­
го, классы из пакета j a v a . l a n g . * импортируются по умолчанию.
Многие броузеры, в том числе Netscape и утилита a p p l e t v i e w e r , перед тем как
загрузить классы по сети, ищут их в каталогах, указанных в переменной окружения
CLASSPATH. Эти классы могут предоставлять аплету специальные привилегии. Если
злоумышленник каким-то образом ознакомится с классами на вашей машине, он мо­
жет написать аплет, которьп1, будучи загруженным по сети, выполнит от вашего име­
ни недопустимые действия. Поэтому перед запуском броузера убедитесь, что пере­
менная окружения CLASSPATH не установлена.
246 Глава 7. Объектно-ориентированное программирование...

Безопасность
Перед запуском броузера отключите установки CLASSPATH.

Использование JAR-файлов
Установка переменной окружения CLASSPATH— наиболее подходящий способ за­
дать список каталогов, в которых должен осуществляется поиск файлов классов. Од­
нако, если вы используете большое количество пакетов, размеры CLASS PATH могут
превысить максимальные размеры, допустимые для переменной окружения в опера­
ционной системе. Для того чтобы разрешить эту проблему, Java позволяет включать
классы в Java-архив (JAR). В состав JDK входит утилита j a r , которая помещает файлы
классов в сжатом виде в единый JAR-файл. П р и этом используется алгоритм, анало­
гичный сжатию в ZIP-формате.
Ниже перечислены опции, которые наиболее часто задаются п р и вызове j а г .
с
Данная опция задает создание нового JAR-файл а.
f
Опция f указывает файл для обработки или целевой JAR-файл.

т, М
Первая из приведенных опций (строчная ш) указывает на то, что для поддержки
расширенных возможностей (подписанные JAR-файлы, исполняемые JAR-файлы)
используется файл описания (manifest file). Если указаны и m и f, порядок исполь­
зования файла описания и JAR-файла совпадает с порядком следования опций.
Вторая опция (прописная М) указывает на то, что файл описаний не должен созда­
ваться. П о умолчанию описание включается в архив; ознакомиться с его содержи­
мым можно, разархивировав JAR-файл. Дополнительную и н ф о р м а ц и ю о файлах
описаний вы найдете по адресу h t t p : / / J a v a . s u n . c o m / d o c s / b o o k s / t u t o r i a l /
jar/basics/manifest.html.

t
Эта опция выводит содержимое JAR-файла.
u
Данная опция указывает на обновление JAR-файла, например добавление файлов
или изменение описания.
V
Опция V задает вывод подробного отчета о выполненных действиях.

хфайя
Данная опция распаковывает файлы, входящие в состав JAR-файла. Если файл не
указан, распаковываются все файлы в архиве.
7 . 1 1 . Модификаторы 247

О
Указанная опция (цифра "нуль") задает создание несжатого JAR-файла.
Н и ж е в качестве примера приведена команда, с помощью которой все ф а й л ы
C l a s s X . c l a s s , рассмотренные в рамках предыдущего примера, помещаются в один
JAR-файл.
С:\Java\classes>jar cfv e x a m p l e . j a r p a c k a g e l package2 package4

Результаты выполнения:
added manifest
adding: packagel/(in = 0) (out= 0)(stored 0%)
adding: packagel/Classl.class(in = 4 68)
(out= 326)(deflated 30%)
adding: package2/(in = 0) (out= 0)(stored 0%)
adding: package2/Class2.class(in = 4 68)
(out= 327)(deflated 30%)
adding: package2/package3/(in = 0) (out= 0)
(stored 0%)
adding: package2/package3/Class3.class(in = 486)
(out= 338)(deflated 30%)
adding: package4/(in = 0) (out= 0)(stored 0%)
adding: package4/Classl.class(in = 4 31)
(out= 298)(deflated 30%)
В данном примере мы предполагаем, что в каталогах, соответствующих пакетам,
содержатся только файлы классов. Если это не так, в архив e x a m p l e . j a r будут вклю­
чены также исходные тексты программ и все другие файлы. Для того чтобы в архив
помещались только файлы классов, это надо явно указать в командной строке. П р и
необходимости вы можете поместить список jar-команд в отдельный файл и затем за­
дать его в командной строке в виде (? имя_файла.
Создав jar-файл, можно указать его в качестве значения переменной CLASSPATH.
Если строка все же оказывается слишком длинной, файл следует поместить в каталог
/ r o o t / j d k l . 3 / j r e / l i b / e x t / . JAR-файлы, расположенные в этом каталоге, Java
проверяет автоматически, как и каталоги, явно указанные в списке поиска классов.
На з а м е т к у

Если длина строки, заданной в качестве значения переменной


CLASSPATH, слишком велика, вы можете разместить иЛЙ-файлы в ка­
талоге /root/jdkl.3/jre/lib/ext/. JAR-файлы, содержащиеся в
этом каталоге, проверяются автоматически.

7 . 1 1 . Модификаторы
в данной главе при объявлении классов, методов и переменных экземпляров ис­
пользовались различные модификаторы: p u b l i c , p r i v a t e , p r o t e c t e d , s t a t i c и др.
Несмотря на то что смысл этих модификаторов был ясен из контекста, желательно
рассмотреть их подробнее.
248 Глава 7. Объектно-ориентированное программирование.

Модификаторы области видимости


Эти модификаторы определяют, какие из классов могут иметь доступ к данным в
составе создаваемого вами объекта. Если вы еще не знакомы с объектно-
ориентированным программированием, вам на первое время достаточно будет разо­
браться с назначением модификаторов p u b l i c и p r i v a t e и не обращать внимания
на остальные. Если вы уже программировали на C++, можете сравнить классы, при­
надлежащие одному пакету, с дружественными классами C++.

Таблица 7.1. Модификаторы области видимости


Модификатор переменной или метода

Возмоэнтости доступа public, private protected Модификатор


к переменным и методам отсутствует
(по умолчанию)

Тот же класс Да Да Да Да

Классы в том же пакете Да Нет Да Да

Подклассы Да Нет Да Нет

Классы из других Да Нет Нет Нет


пакетов

public
Данный модификатор указывает на то, что переменная или метод доступны любо­
му, кто имеет доступ к экземпляру класса. Данным модификатором помечаются
средства, предоставляемые пользователям; они обычно документируются с помо­
щью j a v a d o c .
Многие разработчики считают, что переменные экземпляра никогда не должны
объявляться как общедоступные и что обращаться к ним следует только посредст­
вом методов. Аргументы в пользу такого мнения вы найдете в одном из предыду­
щих разделов. Подобный подход использовался при создании примера S h i p
(листинг 7.5); такое соглашение действует и для компонентов JavaBeans. Однако
некоторые программисты утверждают, что "никогда" — это слишком строгое тре­
бование и что общедоступные поля вполне допустимы для небольших классов, ис­
пользуемых как записи (подобно структурам в языке С). Для таких классов, счита­
ют они, методы доступа лишь устанавливают и читают значения переменных, не
выполняя никаких проверок, поэтому совершенно излишни. В качестве примера
подобного класса можно привести класс J a v a . a w t . P o i n t , который содержит пе­
ременные X и у, объявленные как p u b l i c , и который с самого начала задумывался
как объект, объединяющий две целочисленные переменные. В качестве компро­
миссного решения можно порекомендовать избегать объявления переменных как
p u b l i c в классах со сложной структурой.
7 . 1 1 . Модификаторы 249

М е т о д и к а профессионалов

Следует по возможности избегать объявления переменных экземп­


ляров как public.

Модификатор p u b l i c в определении класса означает, что его могут загружать и


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

private
Этот модификатор означает, что переменная или метод доступны только для ме­
тодов того же класса. Модификатор p r i v a t e обычно используется для определе­
ния тех методов и переменных, к о т о р ы е необходимы для реализации логики клас­
са, но которые не должны быть доступны пользователям.

protected
Д а н н ы й модификатор указывает на то, что переменная или метод могут быть дос­
тупны методам того же класса и классов, принадлежащих тому же пакету. Пере­
менные и методы, объявленные как p r o t e c t e d , могут быть видимы из-за границ
пакета посредством механизма наследования. Этот модификатор обычно прим
няется при определении тех методов и данных, которые в обычных условиях рас­
сматриваются как p