Вопросы по Java на собеседовании (8)

1. Понятие сервлета
2. Контейнер сервлетов
3. Жизненный цикл сервлета
4. Метод сервлета service
5. Дескриптор приложения
6. Конфигурация сервлета
7. Контекст сервлета, ServletContext
8. Адрес сервлета на сервере
9. Интерфейс RequestDispatcher
10. Получение IP-адреса клиента на сервере
11. Многопоточность в сервлете
12. Сервлетный фильтр

Вопросы и ответы для собеседование по Java, Содержание.
Вопросы и ответы для собеседование по Java, часть 9.

1. Понятие сервлета

Servlet – это java-класс, который выполняется на серверной стороне Web-приложения. Точно так же, как апплеты динамически «расширяют» функциональные возможности приложения на стороне браузера, сервлеты динамически «расширяют» функциональные возможности сервера Web-приложения. Работу servlet'а можно представить следующим образом: при поступлении запроса от клиента (из браузера) серверная часть приложения с помощью требуемого java-класса (сервлета) выполняет обработку запроса и возвращает ответ. Ответ может быть представлен в виде HTML страницы, либо текста в формате XML (JSON), либо простой текст.

WEB-приложение, включающее сервлеты, размещается в WEB-контейнере, который загружает и выполняет servlet'ы; получив от сервлета ответ контейнер отправляет его клиенту. Сервлет работает по протоколу HTTP и использует пакеты javax.servlet, javax.http.

2. Контейнер сервлетов

Контейнер сервлетов — это приложение, представляющее собой сервер, который занимается системной поддержкой WEB-приложений. Контейнер сервлетов обеспечивает жизненный цикл сервлетов в соответствии с определёнными в спецификациях правилами. Наибольшее распространение получили следующие реализации контейнеров сервлетов : Apache Tomcat, JBoss, GlassFish, Jetty, IBM WebSphere, Oracle Weblogic.

Контейнер сервлетов может работать как полноценный самостоятельный веб-сервер, быть поставщиком WEB-страниц для другого веб-сервера, например Apache. Он обеспечивает взаимодействие (обмен данными) между сервлетом и клиентом, берёт на себя выполнение таких функций, как создание программной среды функционирующего сервлета, организацию сессии для каждого из них.

3. Жизненный цикл сервлета

Жизненным циклом сервлета управляет контейнер сервлетов. При первом обращении клиента (браузера) к сервлету происходит его загрузка в память и вызывается метод init(). На протяжении дальнейшей работы приложения контейнер сервлетов выполняет вызовы метода сервлета service().

В дескрипторе приложения (web.xml) можно определить флаг загрузки сервлета сразу же после загрузки приложения. Для этого следует указать значение load-on-startup. В этом случае WEB-контейнер стартует сервлет и выполнит метод инициализации сервлета init() без всякого обращения к нему со стороны клиента.

<servlet>
    <servlet-name>foo</servlet-name>
    <servlet-class></servlet-class>
    <load-on-startup>3</load-on-startup>
</servlet>

Значение load-on-startup может быть целочисленным. Если значение отрицательное, то сервлет будет загружен по запросу клиента. Если значение положительно, то сервлет загружается при старте приложения. Чем меньше значение, тем раньше в очередь на загрузку будет размещен сервлет.

По завершению работы WEB-приложения вызывается метод destroy() и сервлет выгружается из памяти контейнера.

Интерфейс javax.servlet.Servlet включает три главных методов :

  • init()
  • service()
  • destroy()

и два вспомогательных методов :

  • getServletConfig()
  • getServletInfo()

4. Метод сервлета service

Метод service() является «сердцем» сервлета. Каждый запрос от клиента сопровождается вызовом метода service(), который обрабатывает запрос и формирует ответное сообщение. В качестве параметров метод service() получает ServletRequest и ServletResponse.

Объект ServletRequest содержит данные от клиента. Объект ServletResponse содержит ответ сервлета клиенту. Во время подготовки ответа прежде всего вызывается метод setContentType() для установки типа MIME ответа. Затем могут быть использованы методы getOutputStream() или getWriter() для получения объектов и ServletOutputStream или PrintWriter соответственно для передачи данных обратно клиенту.

Подробнее о параметрах ServletRequest и ServletResponse метода service можно посмотреть здесь.

5. Дескриптор развертывания

Дескриптор развертывания web.xml — это конфигурационный файл web-приложения в формате XML. В дескрипторе описываются сервлеты, фильтры, слушатели, указывается страница приложения по умолчанию.

6. Конфигурация сервлета

