Запись в файл 1 страница

Чтение файла

Сначала можно создать канал как объект класса URLConnection, вызвав метод openConnection(),определенный в класса URL, а затем можно создать для этого канала входной поток, воспользовавшись методом getInputStream, определенным в классе URLConnection, или получить содержимое файла методом getContent() этого же класса, как это сделано в следующих фрагментах апплетов:

URL myUrl; URLConnection myUrlConnection;

try

{ myUrl=new URL(getCodeBase(),"index.html");

myUrlConnection=myUrl.openConnection();

} catch(MalformedURLException e) { /* обработка исключения */ }

try

{ InputStream InStream=myUrlConnection.getInputStream();

// чтение данных из потока InStream

InStream.close();

} catch(IOException e) { /* обработка исключения */ }

или

URL myUrl; URLConnection myUrlConnection; Object obj;

try

{ myUrl=new URL(getCodeBase(),"index.html");

myUrlConnection=myUrl.openConnection();

} catch(MalformedURLException e) { /* обработка исключения */ }

try

{ obj=myUrlConnection.getContent();

} catch(IOException e) { /* обработка исключения */ }

if(obj instanceof String) { /* действия, если строка */ }

else { /* тип неизвестен, действия по умолчанию */ }

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

Рассмотрим информационные методы класса URLConnection. Метод getContentLength() возвращает размер ресурса в байтах. Тип MIME ресурса (например, «image/gif») можно определить при помощи метода getContentType(). Дату посылки ресурса возвращает метод getDate(). При помощи ряда методов getHeaderField...() можно прочитать различную информацию из заголовка файла.

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

/*------------- Пример 3. Файл UrlOpenConnection.java -------------*/

import java.net.*;

public class UrlOpenConnection

{ public static void main(String args[])

{ URL Url; URLConnection UrlConnection;

try

{ // создание URL файла и открытие соединения с ним

Url=new URL

("http://www.vvsu.ru/cts/teachers/arhipova/pictures/clock.gif");

UrlConnection=Url.openConnection();

// информация о файле

System.out.println("Size:"+UrlConnection.getContentLength());

System.out.println("Type:"+UrlConnection.getContentType());

System.out.println("Date:"+UrlConnection.getDate());

}

catch(Exception e) { System.out.println(e.toString()); }

}

}

После создания канала как объекта класса URLConnection вызовом метода openConnection(),определенного в класса URL, можно не только создавать для этого канала входной поток, воспользовавшись методом getInputStream(), определенным в классе URLConnection, или получить содержимое файла методом getContent() этого же класса, но и создавать выходной поток для записи в этот файл. Для создания выходного потока используется метод getOutputStream() класса URLConnection:

try

{ InputStream InStream=myUrlConnection.getInputStream();

// чтение данных из потока InStream

InStream.close(); // закрытие потока

OutputStream OutStream=myUrlConnection.getOutputStream();

// запись данных в поток

OutStream.flush();

OutStream.close();

}

catch(Exception e) { /* обработка исключения */ }

Если попытаться вызвать методы getInputStream() и getOutputStream() для такого типа URL, который не поддерживает эти методы , то возникает исключение UnknownServiceException.

Настройка класса URLConnection

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

Так, например, методом setDoInput() задается флаг doIinput, который показывает, поддерживает ли данный URLConnection входные данные (по умолчанию значение этого флага - true). Метод getDoInput() возвращает установленное значение флага doInput.

Метод setDoOutput() устанавливается флаг doOutput, который показывает, поддерживает ли данный URLConnection выходные данные (по умолчанию значение этого флага - false). Метод getDoOutput() возвращает установленное значение флага doOutput.

5. Приложение Diagram

Применим на практике технологию передачи файлов из каталога WWW-сервера в апплет.

Задание. Создать апплет Diagram, который читает с сервера WWW файл data.txt с исходными данными для построения круговой диаграммы. Содержимым файла является текстовая строка вида «10,20.3,13.1,6.9,35,14.7», где каждое число является долей чего-либо в процентах, причем сумма этих чисел не должна превышать 100.

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

Методические указания.Апплет должен быть создан на основе шаблонов, содержащихся в Приложении 3 (или при помощи системы Java Applet Wizard).

Объявление элементов класса апплета.

В классе апплета объявим следующие элементы - ссылки на объекты классов:

URL url; // URL сервера, откуда загружен апплет

String content; // содержимое ресурса сервера - файла с данными

String strErr; int err=0; // строка с сообщением и признак ошибки

int x,y,w; // область диаграммы

double beginPos, angle; // начальный угол сектора и его величина

int rColor,gColor,bColor; // компоненты цвета сектора

