Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lec-ServletLifeCycle-part2-v001

.pdf
Скачиваний:
28
Добавлен:
18.03.2015
Размер:
1.4 Mб
Скачать

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

Инициализация, получение параметров сервлета и приложения

Обозначены сессия приложения и хранимые в ней рабочие переменные

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]