Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
92
Добавлен:
30.03.2021
Размер:
42.12 Mб
Скачать

полное руководство

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

()

и

print

().Как

отмечалось

ранее,

эти

методы

доступны

по

ссылке

Sy s

t

em.

ou

t

на

класс

Sys

t

em,

который

является

стандартным

в

Java

и

ав­

томатически

включается

в

прикладные

программы.

В

более

широком

смысле

среда

Java

опирается

на

несколько

встроенных

библиотек

классов,

содержащих

многие

встроенные

методы,

обеспечивающие

поддержку

таких операций,

как

ввод-вывод,

обработка

символьных

строк,

работа

в

сети

и

отображение

графики.

Стандартные

классы

обеспечивают также

помержку

графического

пользовательского

интерфей­

са

(ГПИ).

Таким

образом,

среда

Java

в

целом

состоит

из

самого

языка

Java

и

его

стан­

дартных

классов.

Как

станет

ясно

в

дальнейшем,

библиотеки

классов

предоставля­

ют

большую

часть

функциональных

возможностей

среды

Java.

В

действительности

стать

программирующим

на

Java

означает

научиться

пользоваться

стандартными

классами

Java.

В

последующих

главах

этой

части

книги

описание

различных

элемен­

тов

стандартных

библиотечных

классов

и методов

приводится

по

мере

надобности,

а

в

части

11

библиотеки

классов

описаны

более

подробно.

Соседние файлы в папке Лабораторные работы (Объектно-ориентированное программирование (ООП))