double unit=3.60; // величина сектора для 1% равна 360/100 градусов

Инициализация апплета ( метод init()).

В методеinit() апплета создадим объект url класса URL, который отвечает за URL-адрес сервера WWW, откуда был загружен апплет. Затем вызовем метод getFileContent(), который осуществляет считывание данных из файла.

Все вышеописанные действия следует заключить в блок try-catch для обработки возможных исключительных ситуаций:

try

{ // получение URL сервера апплета и вызов метода getFileContent

}

catch(MalformedURLException e)

{ // обработка исключения

}

При обработке исключения установим значение err равным 1, переменной strErr присвоим строку "Type of error: MalformedURLException", а затем перерисуем окно апплета вызовом метода repaint().

Считывание содержимого файла с WWW-сервера ( метод getFileContent()).

Создадим в классе апплета метод getFileContent(), который имеет следующее описание:

void getFileContent();

В этом методе в блоке try-catch получим содержимое файла, обработаем исключительную ситуацию, а затем перерисуем окно апплета вызовом метода repaint()

try

{ //получение содержимого файла и проверка его типа

}

catch(Exception e)

{ // обработка исключения

}

repaint();

Для получения содержимого файла вызовем для объекта url метод getContent(), присваивая возвращаемое этим методом значение объекту obj класса Object. Затем проверим, является ли obj экземпляром класса String. Если да, то: установим значение err равным 0; переменной strErr присвоим строку ""; переменной content присвоим значение obj. Если нет, то: установим значение err равным 2; переменной strErr присвоим строку "Type of error: Content of file isn't string".

При обработке исключения установим значение err равным 3, а переменной strErr присвоим строку"Type of error: getContent exception".

Отрисовка содержимого окна апплета ( метод paint()).

В методе paint() проверим значение err. Если оно не равно 0, то выведем в окно апплета строку strErr и прекратим работу метода оператором return.

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

Сначала определим размеры окна апплета методом size(), присваивая возвращаемое значение переменной dim класса Dimension. Затем зададим координаты (x, y) левого верхнего угла области диаграммы, а также размер w этой области по горизонтали и вертикали, учитывая размер окна апплета dim.

Установим методом setColor() цвет Color.black для контекста g и нарисуем рамку окна апплета методом drawRect(), используя объект dim. Далее методом drawOval() выведем круг, вписанный в прямоугольник с началом в точке (x, y) высотой и шириной w.

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

StringTokenizer ct=new StringTokenizer(content,",\r\n");

Далее в цикле по всем данным (числам) из строки определяем угол angle, соответствующий считанной величине в процентах и рисуем соответствующий сектор:

// цикл по всем значениям из строки ct

beginPos=0; // начальный угол для первого значения из строки

while(ct.hasMoreElements())

{ String word=(String)ct.nextElement(); // получить слово

Double value=new Double(word); // преобразовать в число

double percent=value.doubleValue(); // преобразовать в тип double

angle=percent*unit; // angle - величина в градусах

// отрисовка очередногосектора величиной angle

// градусов, начиная от начального угла beginAngle,

// изменение beginAngle и его проверка выхода за 360 градусов

}

В этом цикле для вывода каждого сектора получим случайные значения для компонент rColor, gColor, bColor цвета сектора, например:

rColor=(int)(255.*Math.random());

Затем установим методом setColor() цвет сектора (new Color(rColor,gColor,bColor)) и с помощью метода fillArc() нарисуем сектор круга, вписанного в прямоугольник с началом в точке (x, y) высотой и шириной w, начиная от угла beginPos величиной angle.

Потом прибавим к величине beginPos значение angle, теперь beginPos является начальным углом для следующего сектора. Проверим, чтобы новое значение beginPos не превышало 360. Если оно превышает это значение, то значит сумма считанных чисел больше 100%, поэтому установим значение err равным 4, переменной strErr присвоим строку "Type of error: summa greater than 100%", а затем перерисуем окно апплета вызовом метода repaint().

Обработка нажатия левой клавишей мыши в области окна апплета ( метод mouseDown()).

В этом методе для обновления информации о данных перечитаем файл с сервера WWW и нарисуем новую диаграмму вызовом метода getFileContent().

Задания к лабораторной работе

Задание 1. Проверить и объяснить работу приложений UrlOpenStream, UrlGetContentи UrlOpenConnection,рассматриваемых в данной главе в качестве примеров и отмеченных курсивом.

Задание 2.Создать приложение Diagramи объяснить его работу.

Задание 3. Дать ответы на контрольные вопросы.

Контрольные вопросы

51. Что такое URL, каков его формат?

