Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:JAVA. Серверные приложения
.pdf
Часть 3 Серверные Java-компоненты Servlet 161
Get(). О том, что вывод информации будет сформирован в виде HTMLстраницы, говорит пятая строка. Последующие строки, вплоть до одиннадцатой, определяют внешний вид выводимых данных. Блок строк с
двенадцатой по девятнадцатую предназначен для вывода информации о
передаваемых клиентских параметрах. Также в двадцатой строке указывается создание еще одного блока выводимой информации, но теперь
это уже информация о заголовках, используемых клиентом. Все то же
самое повторяется и для cookies, строки с двадцать седьмой по тридцать вторую. Поскольку все HTML теги должны быть закрыты, то в
тридцать третьей строке указывается операция закрытия HTML тегов.
И наконец тридцать четвертая строка предназначена для освобождения
ресурсов.
Обработка клиентского запроса — основная задача любого servlet,
другой задачей servlet можно с уверенностью назвать формирование
ответа для клиента. Выделение необходимой информации из поступившего запроса для каждого метода передачи — традиционная задача,
выполняемая CGI-скриптами. А там где CGI-скрипты, там и servlet.
Для выделения информации â CGI используется переменная
QUERY_STRING для метода передачи GET.
Если же информация была отправлена при помощи метода POST, то
используется системный поток. Во-вторых, необходимо отделить передаваемые параметры от системных символов. Обычно параметры представляют из себя пары значений, разделенных знаком амперсанта. Затем выделяются названия (имена) параметров, левые перед знаком равно, и их значения правый элемент после знака равно. В-третьих,
производится расшифровка URL. Буквенные параметры пересылаются
неизменными, а числовые необходимо привести к соответствующему
виду, пробелы заменяются знаком плюс, остальные принимают вид
%XX, где XX эквивалент знака в ASCII раскладке. Чтобы было более
понятно, о чем идет речь, можно привести маленький пример. Передаваемые данные состоят из трех слов, являющихся параметрами запроса, осуществленного в html элементе textfield: param1, ~otherparam и
someparam. Следуя выше указанному сценарию, полученная строка будет выглядеть следующим образом: ““%param1%2C+%7Eotherparam
%2C+someparam”. Знаки %2C определяют запятую плюс это пробел,
%7E — знак тильды. Пересылаемые пары значений param1=val1 ¶m2=¶m3=val3 и параметры могут иметь больше чем одно значение param1=val1¶m2=val2¶m1=val3. Одним из замечательных
свойств servlet является использование языка Java. Другим замечательным свойством можно считать автоматическую синтаксическую проверку поступившего на servlet запроса. Работа с пересылаемыми параметрами обязывает создателя servlet знать о наличии HTML-форм на
странице и параметрах, передаваемых этими формами.
Методы по работе с HTTP-протоколом, doGet() и doPost(), имеют два
параметра: HttpServletRequest и HttpServletResponse. Эти два объекта
представляют полную информацию о request и позволяют контролировать выходящий поток, отправляемый клиенту. Наиболее часто использование основных методов servlet, особенно предназначенных для обработки HTTP-запросов, связано с получением информации различными

