Собеседование по Java EE — JEE Servlet API (вопросы и ответы). Часть 2

Вторая часть вопросов и ответов по сервлетам в Java EE — JEE Servlet API.

к списку вопросов раздела JEE

Вопросы и ответы по сервлетам в Java EE — JEE Servlet API. Часть 1.

Вопросы

31. В чем разница между методами GET и POST?
32. Что такое MIME-тип?
33. Назовите преимущества Servlet над CGI?
34. Каковы наиболее распространенные задачи выполняемые в Servlet контейнере?
35. В чем разница между PrintWriter и ServletOutputStream?
36. Можем ли мы получить PrintWriter и ServletOutputStream одновременно в сервлете?
37. Расскажите о интерфейсе SingleThreadModel.
38. Какие существуют атрибуты у сервлетов и какая сфера их применения?
39. Почему необходимо переопределить только init() метод без аргументов?
40. Что означает URL encoding? Зачем нужны методы java.net.URLEncoder.encode() и decode()?
41. Зачем нужны и чем отличаются методы encodeUrl() и encodeRedirectUrl()?
42. Какие различные методы управления сессией в сервлетах вы знаете?
43. Что означает URL Rewriting?
44. Как применяются Cookies в сервлетах?
45. Как уведомить объект в сессии, что сессия недействительна или закончилась?
46. Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с валидной сессией?
47.Как мы можем обеспечить transport layer security для нашего веб приложения?
48. Как организовать подключение к базе данных и обеспечить логирование log4j в сервлете?
49. Какие важные особенности существуют в Servlet 3?
50. Каковы различные способы аутентификации сервлета?
51. Написать сервлет, реализующий загрузку файла на сервер.

Ответы

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

  • GET метод является неизменяемым, тогда как POST — изменяемый.
  • С помощью метода GET можно посылать ограниченное кол-во данных, которые будут пересланы в заголовке URL. В случае POST метода мы можем пересылать большие объемы данных, т.к. они будут находится в теле метода.
  • Данные GET метода передаются в открытом виде, что может использоваться в зловредных целях. POST данные передаются в теле запроса и скрыты от пользователя.
  • GET метод является HTTP методом по умолчанию, а POST метод необходимо указывать явно, чтобы отправить запрос.
  • GET метод используется гиперссылками на странице.

32. Что такое MIME-тип?

MIME (произн. «майм», англ. Multipurpose Internet Mail Extensions — многоцелевые расширения интернет-почты) — стандарт, описывающий передачу различных типов данных по электронной почте, а также, в общем случае, спецификация для кодирования информации и форматирования сообщений таким образом, чтобы их можно было пересылать по Интернету. Content-Type response header это и есть MIME тип. Сервер посылает MIME тип клиенту для того, чтобы он понял какой тип данных пересылается. Это помогает верно отобразить полученные данные на клиенте. Наиболее часто используемые MIME типы: text/html, text/xml, application/xml и многие др.

В ServletContext существует метод getMimeType() для получения корректного MIME типа файла и дальнейшего использования этой информации для указания типа контента в ответе.

33. Назовите преимущества Servlet над CGI?

Технология сервлетов была создана для преодоления недостатков Common Gateway Interface (общий интерфейс шлюза). Можно выделить следующие преимущества сервлетов над CGI:

  • Сервлеты предоставляют лучшую производительность в условиях обработки запросов, лучшее использование памяти за счет использования преимущество многопоточности (на каждый запрос создается новая нить, что быстрее выделения памяти под новый объект для каждого запроса, как это происходит в CGI).
  • Сервлеты, платформа и система являются независимыми. Таким образом веб приложение написанное с использованием сервлетов может быть запущена в любом контейнере сервлетов, реализующим стандарт и в любой операционной системе.
  •  Использование сервлетов повышает надежность программы, т.к. контейнер сервлетов самостоятельно заботится о жизненном цикле сервлетов (а значит и за утечками памяти), безопасности и сборщике мусора.
  • Сервлеты относительно легки в изучении и поддержке, таким образом разработчику необходимо заботиться только о бизнес логике приложения, а не внутренней реализации веб технологий.