52. Какой класс применяется для работы с ресурсами узла сети?

53. Как организовать чтение из потока, полученного от объекта класса URL?

54. Как получить содержимое файла, связанного с объектом класса URL?

55. Как организовать соединение узлов сети с помощью объекта URL?

56. Что можно сделать с помощью объекта класса URLConnection?

57. Как и какую информацию можно получить о ресурсе удаленного узла?

58. Как организовать входной и выходной потоки для канала, являющегося объектом класса URLConnection?

ЛАБОРАТОРНАЯ РАБОТА № 10

СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ СЕРВЛЕТОВ (2 ЧАСА)

МЕТОДИЧЕСКИЕ УКАЗАНИЯ К ЛАБОРАТОРНОЙ РАБОТЕ

Получить JSDK 2.0 (Windows)

Замечание. Установить в autoexec.bat:
set CLASSPATH=.;c:;C:\Windows\java\classes;C:\Windows\java\trustlib;c:\jsdk2.0\lib\jsdk.jar;

Получить JSDK 2.0 (Solariss)

Если вам необходимо раcширить функциональные возможности сервера Web, можно написать CGI-сценарий. А можно разработать и установить расширение на основе ISAPI. Ознакомьтесь с несколькими классами из набора Java Servlet Development Kit (JSDK).

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

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

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

Вся библиотека классов языка Java у вас в руках! Подключать и настраивать сервлеты также несложно.

Наибольшее распространение получили сервлеты, обрабатывающие запросы по протоколу HTTP - стандартному протоколу обмена данными WWW.

Рассмотрим наиболее часто используемые программистами классы и методы JSDK. Однако, если ваши задачи сложны и требуют тонкого подхода, внимательно изучите справочник по API, имеющийся в составе Java Servlet Development Kit. Последний можно бесплатно загрузить с сервера http://www.javasoft.com.

1. Как устроен сервлет

Главным родителем всех сервлетов является интерфейс Servlet. Следующий уровень иерархии - абстрактный класс GenericServlet, частично реализующий методы Servlet и служащий базой для создания экзотических сервлетов. Скорее всего, вам никогда не доведется обращаться к нему. Разумнее будет воспользоваться в качестве базового абстрактным классом HttpServlet. Таким образом,главное, что нужно сделать для получения работоспособного сервлета, - это создать класс, наследующий HttpServlet. А уже потом следует заняться написанием логики работы. На рис. слева представлена иерархическая диаграмма, показывающая взаимосвязь классов в Java Servlet Development Kit. Пунктирной рамкой отмечено место, отведенное сервлету пользователя.

Базовая часть классов JSDK помещена в пакет javax.servlet. Однако класс HttpServlet и все, что с ним связано, располагаются на один уровень ниже в пакете javax.servlet.http. Это следует учитывать при разработке. Также не забывайте, что основные сервлетообразующие классы находятся в архивном файле jsdk.jar, поэтому этот архив должен упоминаться в переменной среды CLASSPATH или же должен быть задан вручную в параметре командной строки -classpath при запуске компилятора javac.

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

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

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

После этого сервер находится в ожидании запросов от клиентов. Появившийся запрос немедленно преобразуется в вызов метода service сервлета, а все параметры запроса упаковываются в объект класса ServletRequest, который передается в качестве первого параметра метода service. Второй параметр метода - объект класса ServletResponse. Туда упаковываются выходные данные в процессе формирования ответа клиенту. Каждый новый запрос приводит к новому вызову метода service. В соответствии со спецификацией JSDK, метод service должен уметь обрабатывать сразу несколько запросов, т. е. быть синхронизирован для выполнения в многопоточных средах. Это особенно критично, когда в нем происходит обращение к разделяемым данным. Если же нужно избежать множественных запросов, сервлет должен реализовать интерфейс SingleThreadModel. Последний не содержит ни одного метода и служит лишь меткой, говорящей серверу об однопоточной природе сервлета. При обращении к такому сервлету каждый новый запрос будет стопориться в очереди и ожидать, пока не завершится обработка предыдущего запроса.

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

Интерфейсом Servlet предусмотрена реализация еще двух методов: getServletConfig и getServletInfo. Первый возвращает объект типа ServletConfig, содержащий параметры конфигурации сервлета, а второй - строку, кратко описывающую назначение сервлета, и прочую полезную информацию.