Метод getServletConfig() возвращает ссылку на объект, реализующий интерфейс ServletConfig. Данный объект позволяет получить информацию о конфигурации сервлета : параметры инициализации сервлета и контекст сервлета ServletContext, предоставляющий доступ к сервлету и его окружению. Каждый сервлет имеет свой собственный объект ServletConfig, за создание которого отвечает контейнер сервлетов. Для получения объекта ServletConfig сервлета используется метод getServletConfig(). На странице с описанием примера сервлета HelloWorld можно увидеть использование объекта ServletConfig.

7. Контекст сервлета, ServletContext

ServletContext - это интерфейс, определяющий доступ сервлету к параметрам веб приложения. Объект javax.servlet.ServletContext является уникальным и доступен всем сервлетам веб приложения. Объект ServletContext можно использовать, когда необходимо предоставить доступ одному или нескольким сервлетам к инициализированным параметрам веб приложения, определенным дескрипторе развертывания в web.xml элементом <context-param>.

Объект ServletContext можно получить с помощью метода getServletContext() интерфейса ServletConfig, который передается сервлету во время инициализации в методе init(). Также контекст сервлета можно получить из объекта сессии HttpSession. Интерфейс ServletContext имеет следующие полезные функции для работы с аттрибутами :

public Object getAttribute(String name)
public java.util.Enumeration getAttributeNames()
public void setAttribute(String name, Object object)
public void removeAttribute(String name)

Цель данных функций связаны с перессылкой между несвязанными друг с другом сервлетами разных объектов. Роль аттрибутов выполняет любой объект.

Интерфейс ServletContext определяет несколько полезных методов типа : GetMimeType (), getResourceAsStream() и т.д. Пример чтения манифеста MANIFEST.MF приложения :

String         meta = "/META-INF/MANIFEST.MF";
ServletContext ctx  = session.getServletContext();
try {
    String     path = ctx.getResourceAsStream(meta);
    Properties prop = new Properties();
    prop.load();
    System.out.println(prop.getProperty("Implementation-Version"));
} catch (IOException e) {}

Более подробное описание с примером использования контекста ServletContext можно увидеть здесь.

8. Адрес сервлета на сервере

Для получения актуального пути сервлета на сервере можно использовать метод контекста сервлета getRealPath(String) :

ServletContext context = session.getServletContext();
String real_path = context.getRealPath("/");
System.out.println("path : " + real_path);

9. Интерфейс RequestDispatcher

Интерфейс RequestDispatcher используется для передачи запроса другому ресурсу. Это может быть HTML, JSP или другой сервлет в том же приложении. Также можно использовать RequestDispatcher для добавления контента некоторого ресурса к ответу сервлета.

RequestDispatcher используется для внутренней коммуникации между сервлетами в одном контексте. В интерфейсе RequestDispatcher определены два метода :

void forward(ServletRequest req, ServletResponse resp);
void include(ServletRequest req, ServletResponse resp);

Метод forward передает запрос из сервлета другому ресурсу (сервлету, JSP или HTML файлу) на сервере. Метод include включает контент стороннего ресурса (сервлет, JSP или HTML страница) в ответ сервлета.

Доступ к интерфейсу RequestDispatcher можно получить с помощью метода getRequestDispatcher(String s) контекста ServletContext. Путь должен начинаться с обратного слеша '/', который определяет относительный путь текущего корневого пути контекста.

10. Получение IP-адреса клиента на сервере

Для получения IP-адреса клиента необходимо использовать метод getRemoteAddr() параметра сервлета ServletRequest :

System.out.println ("IP : " + request.getRemoteAddr());

11. Многопоточность в сервлете

Методы init() и destroy() класса HTTPServlet вызываются один раз в жизненном цикле сервлета. Поэтому нет основания для беспокойства за эти методы при использовании многопоточности в сервлете. Но, что касается методов oGet(), doPost(), то они вызываются по каждому запросу клиента. В случае необходимости использования глобальных переменных в сервлете, следует использовать синхронизацию, как и в любом многопоточном приложении Java.

12. Сервлетный фильтр

Сервлетный фильтр – это Java-класс, позволяющий преобразовать содержание HTTP-запросов, HTTP-ответов и информацию, содержащуюся в заголовках HTML. Сервлетный фильтр используется для предварительной обработки запросов, прежде, чем он попадает в сервлет, и/или последующей обработки ответа сервлета. Сервлетные фильтры могут :

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

Вопросы и ответы для собеседование по Java, Содержание.
Вопросы и ответы для собеседование по Java, часть 9.

  Рейтинг@Mail.ru