34. Каковы наиболее распространенные задачи выполняемые в Servlet контейнере?

  • Поддержка обмена данными. Контейнер сервлетов предоставляет легкий способ обмена данными между веб клиентом (браузером) и сервлетом. Благодаря контейнеру нет необходимости создавать слушателя сокета на сервере для отслеживания запросов от клиента, а так же разбирать запрос и генерировать ответ. Все эти важные и комплексные задачи решаются с помощью контейнера и разработчик может сосредоточиться на бизнес логике приложения.
  • Управление жизненным циклом сервлетов и ресурсов. Начиная от загрузки сервлета в память, инициализации, внедрения методов и заканчивая уничтожением сервлета. Контейнер так же предоставляет дополнительные утилиты, например JNDI, для управления пулом ресурсов.
  • Поддержка многопоточности. Контейнер самостоятельно создает новую нить для каждого запроса и предоставляет ей запрос и ответ для обработки. Таким образом сервлет не инициализируется заново для каждого запроса и тем самым сохраняет память и уменьшает время до обработки запроса.
  • Поддержка JSP. JSP классы не похожи на стандартные классы джавы, но контейнер сервлетов преобразует каждую JSP в сервлет и далее управляется контейнером как обычным сервлетом.
  • Различные задачи. Контейнер сервлетов управляет пулом ресурсов, памятью приложения, сборщиком мусора. Предоставляются возможности настройки безопасности и многое другое.

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

PrintWriter — это класс для работы с символьным потоком, а ServletOutputStream — класс для работы байтовым потоком. PrintWriter используется для записи информации на основе символов, вроде массива символов или строки в ответ, в то время как ServletOutputStream используется для записи в ответ массива байтов. Для получения экземпляра ServletOutputStream используется метод ServletResponse getOutputStream(), а для PrintWriter — метод ServletResponse getWriter().

36. Можем ли мы получить PrintWriter и ServletOutputStream одновременно в сервлете?

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

37. Расскажите об интерфейсе SingleThreadModel.

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

38. Какие существуют атрибуты у сервлетов и какая сфера их применения?

Атрибуты сервлетов ипользуются для внутренней коммуникации сервлетов. Мы можем использовать атрибуты set, get, remove в веб приложении. Существует три области видимости атрибутов — request scope, session scope, application scope.

Интерфейсы ServletRequest, HttpSession и ServletContext предоставляют методы для get(), set(), remove() атрибутов из request scope, session scope, application scope соответственно.

39. Почему необходимо переопределить только init() метод без аргументов?

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

40. Что означает URL encoding? Зачем нужны методы encode() и decode()?

URL Encoding — процесс преобразования данных в форму CGI (Common Gateway Interface), который позволит путешествовать по сети без проблем. URL Encoding разделяет пробелы и заменяет специальные символы с помощью escape-симолов. Например, для кодирования строки используется метод  java.net.URLEncoder.encode(String str, String unicode). Обратная операция декодирования возможна благодаря методу java.net.URLDecoder.decode(String str, String unicode). Пример работы метода: строка «Java for study .ru» будет преобразована в Java%20for%20study%20.ru.

41. Зачем нужны и чем отличаются методы encodeUrl() и encodeRedirectUrl()?

HttpServletResponse предоставляет методы преобразования URL в HTML гиперссылки с преобразованием спец символов и пробелов, а так же добавления session id к URL. Такое поведение аналогично URLEncoder encode(), но с добавлением дополнительного параметра jsessionid в конец URL.

Метод HttpServletResponse encodeRedirectUrl() применяется для преобразования redirect URL в ответе. Таким образом при предоставлении поддержки URL rewriting для HTML гиперссылок необходимо использовать encodeURL(), а для редирект URL’ов использовать encodeRedirectUrl().

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

Сессия является обычным состоянием взаимодействия сервера и клиента и может содержать в себе множество запросов и ответов клиент-сервер. Т.к. HTTP и веб сервер не запоминают состояния (stateless), то единственным способом поддерживать сессию является пересылка уникальной информации (session id) в каждом запросе и ответе между клиентом и сервером.

Существуют несколько распространенных способов управления сессией в сервлетах:

  • Аутентификация пользователя
  • HTML hidden field (скрытое поле)
  • Cookies
  • URL Rewriting
  • Session Management API