Сервлет HttpServlet, отвечающий за обработку запросов HTTP, устроен несколько сложнее. Он уже имеет реализованный метод service, служащий диспетчером для других методов, каждый из которых обрабатывает методы доступа к ресурсам. В спецификации HTML определены следующие методы: GET, HEAD, POST, PUT, DELETE, OPTIONS и TRACE. Наиболее часто употребляются GET - универсальный запрос ресурса по его универсальному адресу (URL) - и POST, с помощью которого на сервер передаются данные, введенные пользователем в поля интерактивных Web-страниц. Полное описание протокола HTTP 1.1 можно найти в Internet по адресу http://info.internet.isi.edu/in-notes/rfc/files/ rfc2068.txt.

Возвратимся к методу service HttpServlet. В его задачу входит анализ полученного через запрос метода доступа к ресурсам и вызов соответствующего метода, имя которого сходно с названием метода доступа к ресурсам, но в начале имени добавляется префикс do: doGet, doHead, doPost, doPut, doDelete, doOptions и doTrace. От разработчика же требуется переопределить нужный метод (чаще всего это doGet), разместив в нем функциональную логику.

2. Вспомогательные классы

Чтобы успешно использовать сервлеты, необходимо ознакомиться с рядом вспомогательных классов. Для начала узнаем, какие методы предлагает интерфейс ServletRequest, передающий сервлету запрос от клиента. Конечно же, запрос поступает не в том виде, в котором он приходит на сервер. Поток данных от клиента сортируется и упаковывается. Далее, вызывая методы интерфейса ServerRequest, можно получать определенный тип данных, посланных клиентом. Так, метод getCharacterEncoding определяет символьную кодировку запроса, а методы getContentType и getProtocol - MIME-тип пришедшего запроса, а также название и версию протокола соответственно. Информацию об имени сервера, принявшего запрос, и порте, на котором запрос был "услышан" сервером, выдают методы getServerName и getServerPort. Интересные данные можно узнать и о клиенте, от имени которого пришел запрос. Его IP-адрес возвращается методом getRemoteAddr, а его имя - методом getRemoteHost.

Если вас интересует прямой доступ к содержимому полученного запроса, самый надежный способ получить его - вызвать метод getInputStream или getReader. Первый возвращает ссылку на объект класса ServletInputStream, а второй - на BufferedReader. После этого можно читать любой байт из полученного запроса, используя технику работы с потоками Java.

Если, обращаясь к серверу, клиент помимо универсального адреса задал параметры, сервлету может понадобиться узнать их значение. Примером может служить электронная анкета, выполненная в виде Web-страницы с формой ввода, значения полей и кнопок которой автоматически преобразуются в параметры URL. Три специальных метода в интерфейсе ServletRequest занимаются разбором параметров и "выдачей на-гора" их значений. Первый из них, getParameter, возвращает значение параметра по его имени или null, если параметра с таким именем нет. Похожий метод, getParameterValues, возвращает массив строк, если задан сложный параметр, скажем, значения полей формы. И еще один метод, getParameterNames, возвращает энумератор, позволяющий узнать имена всех присланных параметров.

В классе HttpServletRequest имеются различные дополнительные методы, обеспечивающие программисту доступ к деталям протокола HTTP. Так, вы можете запросить массив cookies, полученный с запросом, используя метод getCookies. Узнать о методе доступа к ресурсам, на основе которого построен запрос, можно с помощью вызова getMethod. Строку запроса HTTP можно получить методом getQueryString. Даже имя пользователя, выполнившего запрос, не укроется от сервлета, если применить метод getRemoteUser.

Это, разумеется, лишь малая толика тех возможностей, которыми обладают вышеупомянутые классы ServletRequest и HttpServletRequest. Поэтому следует внимательно прочитать документацию по Servlet API.

Генерируемые сервлетами данные пересылаются серверу-контейнеру с помощью объектов, наследующих интерфейс ServletResponse, а сервер, в свою очередь, пересылает ответ клиенту, инициировавшему запрос. У интерфейса ServletResponse всего несколько методов, причем полезными оказываются не все. Чаще всего приходится задавать MIME-тип генерируемых данных методом setContentType и находить ссылки на потоки вывода двумя другими методами: getOutputStream возвращает ссылку на поток ServletOutputStream, а метод getWriter вернет ссылку на поток типа PrintWriter. Вы увидите, как ими пользоваться, когда мы будем рассматривать практический пример.

В классе HttpServletResponse, реализующем интерфейс ServletResponse, обнаруживаются еще несколько полезных методов. Например, вы можете переслать cookie на клиентскую станцию, вызвав метод addCookie. О возникших ошибках сообщается вызовом sendError, которому в качестве параметра передается код ошибки и при необходимости текстовое сообщение. Кроме того, по мере надобности в заголовок ответа можно добавлять параметры, для чего служит метод setDateHeader.

