полное руководство
Java
10-е издание
26 |
Содержание |
|
|
|
Глава 38. Введение в сервлеты |
|
|
|
Предпосылки для разработки сервлетов |
|
|
|
Жизненный цикл сервлета |
|
|
|
Варианты разработки сервлетов |
|
|
|
Применение контейнера сервлетов Tomcat |
|
|
|
Простой пример сервлета |
|
|
|
Создание и компиляция исходного кода |
сервлета |
|
|
Запуск контейнера сервлетов |
Tomcat на выполнение |
|
|
Запуск веб-браузера и запрос |
сервлета |
|
|
Прикладной интерфейс Servlet API |
|
Пакет j avax. Интерфейс Интерфейс Интерфейс Интерфейс Интерфейс
servlet Servlet ServletConfig ServletContext ServletRequest ServletResponse
Класс GenericServlet |
|
Класс ServletinputStrearn |
|
Класс ServletOutputStrearn |
|
Класс ServletException |
|
Ввод параметров сервлета |
|
Пакет j avax. servlet. http |
|
Интерфейс HttpServletRequest |
|
Интерфейс HttpServletResponse |
|
Интерфейс HttpSession |
|
Класс Cookie |
|
Класс HttpServlet |
|
Обработка НТТР-запросов и ответов |
|
Обработка НТТР-запросов типа |
GET |
Обработка НТТР-запросов типа |
POST |
Применение сооkiе-файлов |
|
Отслеживание сеансов связи |
|
Часть VI. Приложения |
|
Приложение А. Применение документирующих |
|
комментариев в |
Java |
Дескрипторы утилиты j avadoc |
|
Дескриптор @author |
|
Дескриптор {@code} |
|
Дескриптор @deprecated |
|
Дескриптор {@docRoot} |
|
Дескриптор @except ion |
|
Дескриптор @hidden |
|
Дескриптор {@index} |
|
Дескриптор {@inheri tDoc} |
|
Дескриптор {@1 ink} |
|
Дескриптор {@linkplain} |
|
Дескриптор {@li teral} |
|
Дескриптор @pararn |
|
Дескриптор @provides |
|
Дескриптор @return |
|
1403
1403 1404 1405 1406 1407 1408 1409 1409 1409 1410 1410 1411 1411 1412 1413 1413 1414 1414 1414 1414 1416 1417 1418 1419 1419 1421 1422 1422 1424 1425 1427
1429
1431
1431 1432 1433 1433 1433 1433 1433 1434 1434 1434 1434 1434 1435 1435 1435
40
Часть
1.
Язык Java
бытовые
электронные
устройства,
в
том
числе
микроволновые
печи
и
устройства
дистанционного
управления.
Не
трудно
догадаться,
что
в
контроллерах
таких
устройств
применяются
разнотипные
процессоры.
Но
трудность
применения
С
и
С++
(как
и
большинства
других
языков)
состоит
в
том,
что
написанные
на
них
программы
должны
компилироваться
для
конкретной
платформы.
И
хотя
про
граммы
на
С++
могут
быть
скомпилированы
практически
для
любого
типа
про
цессора,
тем
не
менее для
этого
потребуется
наличие
полного
компилятора
С++,
предназначенного
для
данного
конкретного
процессора.
Но
дело
в
том,
что
созда
ние
компиляторов
обходится
дорого
и
отнимает
немало
времени.
Поэтому
тре
бовалось
более
простое
и
экономически
выгодное
решение.
Пытаясь
найти
такое
решение,
Гослинг
и
другие
разработчики
начали
работу
над
переносимым,
не
за
висящим
от
конкретной
платформы
языком,
который
можно
было
бы
использо
вать
для
создания
кода,
пригодного
для
выполнения
на
разнотипных
процессорах
в
различных
средах.
И
в
конечном
итоге
их
усилия
привели
к
созданию
языка
Java.
Примерно
в
то
время,
когда
определялись
основные
характеристики
языка
Java,
появился
второй,
еще
более
важный
фактор,
который
должен
был
сыграть
решающую
роль
в
судьбе
этого
языка.
И
этим
вторым
фактором,
конечно
же,
стала
Всемирная
паутина
(веб).
Если
бы
формирование
веб
не
происходило
почти
одно
временно
с
реализацией
языка
Java,
он
мог
бы
остаться
полезным,
но
незамечен
ным
языком
программирования
бытовых
электронных
устройств.
Но
с
появлени
ем
веб
язык
Java
вышел
на
передний
край
разработки
языков
программирования,
поскольку среда веб также нуждалась в переносимых программах.
С самых первых шагов своей карьеры большинству программистов
приходится
твердо
усваивать,
что
переносимость
программ
столь
же
недостижима,
сколь
и
же
лательна.
Несмотря
на
то
что
потребность
в
средствах
для
создания
эффективных,
переносимых
(не
зависящих
от
конкретной
платформы)
программ
существовала
в
программировании
с
самого
начала,
она
отодвигалась
на
задний
план
другими,
более
насущными,
задачами.
Более
того, |
львиная |
доля
отрасли
вычислительной
техники
была
разделена
на
три
конкурирующих
лагеря
(Intel, Macintosh
и
UNIX),
и
поэтому
большинство
программистов
оставались
на
своих
закрепленных
аппа
ратно-программных
рубежах,
что
несколько
снижало
потребность
в
переносимом
коде.
Тем
не
менее
с
появлением
Интернета
и
веб старая
проблема
переносимости
возникла
снова, а ее
решение
стало
еще
более
актуальным.
Ведь
Интернет
пред
ставляет
собой
разнообразную
и
распределенную
сетевую
среду
с
разнотипными
компьютерами,
операционными
системами
и
процессорами.
Несмотря
на то
что
к
Интернету
подключены
разнотипные
платформы,
пользователям
желательно,
чтобы
на
всех
этих
платформах
можно
было
выполнять
одинаковые программы.
То,
что
в
начале
было
неприятной,
но
не
слишком
насущной
задачей,
стало
потреб
ностью первостепенной важности.
К 1993 г. членам группы разработчиков
Java
стало
очевидно,
что пробле
мы
переносимости,
часто
возникающие
при
создании
кода,
предназначенного
для
встраивания
в
контроллеры,
возникают
также
и
при
попытках
создания
кода
для
Интернета.
Фактически
та
же
проблема,
для
решения
которой
в
мелком
мас
штабе
предназначался
язык
Java,
была
актуальна
в
большем
масштабе
и
в
среде
42
Часть
1.
Язык
Java
Связь
с
языком
С#
Многообразие
и
большие
возможности
языка Java
продолжают
оказывать
вли
яние
на
всю
разработку
языков
программирования.
Многие
из
его
новаторских
характеристик,
конструкций
и
концепций
становятся
неотъемлемой
частью
осно
вы
любого
нового
языка.
Успех
Java
слишком
значителен,
чтобы
его
можно
было
игнорировать. Вероятно, наиболее
наглядным
примером
влияния
языка
Java
на
программирова
ние
служит
язык
С#.
Он
создан
в
корпорации
Microsoft
для
поддержки
платформы
.NET
Framework
и
тесно
связан
с
Java.
В
частности,
в
обоих
этих
языках
используется
один
и
тот
же
общий
синтаксис,
поддерживается
распределенное
программирова
ние
и
применяется
одна
и
та
же
объектная
модель.
Разумеется,
у
Java
и
С#
имеется
целый
ряд
отличий,
но
в
целом
они
внешне
очень
похожи.
Ныне
такое
"перекрестное
опыление"
Java
и
С#
служит
наилучшим
доказательством
того,
что
язык
Java
корен
ным
образом
изменил
представление
о
языках
проrраммирования
и
их
применении.
Каким
образом
язык
Java
повлиял
на
Интернет
Интернет
способствовал
выдвижению
Java
на
передний
край
программирова
ния,
а
язык
Java,
в
свою
очередь,
оказал
очень
сильное
влияние
на
Интернет. Язык
Java
не
только
упростил
создание
программ
для
Интернета
в
целом,
но и
обусло
вил
появление
нового
типа
прикладных
программ,
предназначенных
для
работы
в
сети
и получивших
название
аплетов,
которые
изменили
понятие
содержимого
сетевой
среды.
Кроме
того,
язык
Java
позволил
решить
две
наиболее
острые
про
блемы
программирования,
связанные
с
Интернетом:
переносимость
и
безопас
ность.
Рассмотрим
каждую
из
этих
проблем
в
отдельности.
Аплеты
на
Java
Аплет
-
это
особый
вид
прикладной
программы
на
Java,
предназначенный
для
передачи
через
Интернет
и
автоматического
выполнения
в
совместимом
с
Java
веб-браузере.
Более
того,
аплет
загружается
по
требованию,
не
требуя
дальней
шего
взаимодействия
с
пользователем.
Если
пользователь
щелкает
кнопкой
мыши
на
ссылке,
которая
содержит
аплет,
он
автоматически
загружается и
запускается
в
браузере.
Аплеты
создаются
в
виде
небольших
программ.
Как
правило,
они
слу
жат
для
отображения
данных,
предоставляемых
сервером,
обработки
действий
пользователя
или
выполнения
локально,
а
не
на
сервере,
таких
простых
функций,
как вычисление процентов по кредитам. По существу,
ряд функций со стороны сервера на сторону клиента.
аплет
позволяет
перенести
Появление
аплетов
изменило
характер
программирования
приложений
для
Интернета,
поскольку
они
расширили
совокупность
объектов,
которые
можно
свободно
перемещать
в
киберпространстве.
В
общем,
между
сервером
и
клиентом
передаются
две
крупные
категории
объектов:
пассивные
данные
и
динамически
активизируемые
программы.
Например,
чтение
сообщений
электронной
почты
Глава
1.
История и
развитие
языка
Java
43
подразумевает
просмотр
пассивных
данных.
Даже
при
загрузке
программы
ее
код
по-прежнему
остается
пассивными
данными
до
тех
пор,
пока
он
не
начнет
выпол
няться.
И
напротив,
аплет
представляет
собой
динамическую,
автоматически
вы
полняющуюся
прикладную
программу.
Такая
программа
является
активным
аген
том на клиентской машине, хотя она инициируется сервером.
На ранней стадии развития Java аплеты были самой важной
составляющей
про
граммирования
на
Java.
Они
демонстрировали
эффективность
и
преимущества
Java,
повышали
привлекательность
веб-страниц
и
давали
программистам
возмож
ность
в
полной
мере
исследовать,
на
что
был
способен
язык
Java.
И
хотя
аплеты
находят
применение
и
ныне,
со
временем
они
потеряли
свое
значение.
Как
поясня
ется
далее
в книге,
начиная
с
версии
JDK 9,
аплеты
постепенно
выходят
из
употре
бления,
поскольку
им
на
смену
пришли
другие
механизмы
доставки
динамичес
ких,
активных
программ
через
Интернет.
Безопасность
За
привлекательностью
динамических
сетевых
программ
скрываются
серьез
ные
трудности
обеспечения
безопасности
и
переносимости.
Очевидно,
что
кли
ентскую
машину
нужно
обезопасить
от
нанесения
ей
ущерба
программой,
кото
рая
сначала
загружается
в
нее,
а
затем
автоматически
запускается
на
выполнение.
Кроме
того,
такая
программа
должна
быть
в
состоянии
выполняться
в
различных
вычислительных
средах
и
под
управлением
разных
операционных
систем.
Как
станет ясно в дальнейшем, эти трудности эффективно Рассмотрим их подробнее, начиная с безопасности.
и
изящно
решаются
в
Java.
с
Вам, вероятно, известно, что каждая загрузка обычной программы сопряжена
риском, поскольку загружаемый код может содержать вирус, "троянский конь"
или
вредоносный
код.
Дело
в
том,
что
вредоносный
код
может
сделать
свое чер
ное
дело,
если
получит
несанкционированный
доступ
к
системным
ресурсам.
Например,
просматривая
содержимое
локальной
файловой
системы
компьютера,
вирусная
программа
может
собирать
конфиденциальную
информацию
вроде
но
меров
кредитных
карточек,
сведений
о
состоянии
банковских
счетов
и
паролей.
Для
безопасной
загрузки
и
выполнения
аплетов
Java
на
клиентской
машине
нужно
было
предотвратить
подобные
атаки
со
стороны
аплетов.
Java
обеспечивает
такую
защиту,
ограничивая
действие
аплета
исполняющей
средой
Java
и
не
предоставляя
ему
доступ
к
другим
частям
операционной
системы
компьютера.
(Способы
достичь
этого
рассматриваются
далее.)
Возможность
за
гружать
аплеты
в
полной
уверенности,
что
это
не
нанесет
системе
никакого
вреда
и
не
нарушит
ее
безопасность,
многие
специалисты
и
пользователи
считают
наи
более
новаторским
аспектом
Java.
Переносимость
Переносимость
-
основная
особенность
Интернета,
поскольку
эта
глобаль
ная
сеть
соединяет
вместе
множество
разнотипных
компьютеров
и
операционных
44
Часть
1.
Язык
Java
систем.
Чтобы
программа
на
Java
могла
выполняться
практически
на любом
ком
пьютере,
подключенном
к
Интернету,
требуется
каким-то
образом
обеспечить
ее
выполнение
в
разных
системах.
В
частности,
один
и
тот
же
аплет
должен
иметь
возможность
загружаться
и
выполняться
на
широком
спектре
процессоров,
опе
рационных
систем
и
браузеров,
подключенных
к
Интернету.
А
создавать
разные
версии
аплетов
для
разнотипных
компьютеров
совершенно
нерационально.
Один
и
тот
же
код
должен
работать
на
всех
компьютерах.
Поэтому
требовался
какой-то
механизм
для
создания
переносимого
исполняемого
кода.
Как
станет
ясно
в
даль
нейшем,
тот
же
самый
механизм,
который
обеспечивает
безопасность,
способ
ствует
и
созданию
переносимых
программ.
Чудо
Java:
байт-код
Основная особенность Java, которая позволяет |
решать описанные выше проб |
|
лемы обеспечения безопасности и переносимости |
программ, состоит в том, что |
|
компилятор Java выдает не исполняемый код, а так называемый байт-код - |
в выс |
|
шей степени оптимизированный набор инструкций, предназначенных для |
выпол |
нения
в
исполняющей
системе
Java,
называемой
виртуальной
машиной
Java (Java
Viгtual
Machine -
JVM).
Собственно
говоря,
первоначальная
версия
виртуальной
машины
JVM
разрабатывалась
в
качестве
интерпретатора
байт-кода.
Это
может
вызывать
недоумение,
поскольку
для
обеспечения
максимальной
производитель
ности
компиляторы
многих
современных
языков
программирования
призваны
создавать
исполняемый
код.
Но
то,
что
программа
на
Java
интерпретируется
вир
туальной
машиной
JVM,
как раз
помогает
решить
основные
проблемы
разработки
программ для Интернета. И вот почему.
Трансляция программы Java в байт-код
значительно
упрощает
ее
выполнение
в
разнотипных
средах,
поскольку
на
каждой
платформе
необходимо
реализовать
только
виртуальную
машину
JVM.
Если
в
отдельной
системе
имеется исполня
ющий
пакет,
в
ней
можно
выполнять
любую
программу
на
Java.
Следует,
однако,
иметь
в
виду,
что
все
виртуальные
машины
JVM
на
разных
платформах,
несмотря
на
некоторые
отличия
и
особенности
их
реализации,
способны
правильно
интер
претировать
один и
тот
же
байт-код.
Если
бы
программа
на
Java
компилирова
лась
в
машинозависимый
код,
то
для
каждого
типа
процессоров,
подключенных
к
Интернету,
должны
были
бы
существовать
отдельные
версии
одной
и
той
же
программы.
Ясно,
что
такое
решение
неприемлемо.
Таким
образом, организация
выполнения
байт-кода
виртуальной
машиной
JVM
-
простейший
способ
созда
ния по-настоящему переносимых программ.
Тот факт, что программа на Java выполняется
виртуальной
машиной
JVM,
спо
собствует
также
повышению
ее
безопасности.
Виртуальная
машина
JVM
управ
ляет
выполнением
программы,
поэтому
она
может
изолировать
программу,
что
бы
создать
ограниченную
исполняющую
среду,
которая
называется
"песочничей"
и
содержит
программу,
препятствующую
неограниченному
доступу
к
машине.
Как
станет ясно в дальнейшем, ряд ограничений,
способствует повышению безопасности.
существующих
в
языке
Java, также
68
Часть
1.
Язык
Java
вое
слово
void
просто
сообщает
компилятору,
что
метод
main
( )
не
возвращает
никаких
значений.
Как
будет
показано
далее,
методы
могут
также
возвращать
кон
кретные
значения.
Если
это
краткое
пояснение
покажется
вам
не
совсем
понят
ным, не отчаивайтесь, поскольку упомянутые здесь понятия
Java будут подробно рассматриваться в последующих главах.
и
языковые
средства
Как
указывалось
выше,
метод
main
()
вызывается
при
запуске
прикладных
программ
на
Java.
Следует,
однако,
иметь
в
виду,
что
в
Java
учитывается
регистр
букв.
Следовательно,
имя
Main
не
равнозначно
имени
main.
Следует
также
иметь
в
виду,
что
компилятор
Java
скомпилирует
классы,
в
которых
отсутствует
метод
main
(),но
загрузчик
приложений
(java)
не
сможет
выполнить
код
таких
клас
сов.
Так, если
вместо
имени
main
ввести
имя
Main,
компилятор
все
равно
скомпи
лирует
программу,
но
загрузчик
приложений
j
ava
выдаст
сообщение
об
ошибке,
поскольку ему не удалось обнаружить |
метод main (). |
|
Для передачи любой информации, |
требующейся |
методу, |
служат
переменные,
указываемые
в
скобках
вслед
за
именем
метода.
Эти
переменные
называются
па
раметрами.
Если
параметры
не
требуются
методу,
то
указываются
пустые
скобки.
У
метода
main
()
имеется
единственный,
хотя
и
довольно
сложный
параметр.
Так,
в
выражении
String
args
[]
объявляется
параметр
args,
обозначающий
мас
сив
экземпляров
класса
String.
(Массивы
-
это
коллекции
похожих
объектов.)
В
объектах
типа
String
хранятся
символьные
строки.
В
данном
случае
параметр
args
принимает
любые
аргументы
командной
строки,
присутствующие
во
время
выполнения
программы.
В
рассматриваемом
здесь
примере
программы
эта
ин
формация, вводимая из командной строки, не используется, |
но |
триваемых далее примерах программ она будет применяться. |
|
в
других,
рассма
Последним
элементом
в
рассматриваемой
здесь
строке
кода
оказывается
сим
вол
открывающей
фигурной
скобки
(
{).Он
обозначает
начало
тела
метода
main
( ) .
Весь код, составляющий тело метода, должен располагаться между
и закрывающей фигурными скобками в определении этого метода.
открывающей
Еще
один
важный
момент:
метод
main ()
служит
всего
лишь
началом
програм
мы.
Сложная
программа
может
включать
в
себя
десятки
классов,
но
только
один
из
них
должен
содержать
метод main
(),чтобы
программу
можно
было
запустить
на
выполнение.
И
хотя
в
некоторых
типах
программ
метод
main
( )
вообще
не
тре
буется,
в
большинстве
примеров
программ,
приведенных
в
данной
книге,
этот
ме
тод все же обязателен.
Перейдем к следующей
строке
кода
анализируемой
здесь
программы.
Ниже
по
казано,
как
она
выглядит.
Следует
также
иметь
в
виду,
что
эта
строка
кода
находит
ся
в
теле
метода
main
().
System.out.println("Пpocтaя
программа
на
Java.");
В
этой
строке
кода
на
консоль
(а
по
существу,
на
экран)
выводится
символьная
строка
"Простая
программа
на
Java."
с
последующим
переходом
на
новую
строку.
На
самом
деле
вывод
текста
на
консоль
выполняется
встроенным
мето
дом
println
().В
данном
случае
метод
println
()
отображает
переданную
ему
символьную
строку.
Как
будет
показано
далее,
с
помощью
этого
метода
на
консоль
78
Часть
1.
Язык
Java
для
поддержки
модулей
(подробнее
об
этом
речь
пойдет
в
главе
16).
Кроме
того,
начиная
с
версии
JDK
9,
отдельный
знак
подчеркивания
считается
ключевым
сло
вом,
чтобы
предотвратить
его
употребление
в
качестве
имени
какого-нибудь
эле-
мента
программы.
Таблица
2.3.
Ключевые
слова
Java
aЬstract |
assert |
catch do final implements module private short this try
char douЫe finally import native protected static throw uses
boolean class else float instanceof new provides strictfp throws void
break const enum for int open puЬlic super to volatile
byte continue exports goto interface opens requires switch transient while
case default extende if long package return synchronized transitive with
Несмотря
на
то
что
ключевые
слова
cons
t
и
goto
зарезервированы,
они
не
применяются
на
практике.
В
ранних
версиях
Java
имелись
и другие
ключевые
сло
ва,
зарезервированные
для
применения
в
будущем.
Но
в
настоящей
спецификации
языка
Java
определены
лишь
те
ключевые
слова,
которые
перечислены
в
табл.
2.3.
Кроме
ключевых
слов,
в
Java зарезервированы
также
слова
true,
false
и
null.
Они представляют отдельные значения, определенные в спецификации языка
Их нельзя употреблять для обозначения имен переменных, классов и т.п.
Java.
Библиотеки
классов
Java
В
примерах
программ,
приведенных
в
этой
главе,
использовались
два
встроенных
метода
Java:
println
()
и
().Как
отмечалось
ранее,
эти
методы
доступны
по
ссылке
Sy s
t
em.
ou
t
на
класс
Sys
t
em,
который
является
стандартным
в
Java
и
ав
томатически
включается
в
прикладные
программы.
В
более
широком
смысле
среда
Java
опирается
на
несколько
встроенных
библиотек
классов,
содержащих
многие
встроенные
методы,
обеспечивающие
поддержку
таких операций,
как
ввод-вывод,
обработка
символьных
строк,
работа
в
сети
и
отображение
графики.
Стандартные
классы
обеспечивают также
помержку
графического
пользовательского
интерфей
са
(ГПИ).
Таким
образом,
среда
Java
в
целом
состоит
из
самого
языка
Java
и
его
стан
дартных
классов.
Как
станет
ясно
в
дальнейшем,
библиотеки
классов
предоставля
ют
большую
часть
функциональных
возможностей
среды
Java.
В
действительности
стать
программирующим
на
Java
означает
научиться
пользоваться
стандартными
классами
Java.
В
последующих
главах
этой
части
книги
описание
различных
элемен
тов
стандартных
библиотечных
классов
и методов
приводится
по
мере
надобности,
а
в
части
11
библиотеки
классов
описаны
более
подробно.