Java Servlet Session Management Tutorial with Examples of Cookies, HttpSession and URL Rewriting: http://www.journaldev.com/1907/java-servlet-session-management-tutorial-with-examples-of-cookies-httpsession-and-url-rewriting

43. Что означает URL Rewriting?

Для управления сессией в сервлетах мы можем использовать HTTPSession, но он работает с Cookies, а их иногда отключают. Для этого случая в сервлетах предусмотрена возможность URL Rewriting. С точки зрения программирования необходимо всего одно действие — кодирование URL. Другим достоинством является то, что этот метод является как бы запасным и включается только при выключенных куках.

Применяя метод HttpServletResponse encodeURL() мы можем закодировать URL. Если необходим редирект к другому ресурсу, то для предоставления информации о сессии применяется метод encodeRedirectURL().

44. Как применяются Cookies в сервлетах?

Cookies (куки) используются в клиент-серверном взаимодействии и они не являются чем-то конкретным к Java. Servlet API предоставляет поддержку cookies через класс javax.servlet.http.Cookie implements Serializable, Cloneable. Для получения массива cookies из запроса необходимо воспользоваться методом HttpServletRequest getCookies(). Для добавления cookies в запрос методов не предусмотрено.

Аналогично HttpServletResponse addCookie(Cookie c) — может добавить cookie в response header, но не существует геттера для этого типа передачи данных.

Servlet Cookie Example Tutorial: http://www.journaldev.com/1956/servlet-cookie-example-tutorial

45. Как уведомить объект в сессии, что сессия недействительна или закончилась?

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

Servlet Listener Example – ServletContextListener, HttpSessionListener and ServletRequestListener: http://www.journaldev.com/1945/servlet-listener-example-servletcontextlistener-httpsessionlistener-and-servletrequestlistener

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

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

47. Как мы можем обеспечить transport layer security для нашего веб приложения?

Для этого необходимо настроить SSL для вашего сервлет контейнера. Как это сделать описано в мануалах для конкретной реализации контейнера.

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

При работе с большим количеством подключений к базе данных рекомендуется инициализировать их в servlet context listener и установить в качестве атрибута контекста для возможности использования другими сервлетами. Логирование Log4j подключается с помощью конфигурации XML (или файла property) и далее эта информация используется при конфигурировании context listener’а.

Servlet Example in Java with Database Connection and Log4j integration: http://www.journaldev.com/1997/servlet-example-in-java-with-database-connection-and-log4j-integration

49. Какие важные особенности существуют в Servlet 3?

  • Servlet Annotations. До Servlet 3 весь маппинг был в web.xml, что приводило к ошибкам и банально неудобно при большом количестве сервлетов. Примеры аннотаций:  @WebServlet, @WebInitParam, @WebFilter, @WebListener.
  • Web Fragments. С появлением веб фрагментов мы можем содержать множество модулей в одностраничном веб приложении. Все модули прописываются в fragment.xml в META-INF директории. Это позволяет разделять веб приложение на отдельные модули, включенные как JAR файлы в отдельной lib директории.
  • Динамическое добавление веб компонентов. Используя ServletContext объект, мы можем программно добавлять фильтры и слушатели. Это помогает построить динамическую систему, в которой необходимый объект будет вызван только по необходимости. Для этого применяются методы addServlet(), addFilter(), addListener().
  • Асинхронное выполнение. Поддержка асинхронной обработки позволяет передать выполнение запроса в другой поток без удержания всего сервера занятым.
Асинхронный сервлет: http://www.journaldev.com/2008/async-servlet-feature-of-servlet-3

50. Каковы различные способы аутентификации сервлета?

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

  • HTTP Basic Authentication
  • HTTP Digest Authentication
  • HTTPS Authentication
  • Form Based Login

51. Написать сервлет, реализующий загрузку файла на сервер.

Servlet Upload File and Download File Example: http://www.journaldev.com/1964/servlet-upload-file-and-download-file-example
к списку вопросов раздела JEE

Вопросы и ответы по сервлетам в Java EE — JEE Servlet API. Часть 1.

Share Button
26
20265 Total Views 1 Views Today

Добавить комментарий