Ранее уже упоминался метод getServletConfig, но не было сказано об объекте ServletConfig, у которого имеются очень полезные методы. Инсталлируя сервлет на сервере, вы можете задавать параметры инициализации, о которых будет сказано в следующей части. Имена этих параметров можно получить через энумератор, возвращаемый методом getInitParameterNames. Значение же конкретного параметра получают вызовом getInitParameter. Также важен метод получения контекста сервлета getServletContext, через обращение к которому можно узнать много полезного о среде, в которой запущен и выполняется сервлет.

Контекст выполнения сервлета интересен тем, что дает примитивные средства для общения с сервером. Скажем, для выполнения задачи требуется узнать MIME-тип того или иного файла. Всегда пожалуйста, вызовите метод getMimeType контекста. Или нужно узнать истинный маршрут файла относительно каталога, в котором сервер хранит документы. Тоже нет проблем, метод getRealPath к вашим услугам. Информация же о самом сервере предоставляется по вызову getServerInfo().

Отдельно стоят метод, загружающий сервлет по имени getServlet, и метод, возвращающий энумератор с именами всех установленных сервлетов getServletNames. Однако не рекомендуется пользоваться ими, так как в будущей версии Java Servlet Development Kit их может уже и не быть.

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

3. Запуск и настройка сервлетов

Настало время остановиться на деталях настройки и запуска сервлетов. Для этого следует поговорить о файле свойств. Имя этого файла — servlet.properties. В нем в виде пар «ключ—значение» хранятся свойства, используемые для конфигурации, создания и инициализации сервлетов. Изначально для любого из сервлетов предопределено два свойства. Первое, servlet.<имя сервлета>.code, определяет имя сервлета и ставит его в соответствие двоичному class-файлу сервлета. Например, если вы скомпилировали класс сервлета с именем MyServletClassName, то получите в результате компиляции файл с именем MyServletClassName. class и можете присвоить ему краткое имя, скажем, myservlet, следующим образом:

servlet.myservlet.code=MyServletClassName

Теперь, когда вы обратитесь к сервлету с именем myservlet, сервер найдет эту строку в файле свойств и, опираясь на найденное значение, загрузит класс MyServletClassName, инициализирует его и передаст ему ваш запрос. Следует помнить о том, что имя class-файла должно задаваться полностью, включая имя пакета, в котором определен класс. Второе свойство, servlet.<имя сервлета>.initargs, определяет передаваемые сервлету параметры инициализации. Значения такого рода параметров могут быть получены сервлетом методом getInitParameter. Если параметров несколько, они отделяются друг от друга запятыми. Пример задания параметров:

servlet.myservlet.initargs= \

someParameterName1=someValue, someParameterName2=otherValue

Файл servlet.properties помещают в определенный каталог на сервере, где хранятся class-файлы. Заметим, однако, что разные серверы допускают альтернативное местоположение файла свойств (по настройке администратора).

Теперь поговорим об утилите servletrunner, которая по сути является простейшим Web-сервером, специально предназначенным для работы с сервлетами. После запуска он «слушает» порт 8080, и если произошел запрос, то, обратившись к сервлету, servletrunner получает от него ответ и пересылает последний программе-клиенту. Командная строка servletrunner имеет различные опции, но полезными могут оказаться лишь следующие:

p port – «прослушиваемый» в ожидании запроса порт;

t timeout – время тайм-аута в мс;

d dir – каталог, где лежат сервлеты;

r root – корневой каталог, в котором хранятся документы;

s filename – альтернативное имя файла свойств servlet property file name

v – отображать выводимые в стандартные потоки данные.

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

Теперь вкратце о том, как обратиться к сервлету из Web-браузера. По умолчанию адрес URL для отправки запроса состоит из нескольких частей: имени компьютера, номера порта, каталога servlet, имени сервлета и списка параметров. К примеру, обратиться к сервлету myservlet, находящемуся на локальном компьютере, можно так:

http://localhost:8080/servlet/myservlet?param1=somevalue&param2=othervalue

Напомним, что, тоже по умолчанию, утилита servletrunner (и некоторые серверы Web) «слушает» запросы к порту с номером 8080. Приведенный выше запрос обращается к сервлету myservlet, передавая ему параметр param со значением somevalue. Это весьма полезно, когда нужно задавать параметры запроса «на лету» (в отличие от параметров инициализации).

4. Сервлет example, принимающий параметры

Чтобы все рассказанное о сервлетах не осталось для вас пустыми словами, создадим собственный сервлет example (пример 1), который будет выводить в окне браузера передаваемые сервлету имена и группы студентов или сообщение о том, что данный параметр не введен (итоги работы сервлета см. рис. ниже):