162 Часть 3 Серверные Java-компоненты Servlet
методами самого протокола передачи данных. Возможное решение состоит в написании универсального метода обработки клиентского запроса и затем вызовов данного метода из основных методов servlet.
25.2. Основные объекты request и response
Request — сообщение, посылаемое клиентской программой, подобной
Web-браузеру, на сервер. Обычно в самом начале сообщения, в первых
строках, указывается протокол и метод передачи данных. Именно с
этими данными можно манипулировать для получения более подробной
информации о клиенте, обратившемся с запросом.
Обычный объект request порожден от стандартного интерфейса ServletRequest.
Данный объект ассоциирован с клиентским запросом. Обычно является одним из аргументов основного метода service().
Объект ServletRequest наследует методы родительского интерфейса
по работе с клиентскими значениями и атрибутами входящего потока.
Для работы с протоколом, зависимым servlet, в методах doGet() и doPost() используется объект класса HttpServletRequest,
интерфейса ServletRequest
.
порожденного от
Версия 2.1 API servlet использует два механизма обработки объекта
request. Первый использует специальные методы присваивания атрибутов объекту request, другой использует специальные ресурсы.
Методы getAttribute(), getAttributeNames() и setAttribute() используются только для объекта request, порожденного от класса HttpServletRequest, работающего с HTTP-протоколом. Если необходимо использовать эти методы с другим протоколом передачи, то объект request
должен наследоваться от класса ServletRequest. Методы предназначены, прежде всего, для использования с объектом класса RequestDispatcher. Именно класс RequestDispatcher чаще всего используется для перенаправления запроса в другой ресурс или получения клиентского запроса из другого ресурса. Использование атрибутов гарантирует
правильную обработку объектом RequestDispatcher клиентских запросов. Метод getRequestDispatcher(), в отличие от своего брата близнеца
ServletContext.getRequestDispatcher(), не может работать с относительными путями.
Следующий ряд методов предназначен для получения ресурсов из
внешних источников для объекта request. Методы getResource() и getResourceAsStream() объекта ServletContext обеспечивают доступ к
внешним ресурсам, таким, как конфигурационный файл или база данных.
Методы getCharacterEncoding(), getContentLength(), getContentType() предназначены для получения сведений о приложении, его объеме
MIME типе и используемой кодировке:
out.println("getCharacterEncoding: " + request.getCharacterEncoding());
out.println("getContentLength: " + request.getContentLength());
out.println("getContentType: " + request.getContentType());
out.println("getProtocol: " + request.getProtocol());

Часть 3 Серверные Java-компоненты Servlet 163
out.println("getRemoteAddr: " + request.getRemoteAddr());
out.println("getRemoteHost: " + request.getRemoteHost());
out.println("getScheme: " + request.getScheme());
out.println("getServerName: " + request.getServerName());
out.println("getServerPort: " + request.getServerPort());
out.println("getAuthType: " + request.getAuthType());
out.println("getMethod: " + request.getMethod());
out.println("getPathInfo: " + request.getPathInfo());
out.println("getPathTranslated: " + request.getPathTranslated());
out.println("getQueryString: " + request.getQueryString());
out.println("getRemoteUser: " + request.getRemoteUser());
out.println("getRequestURI: " + request.getRequestURI());
out.println("getServletPath: " + request.getServletPath());
out.println();
Входящий поток бинарных данных можно получить, используя метод getInputStream(). В отличие от потока получение текстовых данных
осуществляется методом getReader().
Для работы с передаваемыми параметрами служат методы getParameter(), getParameterNames(), getParameterValues(). Служебную информацию об удаленном пользователе получают, используя специальные методы getProtocol(), getScheme(), getServerName(), getServerPort(), getRemoteAddr(), getRemoteHost(), getRealPath(), à также
используемых в локалях (географически зависимых данных) getLocale(), getLocales(). И наконец, если приложение использует протокол
HTTPS, то это можно определить с помощью метода isSecure(), возвращающего значение true, в случае использования такового протокола.
Объект request имеет ряд методов для работы с CGI переменными, а
также по выделению информации из поступившего клиентского запроса.
Enumeration paramNames = request.getParameterNames();
while(paramNames.hasMoreElements()) {
String paramName = (String)paramNames.nextElement();
out.println("<TR><TD>" + paramName + "\n<TD>");
String[] paramValues = request.getParameterValues(paramName);
if (paramValues.length == 1) {
String paramValue = paramValues[0];
if (paramValue.length() == 0)
out.print("<I>No Value</I>");
else
out.print(paramValue);
} else {
out.println("<UL>");
for(int i=0; i<paramValues.length; i++) {
out.println("<LI>" + paramValues[i]); }
out.println("</UL>"); } }
Объект response представляет набор информации, отправляемой
сервером клиенту. Данный объект порожден от интерфейса ServletResponse.

