
lec-ServletLifeCycle-part2-v001
.pdf
7. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ
Инициализация параметров приложения используется разработчиками и администраторами для передачи в данное приложение параметров, локальных для данного сервера приложений. Для этих целей каждый сервлет в приложении имеет доступ к объекту ServletContext с помощью вызова метода:
ServletContext context = getServletContext();
Вот некоторые полезные методы контекста:
Interface javax.servlet.ServletContext {
String getInitParameter() - Возвращает строку типа String,
содержащую значение инициализационного параметра, или null, если значения параметра не задано в дескрипторе развертывания.
java.util.Enumeration GetInitParameterNames() - Возвращает имена инициализационных параметров в виде Enumeration объектов типа String или пустой объект типа Enumeration, если инициализационные параметры отсутствуют.

7.2. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
Interface javax.servlet.ServletContext {
...
java.lang.Object getAttribute( String name ) java.util.Enumeration getAttributeNames() - Возвращает имена
атрибутов в виде Enumeration объектов типа String или пустой объект типа Enumeration, если атрибуты отсутствуют.
void removeAttribute(java.lang.String name) – Удаляет атрибут с заданным именем из контекста приложения.
void setAttribute( String name, Object object) – Помещает атрибут с заданным именем в контекст приложения («связывает атрибут с контекстом»).
java.net.URL getResource(String path) throws java.net.MalformedURLException - Возвращает ссылку на объект типа java.net.URL по заданному относительному пути path (начинается с символа „/‟).
java.io.InputStream getResourceAsStream(String path) - Это сокращенный способ получения ссылки на поток для некоторого ресурса. Также может быть получена вызовом:
getResource(path ).openStream();
}

7.3. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
Любой сервер приложений ведѐт журналы – файлы или таблицы в БД, в которые выводится информация о работе сервера и его подсистем, в том числе сервлетов и пр работающих приложений. Методы журналирования сервлетов полезны для вывода отладочной информации и для журналирования проводимых действий:
Interface javax.servlet.ServletContext {
...
void log( java.lang.Exception exception, String msg ) void log( String message, java.lang.Throwable throwable )
}

7.4. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
Если проанализировать неполный список методов класса ServletContext, то можно выделить две группы стоящие в начале:
1)методы для работы с инициализационными параметрами;
и2) методы для управления атрибутами.
Контекстные инициализационные параметры определяют параметры
только-для-чтения типа String.
Атрибуты позволяют сохранять в контексте приложения ссылки на любые поименованные объекты.
Атрибуты, помещенные в контекст приложения видимы всем объектам приложения, которые могут получить ссылку на этот контекст, что делает его местом хранения глобальных объектов приложения.

7.5. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
Контекстные инициализационные параметры устанавливаются администратором приложения с помощью тега <context-param> в дескрипторе развертывания:
<web-app>
...
<!— После элемента <description> --> <context-param>
<param-name>fileName</param-name> <param-value>/WEB-INF/test.txt</param-value> <description>The Name of flat file
</description>
</context-param>
<!— Перед элементом <servlet> -->
...
</web-app>

7.6. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
Объект ServletContext также обеспечивает доступ только-для чтения к ресурсным файлам вызовом метода gerResourceAsStreame(), который возвращает «сырой» объект типа InputStream.
Доступ к текстовым файлам должен быть «декорирован» с помощью соответствующего «читателя»/«писателя». Например для символьного потока такой оболочкой может быть буферизованный поток:
javax.servlet.ServletContext context = getServletContext(); final String fname = context.getInitParameter("fileName"); final InputStream ins = context.gerResourceAsStreame( fname ); final BufferedReader txtReader = new BufferedReader( ins );
где "fileName" - ссылка на название параметра, описанное в элементе
<param-name> тега <context-param>.

7.7. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
В следующем примере описан относительный путь (<webappdirectory>\files) к файлу test.jar. Сервлет может получить доступ к ресурсу напрямую, конвертировав относительный путь в абсолютный вызовом метода getRealPath( String relativePath ) объекта ServletContext:
public void service( HttpServletRequest req, HttpServletResponse res) throws javax.servlet.ServletException, java.io.IOException
{
res.setContentType("application/jar");
final OutputStream os = res.getOutputStream();
final byte[] bytearray = new byte[1024]; // буфер в 1K final ServletContext context = getServletContext(); URL url = context.getResource("files/test.jar");
final InputStream is = url.openStream(); int bytesread = 0;
while( (bytesread = is.read(bytearray) ) != -1 ) { os.write(bytearray, 0, bytesread);
}
os.flush();
is.close();
}

7.8. ИНИЦИАЛИЗАЦИЯ И КОНТЕКСТ ПРИЛОЖЕНИЯ (ПРОДОЛЖЕНИЕ)
Ограничения использования методов getResource() и getResourceAsStream():
• Нельзя передавать этим методам URL любого активного ресурса, например JSP страницы или сервлета.
• При неправильном использовании эти методы могут быть "дырой" в безопасности; с их помощью можно прочитать любой файл web приложения, включая файлы в директории /WEB-INF.

ИТОГИ
В теме рассмотрены:
•Жизненный цикл сервлетов и интерфейс Servlet
•Реализация классов javax.servlet.GenericServlet, javax.servlet.http.HttpServlet
•Доступ к параметрам запроса через интефейс javax.servlet.http.HttpServletRequest
•Формирование ответов через интерфейс javax.servlet.ServletResponse
•Инициализация, получение параметров сервлета и приложения
•Обозначены сессия приложения и хранимые в ней рабочие переменные