Ответы на вопросы на собеседование JSP, Servlets, JSTL (часть 1).
- Что такое сервлет?
Сервлеты (Servlets) - это java-программы, которые выполняются на серверной стороне Web-приложения. Точно так же, как апплеты динамически расширяют функциональные возможности Web-браузера, сервлеты динамически расширяют функциональные возможности Web-сервера. Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения веб-серверов. Для таких приложений технология Java Servlet определяет HTTP-специфичные сервлет классы. Пакеты javax.servlet и javax.servlet.http обеспечивают интерфейсы и классы для создания сервлетов.
- Какова структура веб-проекта?
- Что такое контейнер сервлетов? Жизненный цикл сервлета.
Контейнер сервлетов - программа, управляющая жизненным циклом сервлетов.
Жизненный цикл сервлета: им управляет контейнер сервлетов, при первом обращении к сервлету происходит его загрузка в память и вызывается метод init(). На протяжении работы приложения происходят вызовы методы service() для обработки запросов клиента. По завершению работы приложения вызывается метод destroy() и сервлет выгружается из памяти.
Жизненный цикл сервлета: им управляет контейнер сервлетов, при первом обращении к сервлету происходит его загрузка в память и вызывается метод init(). На протяжении работы приложения происходят вызовы методы service() для обработки запросов клиента. По завершению работы приложения вызывается метод destroy() и сервлет выгружается из памяти.
- Каковы задачи, функциональность контейнера сервлетов?
Контейнер сервлетов может работать как полноценный самостоятельный веб-сервер, быть поставщиком страниц для другого веб-сервера, например Apache, или интегрироваться в Java EE сервер приложений. Обеспечивает обмен данными между сервлетом и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
- Чем отличается sendRedirect() от forward()?
Для вызова JSP по относительному пути применяется метод forward(), для обращения к JSP по абсолютному пути используется метод sendRedirect(). Отличие этих методов состоит в том, что с методом forward() передается уже существующий объект запроса request, а при вызове метода sendRedirect() формируется новый запрос. Информацию в последнем случае следует переда вать с другими объектами. К тому же метод forward() срабатывает быстрее.
- Что вы знаете о сервлет фильтрах?
Реализация интерфейса Filter позволяет создать объект, который перехватывает запрос, может трансформировать заголовок и содержимое запроса клиента. Фильтры не создают запрос или ответ, а только модифицируют их. Фильтр выполняет предварительную обработку запроса, прежде чем тот попадает в сервлет, с последующей (если необходимо) обработкой ответа, исходящего из сервлета. Фильтр может взаимодействовать с разными типами ресурсов, в частности, и с сервлетами, и с JSP-страницами. Сервлетные фильтры могут:
- перехватывать инициацию сервлета прежде, чем сервлет будет инициирован.
- определить содержание запроса прежде, чем сервлет будет инициирован.
- модифицировать заголовки и данные запроса, в которые упаковывается поступающий запрос.
- модифицировать заголовки и данные ответа, в которые упаковывается получаемый ответ.
- перехватывать инициацию сервлета после обращения к сервлету.
Сервлетный фильтр может быть сконфигурирован так, что он будет работать с одним сервлетом или группой сервлетов. Основой для формирования фильтров служит интерфейс javax.servlet.Filter, который реализует три метода:
- void init (FilterConfig config) throws ServletException;
- void destroy();
- void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
Метод init() вызывается прежде, чем фильтр начинает работать, и настраивает конфигурационный объект фильтра. Метод doFilter выполняет непосредственно работу фильтра. Таким образом, сервер вызывает init() один раз, чтобы запустить фильтр в работу, а затем вызывает doFilter() столько раз, сколько запросов будет сделано непосредственно к данному фильтру. После того, как фильтр заканчивает свою работу, вызывается метод destroy().
- Зачем нужны слушатели в сервлетах?
Слушатели контекста и сессий - это классы, которые могут следить за тем, когда контекст или сессия были инициализированы, или отслеживать время, когда они должны быть уничтожены, и когда атрибуты были добавлены или удалены из контекста или сессии. Servlet 2.4 расширяет модель слушателей запроса, позволяя отслеживать, как запрос создается и уничтожается, и, как атрибуты добавляются и удаляются из сервлета. В Servlet 2.4 добавлены следующие классы:
- ServletRequestListener
- ServletRequestEvent
- ServletRequestAttributeListener
- ServletRequestAttributeEvent
- Как обработать исключения, выброшенные другим сервлетом в приложении?
Так как браузер понимает только HTML, то когда приложение выбросит исключение контейнер сервлетов обработает исключение и создаст HTML response. Это аналогично тому что происходит при кодах ошибок вроде 404, 403 и т.д. Servlet API предоставляет поддержку собственных сервлетов для обработки исключений и ошибок, которые мы можем задать в дескрипторе развертывания. Главная задача таких сервлетов - обработать ошибку или исключение и отправить понятный HTML ответ пользователю. Например, можно предоставить ссылку на главную страницу, а так же описание некоторых деталей об ошибке.
- Что такое дескриптор развертывания?
Дескриптор развертывания - это конфигурационный файл артефакта, который будет развернут в контейнере сервлетов. В спецификации Java Platform, Enterprise Edition дескриптор развертывания описывает то, как компонент, модуль или приложение (такое, как веб-приложение или приложение предприятия) должно быть развернуто.
Этот конфигурационный файл указывает параметры развертывания для модуля или приложения с определенными настройками, параметры безопасности и описывает конкретные требования к конфигурации. Для синтаксиса файлов дескриптора развертывания используется язык XML.
- Как реализовать запуск сервлета с запуском приложения?
Контейнер сервлетов обычно загружает сервлет при первом запросе клиента, но иногда необходимо загрузить сервлет прямо на старте приложения (например если сервлет объемный и будет долго грузиться). Для этого необходимо использовать элемент load-on-startup в дескрипторе (или аннотацию loadOnStartup), который укажет необходимость загрузки сервлете при запуске.
Значение должно быть int. Если значение отрицательное, то сервлет будет загружен при запросе клиента, а если 0 и далее, то загрузится на старте приложения. Чем меньше число, тем раньше в очереди на загрузку будет сервлет.
- Что представляет собой объект ServletConfig?
Интерфейс javax.servlet.ServletConfig используется для передачи конфигурационной информации сервлету. Каждый сервлет имеет свой собственный объект ServletConfig, за создание экземпляра которого ответственен контейнер сервлетов. Для установки параметров конфигурации используются init параметры в web.xml (или аннотации WebInitParam). Для получения объекта ServletConfig данного сервлета используется метод getServletConfig().
- Что представляет собой объект ServletContext?
Интерфейс javax.servlet.ServletContext определяет ряд методов, которые сервлет использует, чтобы связаться с его контейнером сервлета, например, получить тип MIME файла, диспетчеризировать запросы, или записать в файл журнала. Объект ServletContext является уникальным и доступен всем сервлетам веб приложения. Мы можем использовать объект ServletContext, когда нам необходимо предоставить доступ одному или нескольким сервлетам к инициализированным параметрам веб приложения. Для этого используется элемент <context-param> в web.xml. Объект ServletContext можно получить с помощью метода getServletContext() у интерфейса ServletConfig.
Контейнеры сервлетов так же могут предоставлять context объекты, уникальные для группы сервлетов. Каждая из групп будет связана со своим набором URL путей хоста.
ServletContext был расширен в спецификации Servlet 3 и предоставляет программное добавление слушателей и фильтров в приложение. Так же у этого интерфейса имеются множество полезных методов вроде getMimeType(), getResourceAsStream() и т.д..
- В чем отличия ServletContext и ServletConfig?
Ниже приведены некоторые отличия:
- ServletConfig является уникальный объектом для каждого сервлета, в то время как ServletContext уникальный для всего приложения.
- ServletConfig используется для предоставления параметров инициализации сервлету, а ServletContext для предоставления параметров инициализации приложения для всех сервлетов.
- У нас нет возможности устанавливать атрибуты в объекте ServletConfig, в то время как можно установить атрибуты в объекте ServletContext, которые будут доступны другим сервлетам.
- Интерфейс ServletResponse.
Интерфейс ServletResponse - это инструмент для отправки данных клиенту. Все методы данного инструмента служат именно этой цели.
- Интерфейс ServletRequest.
Интерфейс ServletRequest - это инструмент для получения параметров HTTP запроса. Этот интерфейс имеет некоторые методы, идентичные по названию и назначению с ServletContext.
- Что такое Request Dispatcher?
Интерфейс RequestDispatcher используется для передачи запроса другому ресурсу (это может быть HTML, JSP или другой сервлет в том же приложении). Мы можем использовать это для добавления контента другого ресурса к ответу. Этот интерфейс используется для внутренней коммуникации между сервлетами в одном контексте. В интерфейса реализовано два метода:
- void forward(ServletRequest var1, ServletResponse var2) - передает запрос из сервлета к другому ресурсу (сервлету, JSP или HTML файлу) на сервере.
- void include(ServletRequest var1, ServletResponse var2) - включает контент ресурса (сервлет, JSP или HTML страница) в ответ.
Доступ к интерфейсу можно получить с помощью метода ServletContext getRequestDispatcher(String s). Путь должен начинаться с / , который будет интерпретироваться относительным текущего корневого пути контекста.
- Как можно создать блокировку (deadlock) в сервлете?
Дедлок (deadlock) можно получить реализовав зацикленный вызов метода, например вызвав метод doPost() в методе doGet() и вызвать doGet() в методе doPost().
- Как получить адрес сервлета на сервере?
Для получения актуального пути сервлета на сервере можно использовать эту конструкцию: getServletContext().getRealPath(request.getServletPath()).
- Как получить информацию о сервере из сервлета?
Информацию о сервере можно получить с использованием объекта ServletContext с помощью метода getServerInfo(). Т.е. getServletContext().getServerInfo().
- Как получить ip адрес клиента на сервере?
Использовать request.getRemoteAddr() для получения ip клиента в сервлете.
- Что вы знаете о классах обертках (wrapper) для сервлетов?
В Servlet HTTP API предоставляются два класса обертки - HttpServletRequestWrapper и HttpServletResponseWrapper. Они помогают разработчикам реализовывать собственные реализации типов request и response сервлета. Мы можем расширить эти классы и переопределить только необходимые методы для реализации собственных типов объектов ответов и запросов. Эти классы не используются в стандартном программировании сервлетов.
Спасибо большое!
ОтветитьУдалитьГодная инфа! Спасибо!!!!
ОтветитьУдалить