Инициализация сервлета
Когда сервер загружает сервлет, сервер запускает метод сервлета init. Инициализация выполняется, прежде чем сервлет начнет обрабатывать запросы клиентов, и прежде чем сервлет будет уничтожен.
И хотя сервлеты выполняются на много-потокотоковых серверах, у сервлета во время инициализации нет одновременно выполняющихся потоков. Сервер вызывает метод init один раз, затем сервер загрузит сервлет, и больше метод init не вызывается до тех пор, пока сервер не перезагрузит сервлет. Сервер не может перезагрузить сервлет до тех пор, пока он не уничтожит его, используя метод destroy.
По умолчанию инициализация класса HttpServlet инициализирует сервлет и идентифицирует инициализацию. Чтобы проинициализировать сервлет определенным образом, переопределите метод init согласно той версии JSDK, которую используете: метод init(ServletConfig) для версии 2.0 и метод init() для версии 2.1. При переопределении метода init следуйте следующим правилам:
В случае возникновения ошибки инициализации, которая приводит сервлет в состояние неработоспособности, вызывайте исключение UnavailableException.
Как пример возникновения такого типа ошибок - невозможность установления необходимого сетевого соединения.
Не вызывайте метод System.exit.
Только для версии 2.0: Сохраняйте параметр ServletConfig так, чтобы метод getServletConfig мог вернуть эту величину. Самый простой способ реализовать это - надо, чтобы новый метод init вызывал super.init.
Здесь приведен пример метода init для версии 2.1:
public class BookDetailServlet ... {
public void init() throws ServletException { BookDBFrontEnd bookDBFrontEnd = (BookDBFrontEnd)getServletContext().getAttribute( "examples.bookstore.database.BookDBFrontEnd");
if (bookDBFrontEnd == null) { getServletContext().setAttribute( "examples.bookstore.database.BookDBFrontEnd", BookDBFrontEnd.instance()); } ... }
Как видите метод init простой: он пытается получить параметр, и если параметр еще не получил значения, он создает его.
Есть и другие инициализирующие задачи, которые сервлет может выполнять. Например, если сервлет использует базу данных, метод init может открыть соединение с ней и в случае неудачи вызвать исключение UnavailableException. Ниже приведен псевдокод о том, как мог бы выглядеть метод init:
public class DBServlet ... {
Connection connection = null;
public void init() throws ServletException {
// Соединяемся с базой данных перед запросами
try { databaseUrl = getInitParameter("databaseUrl"); ...
// Тем же способом берем параметры пользователя и пароля
connection = DriverManager.getConnection(databaseUrl, user, password); } catch(Exception e) { throw new UnavailableException (this, "Could not open a connection to the database"); } } ... }
Обеспечение "чистого" завершения
Чтобы обеспечить "чистое" завершение, уничтожение не должно разрушать ни какие разделяемые ресурсы до тех пор, пока не завершатся все сервис-процессы. Один момент реализации этого, проверка счетчика выполняемых сервисов. Другой - заключается в оповещении "долгоиграющего" методов, что пора завершать работу. Это выполняет другая часть кода приведенная ниже. Например:
public ShutdownExample extends HttpServlet { private boolean shuttingDown; ... //Методы доступа к процессам завершения
protected void setShuttingDown(boolean flag) { shuttingDown = flag; } protected boolean isShuttingDown() { return shuttingDown; } }
Ниже приведен пример метода destroy использующего вышеуказанные методы для обеспечения "чистого" завершения:
public void destroy() {
synchronized(lock) { /* Проверка на наличие ваполняемых сервисов, * и если таковые существуют, останавливаем их. */
if (numServices() > 0) { setShuttingDown(true); }
/* Ждем завершения всех сервисов. */
while(numServices() > 0) { try { wait(); } catch (InterruptedException e) { } } } }
Отслеживание сервисных запросов
За слежением за сервисными запросами, включите код в ваш сервлет, который будет считать количество запущенных сервис методов. Этот код должен иметь доступные методы прибавления, вычитания и возвращать их значения. Потому как разные потоки будут обращаться к этим методам, и метод destroy будет ждать, пока их количество не станет равным нулю, доступ к этим методам должен быть синхронизированным. Объект lock с модификатором private это тот объект, с помощью которого производится синхронизация. Например:
public ShutdownExample extends HttpServlet { private int serviceCounter = 0; private Object lock = new Object(); ... //Методы доступа к стетчику
protected void enteringServiceMethod() { synchronized(lock) { serviceCounter++; } } protected void leavingServiceMethod() { synchronized(lock) { serviceCounter--; if (serviceCounter == 0 && isShuttingDown()) notifyAll(); } } protected int numServices() { synchronized(lock) { return serviceCounter; } } }
Метод service должен вызывать метод увеличения счетчика каждый раз, когда метод начинает свое выполнение и вызывать метод уменьшения значения счетчика каждый раз, когда он возвращает значение. Вот один из вариантов того, как мог бы подкласс класса HttpServlet переопределить метод service. Переопределенный метод должен вызывать метод super.service для того, чтобы сохранить оригинальную функциональность метода HttpServlet.service.
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { enteringServiceMethod(); try { super.service(req, resp); } finally { leavingServiceMethod(); } }
Параметры инициализации
Вторая версия метода init вызывает метод getInitParameter. Этот метод использует имя параметра в качестве аргумента и возвращает строковое представление (String) величины этого параметра.
(Спецификация инициализации параметров зависит от сервера. Например, параметры, устанавливающие свойства, когда сервлет выполняется с помощью servletrunner или сервером JSDK2.1. Урок содержит общее объяснение свойств и как их создавать.)
Если по какой-то причине Вам потребуются имена параметров, используйте метод getParameterNames.
Разработка аккуратных "долгоиграющих" методов
Последняя деталь в обеспечении "чистого" завершения организовать аккуратное исполнение "долгоиграющих" методов. Методы, которые могут выполняться длительное время должны проверять значения методов предупреждающих о наступлении завершения, и при необходимости прерывать работу. Например:
public void doPost(...) { ... for(i = 0; ((i < lotsOfStuffToDo) && !isShuttingDown()); i++) { try { partOfLongRunningOperation(i); } catch (InterruptedException e) { } } }
Уничтожение сервлета
Метод destroy позволяет классу the HttpServlet уничтожить сервлет и индифицировать уничтожение. Чтобы уничтожить любые связанные с севлетом ресурсы, переопределите метод destroy. Метод destroy должен отменить любой инициализирующий процесс и синхронизировать установившийся статус с текущим статусом в памяти.
Следующий пример показывает метод destroy, который сопровождает псевдокод метода init из предыдущего урока:
public class DBServlet ... { Connection connection = null;
... // Метод init
public void destroy() { // Закрываем соединение и подготавливаем объект для сборщика мусора
connection.close(); connection = null; } }
Сервер вызывает метод destroy после того, как завершатся все вызовы сервиса, или пройдет определенный промежуток времени устанавливаемый сервером, что быстрее произойдет. Если Ваш сервлет производит какую-либо "долгоиграющую" операцию, метод service может продолжать выполняться в тот момент, когда сервер вызовет метод destroy. Вы ответственны за то, чтоб быть уверенным что, эти процессы должны быть завершены. Следующий урок
покажет Вам как.
Метод destroy описанный выше в примере предполагает, что все клиентские транзакции были завешены на тот момент, когда был вызван метод destroy, потому как сервлет не использовал "долгоиграющих" операций.
Сервлет выполняется до тех пор, пока сервер не уничтожит его, например, по запросу системного администратора. Когда сервер уничтожает сервлет, сервер запускает метод сервлета destroy. Этот метод запускается один раз; сервер не будет запускать метод destroy опять, до тех пор, пока сервер не перезагрузит этот сервлет и не проинициализирует.
В момент, когда сервер вызывает метод destroy, другой поток может принимать запрос. Урок Управление сервисными потоками во время выключения сервлета расскажет Вам, как произвести "чистое" выключение в случаях, когда могут выполняться "долгоиграющие" потоки запросов.
Управление сервисными потоками в момент выключения сервлета
Все методы сервлета service должны завершаться к моменту завершения работы сервлета. Сервер пытается обеспечить это, вызывая метод destroy либо после того, как все сервис-запросы будут возвращены, либо по завершению установленного сервером времени ожидания, что быстрее произойдет. Если Ваш сервлет использует операции, занимающие длительное время выполнения (это операции, выполнение которых превышает время ожидания сервера), процесс может быть не завершен в момент, когда сервер вызовет метод destroy. И вы должны обеспечить, чтобы все потоки управляющие клиентскими запросами, были завершены. В этом разделе обсуждается, как это реализовать.
Если у Вашего сервлета существуют потенциальные "долгоиграющие" сервисные запросы придерживайтесь следующих правил:
Следите за тем как много потоков запущено методом service.
Обеспечьте чистое завершение метода destroy, уведомляя "долгоиграющие" процессы о закрытии и ждите их завершения.
Обеспечить "долгоиграющие" процессы возможностью периодической проверки о закрытии сервлета, и в случае такой необходимости: останавливать работу, очищаться и возвращать значения.
Жизненный цикл сервлета
У каждого сервлета один и тот же жизненный цикл:
Сервер загружает и инициализирует сервлет
Сервлет ни кого не обслуживает или обслуживает одного и более клиентов
Сервер удаляет сервлет
(некоторые сервера делают это, только когда их выключают)
Взаимодействия с клиентами
После инициализации, сервлет готов к управлению запросами клиента. Эта часть жизненного цикла сервлета обсуждалась предыдущем уроке.
Dtime
Acrobat Distiller 3.0 for Windows
25 February 2001 г. at 0:07
=====================================================
Watched Folder Frequency = 10 seconds
After Distilling, PostScript Files = Moved
Compatiblity Level = 3.0
Generating ASCII Format Files = ON
Default Page Width = 612
Default Page Height = 792
Default Page Units = Points
Default Resolution = 600
Text and Graphics LZW Compression = ON
Color Image Downsample to = ON
Color Image Downsample to Resolution = 72
Color Image Automatic Filter Selection = ON
Color Image Compression = OFF
Color Image Compression Using = JPEG Medium
Grayscale Image Downsample to = ON
Grayscale Image Downsample to Resolution = 72
Color Image Automatic Filter Selection = ON
Grayscale Image Compression = OFF
Grayscale Image Compression Using = JPEG Medium
Monochrome Image Downsample to = ON
Monochrome Image Downsample to Resolution = 300
Monochrome Image Compression = ON
Monochrome Image Compression Using = CCITT Group 4
Subset Embedded Fonts = ON
Maximum Subset Percentage = 35
Embed All Fonts = ON
Use Prologue/Epilogue = OFF
Preserve OPI Comments = OFF
Color Conversion Method = Unchanged
Apply Transfer Functions
Apply Under Color Removal / Black Generation Functions
Preserve Overprint Settings = OFF
Preserve Halftone Screen Info = OFF
Convert CMYK Images To RGB = ON
=====================================================
Архитектура пакета Servlet
Пакет javax.servlet предоставляет интерфейсы и классы для написания сервлетов. Ниже приводится описание пакета.
Архитектуру пакета servlet
рассматривает назначение основных интерфейсов и объектов пакета servlet.
Дополнительные возможности HTTP сервлетов
Классы и интерфейсы описанные выше составляют обычный сервлет. HTTP сервлет обладает некоторыми дополнительными объектами, которые предоставляют возможности отслеживания сессии. Разработчик может использовать эти интерфейсы для поддержания статуса между сервлетом и клиентом, который сохраняется через множественные соединения в течение определенного периода времени. HTTP сервлеты также имеют объекты, которые работают с закладками (cookie). Разработчик использует интерфейс закладок для того, чтобы сохранять данные у клиента и получать эти данные обратно.
Другие применения сервлетов
Ниже перечислены некоторые из множества применений для сервлетов:
Организация сотрудничества между людьми. Сервлет может поддерживать множество запросов одновременно и может синхронизировать запросы. Это позволяет сервлетам поддерживать такие системы, как онлайн конференции.
Перенаправление запросов. Сервлеты могут перенаправлять запросы к другим серверам или сервлетам. Такие сервлеты могут использоваться для сбалансирования нагрузки между несколькими серверами, которые зеркально отображают одно и тоже содержание, и разбиения единственного логического сервиса на несколько серверов, согласно типу задачи или организационным границам.
Готовимся к написанию
Для того чтобы подготовиться к написанию, этот урок обсудит:
Handling GET and POST Requests
To handle HTTP requests in a servlet, extend the HttpServlet class and override the servlet methods that handle the HTTP requests that your servlet supports. This lesson illustrates the handling of GET and POST requests. The methods that handle these requests are doGet and doPost.
Handling GET requests
Handling GET requests involves overriding the doGet method. The following example shows the BookDetailServlet doing this. The methods discussed in the section are shown in bold.
public class BookDetailServlet extends HttpServlet {
public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... // set content-type header before accessing the Writer response.setContentType("text/html");
PrintWriter out = response.getWriter();
// then write the response out.println("<html>" + "<head><title>Book Description</title></head>" + ...);
//Get the identifier of the book to display String bookId = request.getParameter("bookId");
if (bookId != null) { // and the information about the book and print it ... } out.println("</body></html>"); out.close();
} ... }
The servlet extends the HttpServlet class and overrides the doGet method.
Within the doGet method, the getParameter
method gets the servlet's expected argument.
To respond to the client, the example doGet method uses a Writer from the HttpServletResponse object to return text data to the client. Before accessing the writer, the example sets the content-type header. At the end of the doGet method, after the response has been sent, the Writer is closed.
Handling POST Requests
Handling POST requests involves overriding the doPost
method. The following example shows the ReceiptServlet doing this. Again, the methods discussed in the section are shown in bold.
public class ReceiptServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... // set content type header before accessing the Writer response.setContentType("text/html");
PrintWriter out = response.getWriter();
// then write the response out.println("<html>" + "<head><title> Receipt </title>" + ...);
out.println("<h3>Thank you for purchasing your books from us " + request.getParameter("cardname") + ...); out.close();
} ... }
The servlet extends the HttpServlet class and overrides the doPost method.
Within the doPost method, the getParameter
method gets the servlet's expected argument.
To respond to the client, the example doPost method uses a Writer from the HttpServletResponse object to return text data to the client. Before accessing the writer the example sets the content-type header. At the end of the doPost
method, after the response has been set, the Writer is closed.
> > |
Интерфейс сервлета
Главным понятием в интерфейсом сервлета является интерфейс Servlet
. Все сервлеты реализуют этот интерфейс либо на прямую, либо обычным способом, наследуя класс, который реализует его, например как HttpServletИнтерфейс Servlet объявляет, но не реализует методы, которые управляют сервлетом и его общением с клиентами. При написании сервлета разработчик должен реализовать некоторые или все методы интерфейса сервлет.
Интерфейс ServletRequest
Интерфейс ServletRequest предоставляет сервлету доступ к:
Такой информации как имена параметров предоставляемых клиентом, протокол (схема) используемый клиентом, и имена удаленного хоста, который выполнил запрос и сервера, который его получил
Входной поток, ServletInputStream
. Сервлеты используют входной поток для получения данных от клиентов, которые используют протоколы уровня приложений, такие как методы HTTP POST и PUT.Интерфейсы, наследующие интерфейс ServletRequest позволяют сервлетам получать более специфичные данные протокола. Например, интерфейс HttpServletRequest
содержит методы для получения специальной информации HTTP заголовков.
Интерфейс ServletResponse
Интерфейс ServletResponse предоставляет сервлету методы, для отправки сообщений клиенту. Он:
Позволяет сервлету установить длину содержимого и тип MIME ответа.
Устанавливает выходной поток, ServletOutputStream
, и Writer через который сервлет может отправить данные ответа.Интерфейсы, наследующие интерфейс ServletResponse предоставляют сервлетам более специфичные возможности. Например, интерфейс HttpServletResponse
содержит методы позволяющие сервлету манипулировать специальной информации HTTP заголовков.
Использование сервлетов вместо CGI скриптов!
Сервлеты являются эффективным заменителем CGI скриптов. Они дают дорогу к генерации динамических документов, которые легче писать и быстрее выполнять. Сервлеты также обходят проблему программирования серверов с платформозависимыми интерфейсами прикладного программирования: они разрабатываются на стандартном расширении Java - Java Servlet API.
Итак, используем сервлеты для обработки клиентских HTTP запросов. Например, сервлет обрабатывающий данные, посланные POST запросом по HTTP из HTML формы, включающие заказ или данные кредитной карточки. Сервлет вроде этого мог бы быть частью системы приема и обработки заказов, работающий с базой данных продуктов и инвентаря, и возможно с онлайновой системой оплаты.
Примеры сервлетов
Последующие уроки расскажут вам, как писать HTTP сервлеты. Для этого потребуются некоторые знания HTTP протокола; чтобы узнать подробнее о HTTP протоколе, Вы можете ознакомиться с документом RFC for HTTP/1.1
.Урок использует пример Duke's Bookstore, простой онлайн книжный магазин который позволяет пользователям производить различные функции. Каждая функция обеспечивается сервлетом:
Просматривание книг выставленных на продажу | CatalogServlet | CatalogServlet |
Отбор книг, для покупки помещая их в "тележку" | CatalogServlet | CatalogServlet |
Получение более подробной информации о книге | BookDetailServlet | BookDetailServlet |
Управление базой данных книжного магазина | BookDBServlet | |
Просмотр книг отобранных для покупки | ShowCartServlet | ShowCartServlet |
Удаление книг из тележки | ShowCartServlet | ShowCartServlet |
Покупка книг отобранных в тележку | CashierServlet | CashierServlet |
Получение благодарности за сделанный заказ | ReceiptServlet | ReceiptServlet |
Урок использует сервлеты, чтобы продемонстрировать различные задачи. Например, сервлет BookDetailServlet используется, чтобы пояснить Вам, как управлять HTTP запросами GET, а сервлет CatalogServlet покажет вам отслеживание сессии.
Набор файлов исходных текстов, входящих в состав примера Duke's Bookstore. Для Вашего удобства, мы включили два загружаемых zip архива: один содержит все файлы исходных текстов необходимых для построения и выполнения примера, используя Java Servlet Development Kit (JSDK) версии 2.0, другой содержит все файлы исходных текстов необходимых для построения и выполнения примера используя JSDK2.1.
Чтобы запустить пример, вначале запустите процесс, который запустит сервлеты, такие как servletrunner из JSDK 2.0 или the server из JSDK 2.1. Как только процесс будет запущен, вызывайте сервлет из броузера.
Примеры сервлетов обсуждаемые в этих уроках
Расскажет о примерах, которые будут обсуждаться в последующих уроках.
Простой сервлет
Ниже приведенный класс полностью определяет сервлет:
public class SimpleServlet extends HttpServlet
{ // Управляет HTTP методом GET, генерируя простую web страницу.
public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; String title = "Simple Servlet Output";
// Вначале устанавливаем тип содержимого и другие заголовкиe
response.setContentType("text/html"); // Затем пишем ответ
out = response.getWriter(); out.println("<HTML><HEAD><TITLE>"); out.println(title); out.println("</TITLE></HEAD><BODY>"); out.println("<H1>" + title + "</H1>"); out.println("<P>This is output from SimpleServlet."); out.println("</BODY></HTML>"); out.close(); } }
Вот он!
Классы, упомянутые в разделе Архитектура пакета Servlet, выделены жирным шрифтом:
SimpleServlet наследует класс HttpServlet, который реализует и интерфейс Servlet.
SimpleServlet переопределяет метод doGet класса HttpServlet. Метод doGet вызывается, когда клиент осуществляет GET запрос (HTTP запрос по умолчанию), и выводит простую HTML страницу, возвращаемую клиенту
В самом методе doGet:
Запрос пользователя представлен объектом HttpServletRequest.
Ответ пользователю представлен объектом HttpServletResponse.
Так как ответом является текстовая информация, ответ посылается, используя объект Writer полученный от объекта HttpServletResponse.
Обзор сервлетов
Сервлеты это модули расширения для запрос-ответ ориентированных серверов, таких как web сервера с поддержкой Java. Например, сервлет ответственный за передачу информации из HTML форм для обновления базы данных компании.
Сервлет для сервера то же самое, что апплет для броузера. Но в отличие от апплета сервлеты не имеют графического интерфейса.
Сервлеты могут быть встроены в различные сервера, потому как интерфейс, который используется для написания сервлетов, не знает ничего о среде сервера или протоколе. Сервлеты становятся одними из самых распространенных среди HTTP серверов; много web серверов поддерживают интерфейс сервлетов.
Взаимодействие с клиентом
Когда сервлет принимает сигнал от клиента, он получает два объекта:
Объект ServletRequest
, который устанавливает связь от клиента к серверу.Объект ServletResponse
, который устанавливает связь от сервлета обратно к клиенту.ServletRequest и ServletResponse интерфейсы пакета javax.servlet.
Файл свойств
Свойства хранятся в текстовом файле с именем по умолчанию servlets.properties для пакета JSDK2.1 и servlet.properties для пакета JSDK2.0. Файл содержит свойства для всех сервлетов, которые будут запущены с помощью утилиты выполнения сервлетов. Вот, например, файл свойств для магазина Duke's Bookstore:
# Этот файл содержит свойства сервлетов из примера Duke's Bookstore.
#-------------------------------------------------------------------
# Главная страница Duke's Bookstore
bookstore.code=BookStoreServlet
# Просмотр всех книг магазина
catalog.code=CatalogServlet
# Информация по конкретной книге
bookdetails.code=BookDetailServlet
# Просмотр книг, выбранных для покупки
showcart.code=ShowCartServlet
# Собираем информацию для покупки выбранных книг
cashier.code=CashierServlet
# Выставляем счет пользователю купившему книги
receipt.code=ReceiptServlet
Инициализационные параметры
Параметр свойства имя.initParams содержит параметры инициализации сервлета для пакета JSDK2.1. Для сервлетов пакета JSDK2.0, - свойство servlet.имя.initArgs. (в этой части обсуждаются имена свойств пакета JSDK2.1.)
Синтаксис одного инициализационного параметра: имяПараметра
= значениеПараметра. Данное свойство (данная пара ключ-значение) должно представлять одну логическую линию. Для читабельности, Вы можете использовать backquote-синтаксис, чтобы свойство могло занимать несколько линий в файле. Например, если магазин берет начальный HTML файл как параметр, начальный аргумент сервлета может выглядеть так:
servlet.bookdb.initArgs=\ mainFile=examples/bookstore/Bookstore.html
Множественные инициализационные параметры разделяются запятой. Например, сервлет BookDetail получает информацию о книге, соединяясь с реальной базой данных, его начальные аргументы могут выглядеть так:
bookdetails.initParams=\ user=duke,\ password=dukes_password,\ url=fill_in_the_database_url
Класс Servlet
В этом разделе используются укороченные имена свойств пакета JSDK2.1. Если вы используете JSDK2.0, добавляйте "servlet." в начало имени свойств.
Свойство, которое ассоциирует имя Вашего сервлета с именем класса сервлета это имя.code. Значение этого свойства - полное имя класса сервлета, включая пакет. Например, если бы классы магазина Duke Bookstore, были в пакете examples.bookstore, сервлет CatalogServlet включал бы свойство:
catalog.code=examples.bookstore.CatalogServlet
Свойство имя.code именует Ваш сервлет, ассоциируя имя (в данном примере, catalog) с классом (в данном примере, examples.bookstore.CatalogServlet).
Подготовить к запуску JSDK сервер
Прежде чем Вы запустите JSDK сервер, Вам надо иметь подходящую JDK:
Для Sparc Solaris 2.6, пакет JSDK был тестирован с версией JDK 1.1.7 & Java2 SDK 1.2
Для Windows98/NT, пакет JSDK был тестирован с версией JDK 1.1.7 & Java2 SDK 1.2
Также можно
сконфигурировать различные свойства JSDK сервера, прежде чем Вы его запустите. Эти свойства включают порт сервера, по умолчанию установленный - 8080, имя хоста сервера, по умолчанию установленный - localhost, и корневой каталог (root), по умолчанию установленный в поддиректории веб страниц (webpages) установленного пакета JSDK. Чтобы просмотреть или изменить данные конфигурационные значения, откройте файл default.cfg в директории, где проинсталлирован JSDK.
И последнее, запомните, что директория с сервлетами находится:
doc_root/WEB-INF/servlets
Свойства сервлета
Свойства это пары переменных состоящие из ключа и его значения, использующиеся для установки конфигурации, создания и инициализации сервлета. Например, в пакете JSDK2.0 servlet.catalog.code=CatalogServlet является свойством, где servlet.catalog.code это ключ со значением CatalogServlet. В пакете JSDK2.1 тоже свойство называется catalog.code=CatalogServlet - свойство, у которого catalog.code это ключ со значением CatalogServlet.
Использование свойств требует от Вас дать имя сервлету. (Строка catalog в имени свойств приведенных выше это имя каталога сервлета.) Имя сервлета дает возможность программе, которая выполняет сервлет, правильно ассоциировать свойства с соответствующими сервлетами. А так же это имя, которое клиент будет использовать, чтобы получить доступ к Вашему сервлету.
Утилиты для запуска сервлетов из пакета JSDK содержат два свойства для сервлетов. Они ассоциируют имя, которое Вы выбрали для Вашего сервлета с:
именем класса сервлета
любыми инициализационными параметрами, которые требуются сервлету
Утилита servletrunner
Написанный сервлет может быть проверен с помощью утилиты включенной в пакет JSDK. Пакет JSDK 2.0 содержит утилиту servletrunner, в то время как JSDK 2.1 приходит с упрощенным вариантом HTTP сервера. В этом уроке обсуждается, как установить и запустить эти утилиты.
Установка свойств сервлета
Вам надо описать некоторые детали, чтобы запустить сервлет. Например, если сервлет требует инициализационные параметры, вам потребуется установить эти данные, прежде чем запускать процесс JSDK, который запустит ваш сервлет.
Выключение JSDK сервера
Чтобы остановить выполнение сервера, пакет JSDK предоставляет команды выключения в той же директории, где и команды для запуска (директория, куда проинсталлирован пакет JSDK).
Следующей командой выключаете сервер под Unix:
% stopserver
А такой командой выключаете сервер под Windows:
C:\jsdk\> stopserver
Запуск JSDK сервера
Чтобы запустить сервер, используйте под Unix Korn-shell скрипт или под Windows .bat файл, который находится в директории, куда проинсталлирован пакет JSDK.
Следующей командой запускается сервер под Unix:
% startserver
А такой командой запускается сервер под Windows:
C:\jsdk\> startserver
Как только JSDK сервер запущен, Вы можете использовать его для проверки своих сервлетов.
Запуск сервера (JSDK 2.1)
После того, как будет установлен файл свойств, вы можете запускать сервлеты на сервере прилагаемом к пакету JSDK2.1. В этом разделе обсуждается, как это сделать.
Запуск сервера (JSDK2.1)
Так же как утилита servletrunner из пакета JSDK2.0, сервер включенный в пакет JSDK2.1 прост, он поддерживает многопотоковые процессы, которые могут быть запущены одним или несколькими сервлетами.
В отличие от некоторых веб-серверов, JSDK сервер не перегружает автоматически обновленные сервлеты. Хотя вы можете остановить и перезапустить сервер, чтобы запустить новую версию сервлета.
В этом разделе вы узнаете как:
Запуск servletrunner (JSDK 2.0)
После того, как будет установлен файл свойств, вы можете запускать сервлеты с помощью утилиты servletrunner прилагаемой к пакету JSDK2.0. В этом разделе обсуждается, как это сделать.
Запуск servletrunner (JSDK2.0)
Утилита servletrunner находится в директории <jsdk>/bin. Вам буде проще запустить эту утилиту, если к директории будет прописан путь. Например:
% setenv PATH /usr/local/jsdk/bin: (для UNIX) C> set PATH=C:\jsdk\bin;%PATH% (для Win32) export PATH=/usr/local/jsdk/bin:$PATH (для Linux) - от переводчика
Выполняя servletrunner с ключом -help, Вы получите инструкции по использованию, не запуская саму утилиту:
% servletrunner -help Usage: servletrunner [options] Options: -p port the port number to listen on -b backlog the listen backlog -m max maximum number of connection handlers -t timeout connection timeout in milliseconds -d dir servlet directory -r root document root directory -s filename servlet property file name -v verbose output %
Чтобы просмотреть установки этих величин по умолчанию, запустите servletrunner с ключом -v. Команда запускает утилиту; просто остановите ее, после того, как Вы получите информацию, если Вы еще не готовы использовать ее или хотите запустить с другими параметрами. На Unix, например, Вы можете использовать команду kill, чтобы остановить выполнение servletrunner.
% servletrunner -v Server settings: port = 8080 backlog = 50 max handlers = 100 timeout = 5000 servlet dir = ./examples document dir = ./examples servlet propfile = ./examples/servlet.properties
Замечание: В значениях по умолчанию, выведенных выше, в директориях servlet dir, document dir и директории servlet propfile содержится точка ("."). Точка предполагает текущую директорию выполнения. Текущей директорией выполнения обычно является директория, из которой была запущена программа. В данном случае, однако, точка означает директорию, где установлен
JSDK.
Если Вы запустите утилиту servetrunner из другой директории, утилита servletrunner первым делом сменит ее текущую рабочую директорию (и, в следствии, то, что Вы считали точкой).
Как только утилита servletrunner будет запущена, Вы можете использовать ее для проверки своих сервлетов.