Статьи

50 Servlet Интервью Вопросы и ответы

Сервлеты являются очень важной темой Java EE, и на них основаны все платформы веб-приложений, такие как Spring и Struts. Это делает сервлет горячей темой в интервью Java.

Здесь я предоставляю список из 50 вопросов для интервью с сервлетами, на которых вы найдете ответы на большинство вопросов, связанных с сервлетами и веб-приложениями в Java.

  1. Чем отличается веб-сервер от сервера приложений?
  2. Какой метод HTTP неидемпотентен?
  3. В чем разница между методом GET и POST?
  4. Что такое MIME Type?
  5. Что такое веб-приложение и какова его структура каталогов?
  6. Что такое сервлет?
  7. Какие преимущества сервлета перед CGI?
  8. Какие общие задачи выполняет Servlet Container?
  9. Что такое объект ServletConfig?
  10. Что такое объект ServletContext?
  11. В чем разница между ServletConfig и ServletContext?
  12. Что такое диспетчер запросов?
  13. В чем разница между PrintWriter и ServletOutputStream?
  14. Можем ли мы получить PrintWriter и ServletOutputStream как в сервлете?
  15. Как мы можем создать тупиковую ситуацию в сервлете?
  16. Какая польза от классов-обёрток сервлета?
  17. Что такое интерфейс SingleThreadModel?
  18. Нужно ли переопределять метод service ()?
  19. Это хорошая идея, чтобы создать конструктор сервлетов?
  20. В чем разница между GenericServlet и HttpServlet?
  21. Что такое меж сервлетная связь?
  22. Сервлеты безопасны? Как добиться безопасности потоков в сервлетах?
  23. Что такое атрибуты сервлета и их область действия?
  24. Как мы называем один сервлет из другого сервлета?
  25. Как мы можем вызвать другой сервлет в другом приложении?
  26. В чем разница между ServletResponse sendRedirect () и RequestDispatcher методом forward ()?
  27. Почему класс HttpServlet объявлен абстрактным?
  28. Какие фазы жизненного цикла сервлета?
  29. Каковы методы жизненного цикла сервлета?
  30. почему мы должны переопределять только метод no-agrs init ().
  31. Что такое кодировка URL?
  32. Каковы различные методы управления сессиями в сервлетах?
  33. Что такое перезапись URL?
  34. Как Cookies работает в сервлетах?
  35. Как уведомить объект в сеансе, когда сеанс признан недействительным или истекло время ожидания?
  36. В чем разница между encodeRedirectUrl и encodeURL?
  37. Почему у нас есть фильтры сервлетов?
  38. Как эффективно убедиться, что все сервлеты доступны только тогда, когда у пользователя есть действительный сеанс?
  39. Почему у нас есть слушатели сервлетов?
  40. Как обрабатывать исключения, генерируемые приложением с другим сервлетом?
  41. Что такое дескриптор развертывания?
  42. Как убедиться, что сервлет загружен при запуске приложения?
  43. Как получить фактический путь сервлета на сервере?
  44. Как получить информацию о сервере в сервлете?
  45. Напишите сервлет для загрузки файла на сервер.
  46. Как нам работать с подключением к базе данных и интеграцией log4j в сервлет?
  47. Как получить IP-адрес клиента в сервлете?
  48. Каковы важные особенности Servlet 3?
  49. Каковы разные способы аутентификации сервлета?
  50. Как мы можем обеспечить безопасность транспортного уровня для нашего веб-приложения?

    1. Чем отличается веб-сервер от сервера приложений?

      Ответственность веб-сервера заключается в обработке HTTP-запросов от клиентских браузеров и ответе HTML-ответом. Веб-сервер понимает язык HTTP и работает по протоколу HTTP.
      Веб-сервер Apache является своего рода веб-сервером, и у нас есть специальные контейнеры, которые могут выполнять сервлеты и JSP, известные как контейнеры сервлетов, например Tomcat.
      Серверы приложений предоставляют дополнительные функции, такие как поддержка Enterprise JavaBeans, поддержка JMS Messaging, управление транзакциями и т. Д. Таким образом, мы можем сказать, что сервер приложений представляет собой веб-сервер с дополнительными функциями, помогающими разработчикам корпоративных приложений.

    2. Какой метод HTTP неидемпотентен?

      HTTP-метод называется идемпотентным, если он каждый раз возвращает один и тот же результат. Методы HTTP GET, PUT, DELETE, HEAD и OPTIONS являются идемпотентными, и мы должны реализовать наше приложение, чтобы эти методы всегда возвращали один и тот же результат. HTTP-метод POST является неидемпотентным методом, и мы должны использовать метод post при реализации чего-то, что меняется с каждым запросом.

      Например, чтобы получить доступ к HTML-странице или изображению, мы должны использовать GET, потому что он всегда будет возвращать один и тот же объект, но если нам нужно сохранить информацию о клиенте в базе данных, мы должны использовать метод POST. Идемпотентные методы также известны как безопасные методы, и мы не заботимся о повторяющемся запросе от клиента о безопасных методах.

    3. В чем разница между методом GET и POST?

      • GET — безопасный метод (идемпотент), где POST — неидемпотентный метод.
      • Мы можем отправлять ограниченные данные методом GET, и они отправляются в URL запроса заголовка, тогда как мы можем отправлять большой объем данных с помощью POST, потому что это часть тела.
      • Метод GET небезопасен, поскольку данные отображаются в URL-адресе, и мы можем легко добавить их в закладки и снова отправить аналогичный запрос, POST безопасен, поскольку данные отправляются в теле запроса, и мы не можем добавить их в закладки.
      • GET — это метод HTTP по умолчанию, в то время как нам нужно указать метод как POST для отправки запроса методом POST.
      • Гиперссылки на странице используют метод GET.
    4. Что такое MIME Type?

      Заголовок ответа «Content-Type» известен как MIME-тип. Сервер отправляет MIME-тип клиенту, чтобы он знал тип отправляемых им данных. Это помогает клиенту в рендеринге данных для пользователя. Некоторые из наиболее часто используемых типов MIME — это text / html, text / xml, application / xml и т. Д.

      Мы можем использовать метод ServletContext getMimeType (), чтобы получить правильный MIME-тип файла и использовать его для установки типа содержимого ответа. Это очень полезно при загрузке файла через сервлет с сервера.

    5. Что такое веб-приложение и какова его структура каталогов?

      Веб-приложения — это модули, которые запускаются на сервере для предоставления как статического, так и динамического содержимого клиентскому браузеру. Веб-сервер Apache поддерживает PHP, и мы можем создавать веб-приложения с использованием PHP. Java обеспечивает поддержку веб-приложений через сервлеты и JSP, которые могут работать в контейнере сервлетов и предоставлять динамический контент клиентскому браузеру.

      Веб-приложения Java упакованы как веб-архив (WAR) и имеют определенную структуру, как показано на рисунке ниже.

      WAR-каталог-структура

      Узнайте больше о веб-приложениях на Java Web Application .

    6. Что такое сервлет?

      Java Servlet — это серверные технологии, расширяющие возможности веб-серверов за счет поддержки динамического отклика и сохранения данных.

      Пакеты javax.servlet и javax.servlet.http предоставляют интерфейсы и классы для написания наших собственных сервлетов.
      Все сервлеты должны реализовывать интерфейс javax.servlet.Servlet, который определяет методы жизненного цикла сервлета. При реализации универсального сервиса мы можем расширить класс GenericServlet, предоставляемый с Java Servlet API. Класс HttpServlet предоставляет методы, такие как doGet () и doPost (), для обработки специфичных для HTTP сервисов.

      В большинстве случаев доступ к веб-приложениям осуществляется по протоколу HTTP, поэтому мы в основном расширяем класс HttpServlet. Иерархия сервлетов API показана на рисунке ниже.

      Servlet-иерархии

      Читайте больше в учебнике по сервлетам .

    7. Какие преимущества сервлета перед CGI?

      Технология сервлетов была введена для преодоления недостатков технологии CGI.

      • Сервлеты обеспечивают лучшую производительность, чем CGI, с точки зрения времени обработки и использования памяти, поскольку сервлеты используют преимущества многопоточности, и для каждого запроса создается новый поток, что быстрее, чем загрузка создания объекта для каждого запроса с CGI.
      • Сервлеты, независимые от платформы и системы, веб-приложение, разработанное с помощью Servlet, может быть запущено на любом стандартном веб-контейнере, таком как серверы Tomcat, JBoss, Glassfish, и в операционных системах, таких как Windows, Linux, Unix, Solaris, Mac и т. Д.
      • Сервлеты надежны, потому что контейнер заботится о жизненном цикле сервлета, и нам не нужно беспокоиться об утечках памяти, безопасности, сборке мусора и т. Д.
      • Сервлеты обслуживаемы, а кривая обучения мала, потому что все, что нам нужно, — это бизнес-логика нашего приложения.
    8. Какие общие задачи выполняет Servlet Container?

      Контейнеры сервлетов также известны как веб-контейнеры, например Tomcat. Некоторые из важных задач контейнера сервлетов:

      • Поддержка связи : Servlet Container обеспечивает простой способ связи между веб-клиентом (браузерами) и сервлетами и JSP. Из-за контейнера нам не нужно создавать сокет сервера, чтобы прослушивать любой запрос от веб-клиента, анализировать запрос и генерировать ответ. Все эти важные и сложные задачи выполняются контейнером, и все, что нам нужно сосредоточиться, — это бизнес-логика для приложений.
      • Управление жизненным циклом и ресурсами : Контейнер сервлетов заботится об управлении жизненным циклом сервлета. Из загрузки сервлетов в память, инициализации сервлетов, вызова методов сервлетов и их уничтожения. Контейнер также предоставляет утилиту, такую ​​как JNDI для пула ресурсов и управления ими.
      • Поддержка многопоточности : контейнер создает новый поток для каждого запроса к сервлету и предоставляет им объекты запроса и ответа для обработки. Таким образом, сервлеты не инициализируются для каждого запроса и экономят время и память.
      • Поддержка JSP: JSP не похожи на обычные классы java, но каждый JSP в приложении компилируется контейнером и преобразуется в сервлет, а затем контейнер управляет ими, как и другие сервлеты.
      • Разное Задача : Контейнер сервлетов управляет пулом ресурсов, выполняет оптимизацию памяти, выполняет сборщик мусора, предоставляет конфигурации безопасности, поддержку нескольких приложений, горячее развертывание и ряд других задач за сценой, которые облегчают жизнь разработчика.
    9. Что такое объект ServletConfig?

      javax.servlet.ServletConfig используется для передачи информации о конфигурации сервлету. Каждый сервлет имеет свой собственный объект ServletConfig, и контейнер сервлета отвечает за создание экземпляра этого объекта. Мы можем предоставить параметры инициации сервлета в файле web.xml или с помощью аннотации WebInitParam. Мы можем использовать метод getServletConfig (), чтобы получить объект ServletConfig сервлета.

    10. Что такое объект ServletContext?

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

      ServletContext улучшен в Servlet Specs 3, чтобы представить методы, с помощью которых мы можем программно добавлять прослушиватели, фильтры и сервлет в приложение. Он также предоставляет некоторые служебные методы, такие как getMimeType () , getResourceAsStream () и т. Д.

    11. В чем разница между ServletConfig и ServletContext?

      Некоторые из различий между ServletConfig и ServletContext:

      • ServletConfig — это уникальный объект для каждого сервлета, тогда как ServletContext — это уникальный объект для полного приложения.
      • ServletConfig используется для предоставления параметров инициализации сервлету, тогда как ServletContext используется для предоставления параметров инициализации уровня приложения, которые могут использовать все остальные сервлеты.
      • Мы не можем устанавливать атрибуты в объекте ServletConfig, тогда как мы можем устанавливать атрибуты в ServletContext, которые другие сервлеты могут использовать в своей реализации.
    12. Что такое диспетчер запросов?

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

      В этом интерфейсе определены два метода:

      1. void forward (запрос ServletRequest, ответ ServletResponse) — перенаправляет запрос из сервлета в другой ресурс (сервлет, файл JSP или файл HTML) на сервере.
      2. void include (запрос ServletRequest, ответ ServletResponse) — включает в ответ содержимое ресурса (сервлет, страница JSP, файл HTML).

      Мы можем получить RequestDispatcher в сервлете, используя метод ServletContext getRequestDispatcher (String path). Путь должен начинаться с / и интерпретируется относительно текущего корневого контекста.

    13. В чем разница между PrintWriter и ServletOutputStream?

      PrintWriter является классом символьного потока, тогда как ServletOutputStream является классом байтового потока. Мы можем использовать PrintWriter для записи символьной информации, такой как массив символов и String, в ответ, тогда как мы можем использовать ServletOutputStream для записи данных байтового массива в ответ.

      Мы можем использовать ServletResponse getWriter (), чтобы получить экземпляр PrintWriter, тогда как мы можем использовать метод ServletResponse getOutputStream (), чтобы получить ссылку на объект ServletOutputStream.

      Вы можете прочитать больше о IO в java на Учебном руководстве по IO Java .

    14. Можем ли мы получить PrintWriter и ServletOutputStream как в сервлете?

      Мы не можем получить экземпляры PrintWriter и ServletOutputStream в одном методе сервлета, если мы вызываем оба метода; getWriter () и getOutputStream () в ответе; мы получим java.lang.IllegalStateException во время выполнения с сообщением, так как для этого ответа уже был вызван другой метод.

    15. Как мы можем создать тупиковую ситуацию в сервлете?

      Мы можем создать взаимоблокировку в сервлете, создав цикл вызова метода, просто вызвав метод doPost () из метода doGet () и метод doGet () для метода doPost (), чтобы создать ситуацию взаимоблокировки в сервлете.

      Узнайте больше о взаимоблокировке в многопоточности на примере Java Deadlock .

    16. Какая польза от классов-обёрток сервлета?

      HTTP-сервлет сервлета предоставляет два класса-оболочки — HttpServletRequestWrapper и HttpServletResponseWrapper . Эти классы-обертки предназначены для того, чтобы помочь разработчикам в индивидуальной реализации типов запросов и ответов сервлета. Мы можем расширить эти классы и переопределить только определенные методы, которые нам нужно реализовать для пользовательских объектов запросов и ответов. Эти классы не используются в обычном программировании сервлетов.

    17. Что такое интерфейс SingleThreadModel?

      Интерфейс SingleThreadModel был предоставлен для обеспечения безопасности потоков и гарантирует, что никакие два потока не будут выполняться одновременно в методе обслуживания сервлета. Однако SingleThreadModel не решает все проблемы безопасности потоков. Например, атрибуты сеанса и статические переменные по-прежнему могут быть доступны для нескольких запросов в нескольких потоках одновременно, даже если используются сервлеты SingleThreadModel. Также он устраняет все преимущества поддержки многопоточности сервлетов, поэтому этот интерфейс устарел в Servlet 2.4.

    18. Нужно ли переопределять метод service ()?

      Когда контейнер сервлета получает запрос клиента, он вызывает метод service (), который, в свою очередь, вызывает методы doGet (), doPost () на основе HTTP-метода запроса. Я не вижу ни одного варианта использования, где мы хотели бы переопределить метод service (). Цель метода service () — перенаправить запрос в соответствующие реализации HTTP-метода. Если нам необходимо выполнить некоторую предварительную обработку запроса, мы всегда можем использовать фильтры сервлетов и прослушиватели.

    19. Это хорошая идея, чтобы создать конструктор сервлетов?

      Мы можем определить конструктор для сервлета, но я не думаю, что он будет полезен, потому что у нас не будет доступа к объекту ServletConfig, пока сервлет не будет инициализирован контейнером. В идеале, если нам нужно инициализировать любой ресурс для сервлета, мы должны переопределить метод init (), где мы можем получить доступ к параметрам инициации сервлета, используя объект ServletConfig.

    20. В чем разница между GenericServlet и HttpServlet?

      GenericServlet — это независимая от протокола реализация интерфейса Servlet, тогда как HttpServlet — это реализация протокола HTTP. В большинстве случаев мы используем сервлет для создания веб-приложения, поэтому мы расширяем класс HttpServlet. Класс HttpServlet расширяет GenericServlet, а также предоставляет некоторые другие методы, специфичные для протокола HTTP.

    21. Что такое меж сервлетная связь?

      Когда мы хотим вызвать другой сервлет из методов службы сервлета, мы используем механизмы связи между сервлетами. Мы можем вызвать другой сервлет, используя методы RequestDispatcher forward () и include (), и предоставить дополнительные атрибуты в запросе для другого использования сервлета.

    22. Сервлеты безопасны? Как добиться безопасности потоков в сервлетах?

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

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

      Механизмы безопасности потоков аналогичны безопасности потоков в автономном Java-приложении, подробнее о них см. В разделе Безопасность потоков в Java .

    23. Что такое атрибуты сервлета и их область действия?

      Атрибуты сервлета используются для связи между сервлетами, мы можем устанавливать, получать и удалять атрибуты в веб-приложении. Существует три области действия атрибутов сервлета: область запроса, область сеанса и область приложения.

      Интерфейсы ServletRequest, HttpSession и ServletContext предоставляют методы для получения / установки / удаления атрибутов из области запроса, сеанса и приложения соответственно.

      Атрибуты сервлета отличаются от параметров инициализации, определенных в web.xml для ServletConfig или ServletContext.

    24. Как мы называем один сервлет из другого сервлета?

      Мы можем использовать метод RequestDispatcher forward () для пересылки обработки запроса другому сервлету. Если мы хотим включить другой выход сервлета в ответ, мы можем использовать метод RequestDispatcher include ().

    25. Как мы можем вызвать другой сервлет в другом приложении?

      Мы не можем использовать RequestDispatcher для вызова сервлета из другого приложения, потому что он специфичен для приложения. Если нам нужно перенаправить запрос к ресурсу в другом приложении, мы можем использовать метод ServletResponse sendRedirect () и предоставить полный URL-адрес другого сервлета. Это отправляет ответ клиенту с кодом ответа 302 для пересылки запроса на другой URL. Если нам также необходимо отправить некоторые данные, мы можем использовать файлы cookie, которые будут частью ответа сервлета и будут отправлены в запросе другому сервлету.

    26. В чем разница между ServletResponse sendRedirect () и RequestDispatcher методом forward ()?

      1. RequestDispatcher forward () используется для пересылки того же запроса другому ресурсу, тогда как ServletResponse sendRedirect () представляет собой двухэтапный процесс. В sendRedirect () веб-приложение возвращает клиенту ответ с кодом состояния 302 (перенаправление) с URL-адресом для отправки запроса. Отправленный запрос является совершенно новым запросом.
      2. forward () обрабатывается внутренне контейнером, тогда как sednRedirect () обрабатывается браузером.
      3. Мы должны использовать forward () при доступе к ресурсам в том же приложении, потому что это быстрее, чем метод sendRedirect (), который требует дополнительного сетевого вызова.
      4. В браузере forward () реальный ресурс обработки не знает, и URL-адрес в адресной строке остается тем же, а в sendRedirect () URL-адрес в адресной строке изменяется на перенаправленный ресурс.
      5. forward () нельзя использовать для вызова сервлета в другом контексте, в этом случае мы можем использовать только sendRedirect ().
    27. Почему класс HttpServlet объявлен абстрактным?

      Класс HttpServlet обеспечивает реализацию HTTP-протокола сервлета, но он оставлен абстрактным, потому что в методах обслуживания, таких как doGet () и doPost (), нет логики реализации, и мы должны переопределить хотя бы один из методов службы. Вот почему нет смысла иметь экземпляр HttpServlet и объявлен абстрактным классом.

      Узнайте больше об абстрактном классе .

    28. Какие фазы жизненного цикла сервлета?

      Мы знаем, что Servlet Container управляет жизненным циклом Servlet, существует четыре фазы жизненного цикла сервлета.

      1. Загрузка класса сервлета — Когда контейнер получает запрос на сервлет, он сначала загружает класс в память и вызывает его конструктор по умолчанию без аргументов.
      2. Инициализация класса сервлета. После загрузки класса сервлета контейнер инициализирует объект ServletContext для сервлета, а затем вызывает его метод init, передавая объект конфигурации сервлета. Это место, где класс сервлета трансформируется из обычного класса в сервлет.
      3. Обработка запросов — как только сервлет инициализирован, он готов обрабатывать клиентские запросы. Для каждого запроса клиента контейнер сервлета порождает новый поток и вызывает метод service (), передавая ссылку на объект запроса и ответа.
      4. Удаление из службы — когда контейнер останавливается или мы останавливаем приложение, контейнер сервлета уничтожает класс сервлета, вызывая его метод destroy ().
    29. Каковы методы жизненного цикла сервлета?

      Жизненный цикл сервлета состоит из трех методов:

      1. public void init (ServletConfig config) — этот метод используется контейнером для инициализации сервлета, этот метод вызывается только один раз в жизненном цикле сервлета.
      2. public void service (запрос ServletRequest, ответ ServletResponse) — этот метод вызывается один раз для каждого запроса, контейнер не может вызывать метод service (), пока не будет выполнен метод init ().
      3. public void destroy () — Этот метод вызывается один раз, когда сервлет выгружается из памяти.
    30. почему мы должны переопределять только метод no-agrs init ().

      Если нам нужно инициализировать некоторый ресурс, прежде чем мы хотим, чтобы наш сервлет обрабатывал клиентские запросы, мы должны переопределить метод init (). Если мы переопределим метод init (ServletConfig config), то первый оператор должен быть super (config), чтобы убедиться, что сначала вызывается метод init суперкласса init (ServletConfig config). Вот почему GenericServlet предоставляет другой вспомогательный метод init () без аргумента, который вызывается в конце метода init (ServletConfig config). Мы всегда должны использовать этот метод для переопределения метода init (), чтобы избежать каких-либо проблем, поскольку мы можем забыть добавить вызов super () в перезаписывающий метод init с аргументом ServletConfig.

    31. Что такое кодировка URL?

      URL-кодирование — это процесс преобразования данных в форму CGI, чтобы они могли без проблем перемещаться по сети. Кодировка URL удаляет пробелы и заменяет специальные символы на escape-символы. Мы можем использовать java.net.URLEncoder.encode (String str, String unicode) для кодирования строки. Декодирование URL — это обратный процесс кодирования, и мы можем использовать java.net.URLDecoder.decode (String str, String unicode) для декодирования закодированной строки. Например, «Данные Панкаджа» кодируются как «Данные Панкаджа% 27s +».

    32. Каковы различные методы управления сессиями в сервлетах?

      Сеанс — это состояние конверсии между клиентом и сервером, и он может состоять из нескольких запросов и ответов между клиентом и сервером. Поскольку и HTTP, и Web-сервер не имеют состояния, единственный способ поддерживать сеанс — это когда некоторая уникальная информация о сеансе (идентификатор сеанса) передается между сервером и клиентом в каждом запросе и ответе.

      Вот некоторые из распространенных способов управления сессиями в сервлетах:

      1. Аутентификация пользователя
      2. HTML скрытое поле
      3. Печенье
      4. Перезапись URL
      5. API управления сессиями

      Подробнее об этих подходах к управлению сеансами читайте в учебнике по управлению сеансами сервлетов .

    33. Что такое перезапись URL?

      Мы можем использовать HttpSession для управления сессиями в сервлетах, но он работает с Cookies, и мы можем отключить cookie в клиентском браузере. Servlet API обеспечивает поддержку перезаписи URL, которую мы можем использовать для управления сеансом в этом случае.

      Самое приятное то, что с точки зрения кодирования, он очень прост в использовании и включает в себя один шаг — кодирование URL. Еще одна полезная вещь в Servlet URL Encoding — это резервный подход, который срабатывает только в том случае, если cookie-файлы браузера отключены.

      Мы можем закодировать URL с помощью метода HttpServletResponse encodeURL (), и если нам нужно перенаправить запрос на другой ресурс и мы хотим предоставить информацию о сеансе, мы можем использовать метод encodeRedirectURL ().

      Подробнее читайте в переписывании URL сервлета .

    34. Как Cookies работает в сервлетах?

      Куки часто используются в веб-клиент-серверной коммуникации, это не что-то специфическое для Java. Файлы cookie — это текстовые данные, отправляемые сервером клиенту, и они сохраняются на локальном компьютере клиента.

      Servlet API обеспечивает поддержку файлов cookie через класс javax.servlet.http.Cookie, который реализует интерфейсы Serializable и Cloneable.

      HttpServletRequest getCookies () метод предназначен для получения массива Cookies из запроса, так как нет смысла добавлять Cookie в запрос, нет методов для установки или добавления cookie в запрос.

      Точно так же HttpServletResponse addCookie (Cookie c) предоставляет метод для прикрепления cookie в заголовке ответа, для cookie нет методов получения.

      Узнайте больше на печенье в сервлетах .

    35. Как уведомить объект в сеансе, когда сеанс признан недействительным или истекло время ожидания?

      Если нам нужно убедиться, что объект получит уведомление, когда сеанс уничтожен, он должен реализовать интерфейс javax.servlet.http.HttpSessionBindingListener . Этот интерфейс определяет два метода обратного вызова — valueBound () и valueUnbound (), которые мы можем определить для реализации логики обработки, когда объект добавляется как атрибут в сеанс и когда сеанс уничтожается.

      Рекомендуем прочитать Servlet Listener .

    36. В чем разница между encodeRedirectUrl и encodeURL?

      HttpServletResponse предоставляет метод для кодирования URL в гиперссылках HTML, чтобы экранировать специальные символы и пробелы и добавлять идентификатор сессии в URL. Он ведет себя подобно методу кодирования URLEncoder с дополнительным процессом для добавления параметра jsessionid в конце URL-адреса.

      Однако HttpServletResponse encodeRedirectUrl () метод используется специально для кодирования URL перенаправления в ответ.

      Поэтому, когда мы предоставляем поддержку перезаписи URL, для гиперссылок в ответе HTML мы должны использовать метод encodeURL (), тогда как для URL перенаправления мы должны использовать метод encodeRedirectUrl ().

    37. Почему у нас есть фильтры сервлетов?

      Фильтры сервлетов — это подключаемые Java-компоненты, которые мы можем использовать для перехвата и обработки запросов перед их отправкой сервлетам и ответом после завершения кода сервлета и перед тем, как контейнер отправит ответ клиенту.

      Некоторые общие задачи, которые мы можем сделать с фильтрами:

      • Логирование параметров запроса в лог файлы.
      • Аутентификация и аутентификация запроса на ресурсы.
      • Форматирование тела запроса или заголовка перед отправкой сервлету.
      • Сжатие данных ответа, отправленных клиенту.
      • Измените ответ, добавив несколько файлов cookie, информацию заголовка и т. Д.

      Узнайте больше о фильтрах в Servlet Filter .

    38. Как эффективно убедиться, что все сервлеты доступны только тогда, когда у пользователя есть действительный сеанс?

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

      Посмотрите пример фильтра аутентификации на примере фильтра сервлетов .

    39. Почему у нас есть слушатели сервлетов?

      Мы знаем, что используя ServletContext, мы можем создать атрибут с областью применения, к которому могут обращаться все остальные сервлеты, но мы можем инициализировать параметры инициализации ServletContext как String только в дескрипторе развертывания (web.xml). Что если наше приложение ориентировано на базу данных, и мы хотим установить атрибут в ServletContext для соединения с базой данных.

      Если у вашего приложения одна точка входа (логин пользователя), вы можете сделать это в первом запросе сервлета, но если у нас несколько точек входа, то выполнение этого повсеместно приведет к большой избыточности кода. Также, если база данных не работает или не настроена должным образом, мы не узнаем, пока первый клиентский запрос не поступит на сервер. Для обработки этого сценария сервлет API предоставляет интерфейсы прослушивателя, которые мы можем реализовать и настроить для прослушивания события и выполнения определенных операций.

      Узнайте больше о различных типах слушателей и пример на Servlet Listener .

    40. Как обрабатывать исключения, генерируемые приложением с другим сервлетом?

      Если вы заметили, методы doGet () и doPost () генерируют исключение ServletException и IOException. Поскольку браузер понимает только HTML, когда наше приложение генерирует исключение, контейнер сервлета обрабатывает исключение и генерирует HTML-ответ. То же самое касается других кодов ошибок, таких как 404, 403 и т. Д.

      Servlet API обеспечивает поддержку настраиваемых сервлетов Exception и Error Handler, которые мы можем настроить в дескрипторе развертывания. Целью этих сервлетов является обработка Exception или Error, возникающих в приложении, и отправка HTML-ответа, который будет полезен для пользователя. Мы можем предоставить ссылку на домашнюю страницу приложения или некоторые детали, чтобы сообщить пользователю, что пошло не так.

      Мы можем настроить их в web.xml, как показано ниже:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <error-page>
          <error-code>404</error-code>
          <location>/AppExceptionHandler</location>
      </error-page>
       
      <error-page>
          <exception-type>javax.servlet.ServletException</exception-type>
          <location>/AppExceptionHandler</location>
      </error-page>

      Подробнее читайте в разделе Обработка исключений сервлетов .

    41. Что такое дескриптор развертывания?

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

      С помощью аннотаций сервлета 3.0 мы можем удалить много беспорядка из web.xml, настроив сервлеты, фильтры и прослушиватели с помощью аннотаций.

    42. Как убедиться, что сервлет загружен при запуске приложения?

      Обычно контейнер сервлета загружает сервлет по первому клиентскому запросу, но иногда, когда сервлет тяжелый и требует времени для загрузки, мы можем захотеть загрузить его при запуске приложения. Мы можем использовать элемент load-on-startup с конфигурацией сервлета в файле web.xml или использовать переменную loadSnStartup аннотации WebServlet, чтобы указать контейнеру загрузить сервлет при запуске системы.

      1
      2
      3
      4
      5
      <servlet>
          <servlet-name>foo</servlet-name>
          <servlet-class>com.foo.servlets.Foo</servlet-class>
          <load-on-startup>5</load-on-startup>
      </servlet>

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

      Если существует несколько сервлетов со значением загрузки при запуске, равным 1,2,3, то сервлет с более низким целым значением будет загружен первым.

    43. Как получить фактический путь сервлета на сервере?

      Мы можем использовать следующий фрагмент кода, чтобы получить фактический путь сервлета в файловой системе.

      1
      getServletContext().getRealPath(request.getServletPath())
    44. Как получить информацию о сервере в сервлете?

      Мы можем использовать приведенный ниже фрагмент кода, чтобы получить информацию о сервлете в сервлете через объект контекста сервлета.

      1
      getServletContext().getServerInfo()
    45. Напишите сервлет для загрузки файла на сервер.

      Загрузка и выгрузка файлов и общие задачи в веб-приложении Java. К сожалению, Servlet API не предоставляет простых методов загрузки файлов на сервер, поэтому мы можем использовать Apache FileUpload jar, чтобы упростить нашу жизнь.

      Пожалуйста, прочитайте статью File Upload Servlet, в которой представлены все необходимые подробности с примером программы для загрузки и скачивания файла с использованием сервлетов.

    46. Как нам работать с подключением к базе данных и интеграцией log4j в сервлет?

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

      Интеграция Log4j также очень проста в веб-приложениях, все, что нам нужно, это XML-файл конфигурации log4j или файл свойств, а затем настроить его в прослушивателе контекста сервлета.

      Для полного примера, пожалуйста, посмотрите на базу данных сервлетов и пример Log4j .

    47. Как получить IP-адрес клиента в сервлете?

      Мы можем использовать request.getRemoteAddr() чтобы получить IP-адрес клиента в сервлете.

    48. Каковы важные особенности Servlet 3?

      Servlet Specs 3.0 был основным выпуском, и некоторые из важных функций:

      1. Примечания к сервлету: до Servlet 3 все отображение сервлета и его параметры init использовались для определения в web.xml, это было неудобно и более подвержено ошибкам, когда в приложении огромное количество сервлетов.
        Сервлет 3 представил использование аннотаций Java для определения сервлетов, сервлетов фильтра и прослушивателя и параметров инициализации. Некоторые важные аннотации Servlet API — это WebServlet, WebInitParam, WebFilter и WebListener. Подробнее о них можно прочитать в
        аннотациях Servlet 3 .
      2. Веб-фрагменты : до спецификации сервлета 3.0 все конфигурации веб-приложения должны присутствовать в файле web.xml, что делает его перегруженным множеством элементов и увеличивает вероятность ошибок. Итак, спецификации сервлета 3 представили веб-фрагменты, в которых мы можем иметь несколько модулей в одном веб-приложении, все эти модули должны иметь файл web-фрагмент.xml в каталоге META-INF. Мы также можем включить все элементы web.xml в web-фрагмент.xml. Это помогает нам разделить наше веб-приложение на отдельные модули, которые включены в виде файла JAR в каталог lib веб-приложения.
      3. Динамическое добавление веб-компонентов . Мы можем использовать объект ServletContext для программного добавления сервлетов, фильтров и прослушивателей. Это помогает нам в создании динамической системы, в которую мы загружаем компонент, только если он нам нужен. Этими методами являются addServlet (), addFilter () и addListener (), определенные в объекте контекста сервлета.
      4. Асинхронная обработка : добавлена ​​асинхронная поддержка, чтобы делегировать обработку запроса другому потоку, а не поддерживать поток сервлета занятым. Это может увеличить производительность приложения. Это предварительная тема, и я рекомендую прочитать учебник по Async Servlet .
    49. Каковы разные способы аутентификации сервлета?

      Контейнер сервлетов предоставляет различные способы аутентификации сервлетов на основе входа:

      1. Базовая аутентификация HTTP
      2. Дайджест-аутентификация HTTP
      3. HTTPS-аутентификация
      4. Форма входа в систему : стандартная форма HTML для аутентификации, преимущество в том, что мы можем изменить макет страницы входа в систему в соответствии с требованиями нашего приложения, а не использовать встроенные механизмы входа HTTP.
    50. Как мы можем обеспечить безопасность транспортного уровня для нашего веб-приложения?

      Мы можем настроить наш контейнер сервлетов на использование SSL для обмена сообщениями по сети. Чтобы настроить SSL на Tomcat, нам нужен цифровой сертификат, который можно создать с помощью Java keytool для среды разработки. В производственной среде вы должны получить цифровой сертификат у поставщиков сертификатов SSL, например, Verisign или Entrust.

      Подробнее читайте в статье « Настройка SSL на Tomcat» .

Это все для вопросов и ответов по интервью с сервлетами. Я буду продолжать добавлять больше вопросов об интервью на основе сервлетов в список в будущем, поэтому не забудьте добавить их в закладки для дальнейшего использования.

Ссылка: сервлет от нашего партнера JCG Панкаджа Кумара в блоге Developer Recipes .