164 Часть 3 Серверные Java-компоненты Servlet
Методы объекта response можно разделить на несколько частей,
предназначенных для выполнения различных задач по работе создания
клиентского ответа. Непосредственно за получение выходящего потока
отвечает метод getOutputStream (), другой метод используется при создании текстового ответа getWriter(). Установкой типа передаваемого
приложения и за его длину отвечают методы setContentLength(), getCharacterEncoding(), setContentType().
Несколько методов предназначено для работы с системным буфером.
Метод setBufferSize() указывает размер объекта response. Маленький размер буфера позволяет очень быстро пересылать данные клиенту. Метод должен вызываться перед оправкой ответа. Получение размера буфера getBufferSize() и сброс буфера flushBuffer(), а также его
очистку reset() осуществляют указанные методы.
Об успешном выполнении ответа можно узнать, используя метод isCommitted().
Для работы с национальными настройками есть пара методов setLocale() установки и getLocale() получения значений национальных настроек.
Так же как и объект request, является вторым обязательным аргументом основного метода service(). Объект используется для передачи
клиенту данных различных типов. При отправке бинарных данных используется выходящий поток ServletOutputStream,
помощи метода getOutputStream()
. Если же отправляются текстовые
получаемый при
данные, то используется стандартный поток PrintWriter, доступ к которому можно получить, используя метод getWriter()
. Если же посылаются смешанные данные, и текстовые и бинарные, то для передачи легче
воспользоваться объектом класса ServletOutputStream .
Метод setContent() объекта response предназначен для установления
типа отправляемых данных и должен использоваться до того, как данные будут переданы клиенту при помощи выходного потока PrintWrtiter или ServletOutputStream. Для изменения стандартных кодировок
используется метод setLocale(java.util.Locale)
. Обычно в Web-страницах
используется кодировка ISO-8859-1, для ее изменения и используется
вышеуказанный метод. Как и метод setContentType(), метод setLocale()
используется только до формирования выходящего потока.
Для работы с HTTP-протоколом существует другая версия объекта
response, порожденная от интерфейса HttpServletResponse, который, в
свою очередь, расширен от интерфейса ServletResponse.
Response —
объект, общающийся с клиентом по HTTP-протоколу, имеет дополнительные методы для работы со специфическими http-данными, cookies,
headers, status code.
Минимальная структура servlet, обрабатывающего GET метод передачи HTTP-протокола рассмотрена ниже. При использовании другого
метода передачи, например POST, необходимо в пятой строке примера
заменить метод doGet() на соответствующий doPost().
•
import java.io.*;
•
import javax.servlet.*;
•
import javax.servlet.http.*;
•
public class SomeServlet extends HttpServlet {

Часть 3 Серверные Java-компоненты Servlet 165
public void doGet (HttpServletRequest request, HttpServletResponse
•
response)
throws ServletException, IOException {
•
PrintWriter out = response.getWriter();}
•
out.println("Hello World"); }
•
Данная структура представляет "скелет" обычного servlet, обрабатывающего HTTP-запросы, т. е. метод service() заменен методом doGet().
Строки первая, вторая, третья указывают импортирование пакеты, необходимые для создания servlet. Первый оператор импортирования java.import.io.* обязателен, если предполагается в дальнейшем использовать объекты типа PrintWriter, находящийся в пакете java.io. Хотя в
пакете javax.servlet имеются собственные классы по организации работы с входящими и выходящими потоками ServletOutputStream и ServletInputStream, очень часто используется объект класса PrintWriter для
работы с текстовыми данными. Четвертая строка содержит определение создаваемого класса SomeServlet порожденного от HttpServlet. Не
запрещается использование любой другой конструкции для создания
объекта, принятого в Java-приложениях. Например, вместо короткого
имени родительского класса HttpServlet из пакета javax.servlet, вторая
строчка с оператором import, можно указать его полное имя javax.servlet.HttpServlet, тогда оператор import в третьей строке не потребуется,
при условии, что не будут импортироваться другие классы из данного
пакета. Пятая строка определяет основной метод doGet(), которому передаются два параметра: request класса HttpSevletRequest, находящегося в пакете javax.servlet.http, и response класса HttpServletResponse.
Именно для этого потребовалось импортировать в третьей строке пакет
javax.servlet.http, указанные оператором throws исключительные ситуации ServletException и Ioexception, которые должны быть обязательно
обработаны. Шестая строка создает объект out класса PrintWriter из
родового пакета java.io, самая первая строка, для вывода данных.
Практически данный servlet ничего не делает, это готовая форма для
дальнейшего расширения. Здесь не используются методы init() и destroy(), и оператор out не посылает никаких данных обратно клиенту. Последовательность операторов import не важна, но последовательность
используемых объектов методов иногда приходится определять заранее. Переменная создается до того, как ее можно будет использовать.
Действия этого принципа уже описывались при использовании методов
setContentType() и setLocale(), они обязательно используются перед передачей данных.
Для придания servlet какой-нибудь функциональности можно заставить объект out выводить какую-нибудь информацию, дополняя пример
седьмой строкой приблизительно так: out.println("Hello World"); }
Теперь servlet должен будет вывести сообщение Hello World в окне
браузера клиента. Но пока это только текстовый.java файл, который необходимо откомпилировать стандартным javac компилятором, входящим в Java Development Kit, или другим Java-компилятором. После
успешной компиляции полученный.class необходимо разместить на сервере, в специальной директории или папке, называемой servlet.

166 Часть 3 Серверные Java-компоненты Servlet
И наконец, чтобы увидеть великое диво — работающий servlet,
нужно обратиться ê «шедевру» èç обычной HTML-страницы
http://host/servlet/SomeServlet.
Не прекращая ни на минуту совершенствовать творение, заставим
его вывести строку в более элегантном виде, сделав небольшие дополнения в первом варианте. Во-первых, добавим вызов объекта response и,
используя его метод setContentType() с параметром ("text/html"), указывающим, что выводимая строка будет HTML-текстом. Все это указано
в строке восемь нижеследующего примера. А оператор out примет более
внушительный вид, теперь в нем прописаны еще и HTML теги:
import java.io.*;
•
import javax.servlet.*;
•
import javax.servlet.http.*;
•
public class NewSameSevlet extends HttpServlet {
•
public void doGet(HttpServletRequest request, HttpServletResponse
•
response)
throws ServletException, IOException {
•
ServletOutputStream out = response.getOutputStream();
•
response.setContentType("text/html");
•
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML
•
4.0 " + "Transitional//EN\">\n" + "<HTML>\n" +
"<HEAD><TITLE>Hello World</TITLE></HEAD>\n" +
•
"<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY>
•
</HTML>");}
•
public void doPost (HttpServletRequest request, HttpServletResponse response){doGet (request,response)}}
Только что созданный servlet будет обрабатывать HTTP-запросы, о
чем говорит четвертая строка, поскольку servlet расширен от HttpServlet. В пятой строке описывается метод doGet(), содержащий основное
тело программы. Шестая строка содержит стандартные классы исключительных ситуаций. В седьмой строке создается объект out класса javax.servlet.ServletOutpurStream для формирования ответа в виде текста. Объекту out присваивается значение выходящего потока. После
указывается, что текст ответа является HTML-текстом при помощи метода setContentType(). В девятой строке указывается HTML-конструкция DOCTYPE, обычно она игнорируется Web-браузерами и предназначена для указания версии используемого HTML.
Если неизвестно, каким способом будет осуществляться доступ к servlet, можно в одном из основных методов описать тело и затем вызвать
этот основной метод из различных других методов. В десятой строке
именно этот способ указан. Можно создать один универсальный метод,
обрабатывающий клиентский запрос, вызов которого осуществляется из
остальных методов.
Часто возникает необходимость обновления данных, получаемых
клиентом без организации запроса клиента. Поставляемые данные
должны обновляться с какой-то периодичностью. Не каждый пользователь имеет привычку нажимать кнопку refresh (обновление данных) через определенные интервалы времени.

Часть 3 Серверные Java-компоненты Servlet 167
Чтобы пользователю этого не приходилось делать, в HTML-странице
нужно вставить нечто похожее на:
<META HTTP-EQUIV="Refresh" CONTENT="2; URL=http://someWhe-
re.com/servlet/ReloadServlet">
Непосредственно данные эта строка не обновит, но страницу по указанному адресу http:// someWhere.com/servlet/ReloadServlet перезагрузит каждые две секунды.
В рабочем servlet можно только добавить параметр объекта out:
import java.io.*;
•
import javax.servlet.*;
•
import javax.servlet.http.*;
•
public class NewSameSevlet extends HttpServlet implements Seriali-
•
zable{
public void doGet(HttpServletRequest request, HttpServletResponse
•
response)
throws ServletException, IOException {
•
PrintWriter out = response.getWriter();
•
response.setContentType("text/html");
•
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML
•
4.0"+
"Transitional//EN\">\n" + "<HTML>\n" +
•
•
"<HEAD><TITLE>Hello World</TITLE></HEAD>\n" +
•
"<BODY>\n" + "<H1>Hello WWW</H1>\n" + "</BODY>
</HTML>");
•
out.write ("<META HTTP-EQUIV=\"Refresh\ "CONTENT=\"2;
URL=http://SomeWhere.com/servlet/ReloadServlet\"> ");}}
Пример не отличается от вышеприведенного, но содержит в дополнительной, тринадцатой строке, специальную HTML-конструкцию обновления страницы.
Другой приятной необходимостью является поиск нужной информации, чаще всего поисковые механизмы реализовываются на Perl, прекрасно приспособленном для работы со строками, но Java ничем не хуже, просто значительно мощнее.
Так как параметры передаются парами параметр=значение, а между
парами служебные знаки, обычно амперсанда (&) для протокола HTTP,
то кроме самого поиска приходится еще и разбирать приходящую стоку.
Одним из замечательных свойств servlet является встроенная проверка
обрабатываемых строк, проводимая методом getParametr()объекта request. Возвращаемые значения типа строк String. Если возвращаемый параметр не имеет значения, то возвращается имя параметра и возвращается значение null при отсутствии параметра. Параметр может иметь
больше чем одно значение, в этом случае нужно воспользоваться методом getParameterValues() того же объекта. Тогда возвращается коллекция (массив) строк. В реальных приложениях может существовать несколько параметров, для которых осуществляется поиск. Использование
метода getParameterNames () возвращает коллекцию всех параметров.

168 Часть 3 Серверные Java-компоненты Servlet
import java.io.*;
•
import javax.servlet.*;
•
import javax.servlet.http.*;
•
import java.util.*;
•
public class readParams extends HttpServlet {
•
public void doGet(HttpServletRequest request, HttpServletResponse
•
response)
throws ServletException, IOException {
•
PrintWriter out = response.getWriter();
•
response.setContentType("text/html");
•
String title = "Reading Three Parameters";
•
out.println("<BODY>\n" + "<H1 ALIGN=CENTER>" + title +
•
"</H1>\n" + "\n" +
"<LI>param1: " + request.getParameter("param1") + "\n" +
•
"<LI>param2: " + request.getParameter("param2") + "\n" +
•
"<LI>param3: " + request.getParameter("param3") + "\n" +
•
"</UL>\n" + "</BODY></HTML>"); }
public void doPost(HttpServletRequest request, HttpServletResponse
•
response)throws ServletException, IOException {doGet(request, response); }}
И опять ничего страшного не произошло. Был импортирован еще
один пакет, теперь четвертая строка содержит оператор import java.util
для работы с коллекциями, десятая строка не несет никакой функциональной нагрузки, просто текстовая строка. Основными здесь являются
строки одиннадцатая, двенадцатая и тринадцатая — именно здесь получают параметры. Четырнадцатая строка позволяет использовать метод doPost(), имеющий такие же параметры, как doGet(), и вызывающий соответствующий метод. Эта конструкция предпочтительнее в использовании, ÷åì написание различных файлов ñ различными
методами, ибо нет никакой гарантии, каким способом будут переданы
данные на сервер GET или POST.
Но прочитать параметры полдела, их надо обработать и отправить
ответ, использующий полученные данные.
Отображение данных не менее важная задача. Для чего тогда пользователь посылает запрос? Передаваемых параметров может быть несколько, обычно для работы с множеством однотипных объектов программисты используют разные виды коллекций. Java поддерживает несколько типов коллекций, такие, как хэш-таблицы, массивы, бинарные
деревья. Все коллекции находятся в родовом пакете java.util, который
необходимо импортировать для работы с коллекциями объектов, обрабатываемых servlet.
Чтобы работать с конкретными параметрами, необходимо воспользоваться методом getParameterNames() объекта, порожденного от
HttpServletRequest. Другой метод денного объекта getParameterValues()
предназначен для получения значений передаваемых параметров:
•
import java.io.*;
•
import javax.servlet.*;
•
import javax.servlet.http.*;

Часть 3 Серверные Java-компоненты Servlet 169
import java.util.*;
•
public class ShowParameters extends HttpServlet {
•
public void doGet(HttpServletRequest request, HttpServletResponse
•
response)
throws ServletException, IOException {
•
PrintWriter out = response.getWriter();
•
response.setContentType("text/html");
•
String title = "Reading All Parameters";
•
out.println("<BODY BGCOLOR=\"#FDF5E6\">\n" +"<H1
•
ALIGN=CENTER>" + title + "</H1>\n" + "<TABLE BORDER=1
ALIGN=CENTER>\n" +
"<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Parameter Name
•
<TH>Parameter Value(s)");
•
Enumeration paramNames = request.getParameterNames();
•
while(paramNames.hasMoreElements()) {
•
String paramName = (String)paramNames.nextElement();
•
out.println("<TR><TD>" + paramName + "<TD>");
•
String[] paramValues = request.getParameterValues(paramName);
•
if (paramValues.length == 1) {
•
String paramValue = paramValues[0];
•
if (paramValue.length == 0)
•
out.print("<I>No Value</I>");
else out.print(paramValue); }
else {out.println("<UL>");
•
byte _l=paramValues.length;
•
for(byte i=0; i<_l; i++) { out.println("" + paramValues[i]); }
•
out.println("</UL>"); } }
•
out.println("</TABLE>\n</BODY></HTML>"); }
•
public void doPost(HttpServletRequest request, HttpServletResponse
response)
•
throws ServletException, IOException {
•
doGet(request, response); }}
Первые одиннадцать строк уже не представляют практического интереса, важнее то, что будет происходить с двенадцатой строки. Здесь
указывается коллекция объектов paramNames, в которую помещаются
имена всех параметров переданных клиентов. Поскольку объектов всетаки несколько, то одним из решений является помещение всех имен
параметров в коллекцию, чтобы легко просмотреть все элементы в данной коллекции. Объект paramNames наследует интерфейс Enumeration.
В тринадцатой строке проверяются все объекты в этой коллекции с помощью оператора while и метода hasMoreElements(), возвращающего
значение true, если достигнут последний элемент коллекции. И пока не
достигнут последний объект в коллекции, каждый следующий элемент
получает имя и преобразуется в строку, так как параметры могут быть
не только типа String, четырнадцатая строка, String paramName =
(String)paramNames.nextElement(). В пятнадцатой строке оператором
out выводятся все параметры, чаще всего такая операция не является
обязательной, а служит для проверки. Пока еще конечный элемент не

170 Часть 3 Серверные Java-компоненты Servlet
определен, создается массив строк, именно здесь у каждого параметра
читается его значение, шестнадцатая строка. Необходимо отметить, что
начальным элементом в массиве является нулевой, а не первый. Строки
с семнадцатой по девятнадцатую проводят проверку наличия в массиве
значение каждого параметра. Если имеется одно значение, то выводится значение нулевого элемента, если же значения отсутствуют, то выводится сообщение No Value, в противном случае отображаются все
присутствующие в массиве значения. В двадцать третьей строке описывается еще один основной метод — doPost(), предназначенный для обработки запроса, посланного методом POST HTTP-протокола. В методе
отсутствует дублирование операторов метода doGet(), а просто вызывается сам метод doGet().
В общем виде запрос выглядит как HTML-страница, если клиентом
является Web- браузер, по-другому это будет выглядеть для WAP- и
Java-клиентов. Пока рассмотрению подлежит только клиент, использующий Web браузер, как самый распространенный.
25.3. Классы исключительных ошибок servlet
В стандартном servlet API описано два класса исключительных ситуаций.
Первый — javax.servlet.ServletException.
зуется для обработки ошибок, возникших в момент исполнения servlet.
Второй класс javax.servlet.UnavailableException
ступность servlet в момент поступления клиентского запроса на сервер.
Объект этого класса исполь-
— указывает на недо-
25.4. Область видимости объектов
Для большинства используемых servlet существуют три основных
области видимости, в отличие от других серверных Java-компонентов.
В обычных Web-приложениях серверные компоненты выполняют различные задачи. И для каждой задачи создается свой servlet. Можно конечно же использовать один-единственный servlet для выполнения всех
задач, но это практически невозможно, да, наверное, и не нужно. Но
суть в том, что различные серверные компоненты должны взаимодействовать между собой, передавая друг другу различные параметры и реагируя на поведение остальных серверных компонентов. Именно взаимодействие и определяет область видимости.
Доступ одного ресурса к другому осуществляется за счет формирования запроса. Таким ярко выраженным примером для servlet можно
назвать метод forward() объекта RequestDispatcher. Объект доступен
только для конкретного данного запроса.
Объекты, используемые в клиентской сессии, доступны и другим объектам, доступ к которым имел клиент. В данном контексте хранилищем временной клиентской информации выступает объект класса HTTPSession.
Работа приложения тесно связана с объектами, хранящимися, в общей
«куче», доступ к которой обеспечивает объект класса ServletContext. Используя его методы, можно получить доступ ко всем объектам приложения.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
