GrabDuck

Ответы на вопросы на собеседование JSP, Servlets, JSTL (часть 3).

:

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

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

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

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

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

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

  • Аутентификация пользователя
  • HTML hidden field (скрытое поле)
  • Cookies
  • URL Rewriting
  • Session Management API

  • Что означает URL Rewriting?

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

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

Cookie - это небольшие блоки текстовой информации, которые сервер посылает клиенту для сохранения в файлах cookies. Клиент может запретить браузеру прием файлов cookies. Браузер возвращает информацию обратно на сервер как часть заголовка HTTP, когда клиент повторно заходит на тот же веб-ресурс.

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

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

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

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

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

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

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

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

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

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

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

  • Какие особенности Servlet 3?

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

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

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

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

  • Что такое Java Server Pages (JSP)?

JSP (Java Server Pages) - технология, позволяющая веб-разработчикам динамически генерировать HTML, XML и другие веб-страницы. JSP был включен в состав Java EE - программной платформы для программирования веб-приложений. Технология позволяет вставлять Java-код, в статический содержимое страницы. Также могут использоваться библиотеки JSP тегов для вставки их в JSP-страницы. Страницы компилируются JSP-компилятором в сервлеты, которые являются Java-классами, и выполняются на сервере. Сервлеты также могут быть написаны разработчиком, не используя JSP-страницы. Эти технологии дополняют друг друга.

  • Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.

Когда пользователь переходит по ссылке, назовем ее index.jsp, он отправляет http запрос на сервер в виде "GET /index.jsp". Затем на основе этой страницы, сервер генерирует, компилирует и выполняет Java сервлет, который приходит ответом пользователю в виде отображения этой страницы. Такой жизненный цикл можно разделить на 6 шагов:

  1. Запрос от пользователя.
  2. Чтение .jsp страницы сервером.
  3. Генерация java класса на основе этой .jsp страницы.
  4. Компиляция в class файл.
  5. Выполнение class файла.
  6. Отправка ответа пользователю в виде html страницы.

  • Расскажите об этапах (фазах) жизненного цикла jsp.

Если посмотреть код внутри созданной JSP страницы, то он будет выглядеть как HTML и не будет похож на java класс. Конвертацией JSP страниц в HTML код занимается контейнер, который так же создает сервлет для использования в веб приложении. Жизненный цикл JSP состоит из нескольких фаз:

  • Translation - JSP контейнер проверяет код JSP страницы, парсит ее для создания кода сервлета. К примеру, в Tomcat вы можете найти классы сервлетов в директории TOMCAT/work/Catalina/localhost/WEBAPP/org/apache/jsp. Если страница JSP называется home.jsp, то созданный сервлет обычно будет иметь имя home_jsp и имя файла - home_jsp.java.
  • Compilation - JSP контейнер компилирует исходный код jsp класса и создает класс на этой фазе.
  • Class Loading - контейнер загружает классы в память на этой фазе.
  • Instantiation - внедрение конструкторов без параметров созданных классов для инициализации в памяти классов.
  • Initialization - в контейнере вызывается init метод объекта JSP класса и инициализируется конфигурация сервлета с init параметрами, которые указаны в дескрипторе развертывания (web.xml). После этой фазы JSP способен обрабатывать запросы клиентов.Обычно эти фазы происходят после первого запроса клиента (т.е. ленивая загрузка), но можно настроить загрузку и инициализацию JSP на старте приложения по аналогии с сервлетами.
  • Request Processing - длительный жизненный цикл  обработки запросов клиента JSP страницей. Обработка является многопоточной и аналогична сервлетам - для каждого запроса создается новая нить, создаются объекты ServletRequest и ServletResponse и происходит внедрение сервис методов JSP.
  • Destroy - последняя фаза жизненного цикла JSP на которой JSP класс удаляется из памяти. Обычно это происходит при выключении сервера или андеплое приложения.

  • Расскажите о методах жизненного цикла jsp.

Методы жизненного цикла JSP:

  • jspInit() - метод объявлен в JSP странице  и реализуется с помощью реализаций контейнера. Этот метод вызывается один раз в жизненном цикле JSP для того, чтобы инициализировать конфигурационные параметры, указанные в дескрипторе развертывания. Этот метод можно переопределить с помощью определения элемента JSP scripting и указания необходимых параметров для инициализации.
  • _jspService() - этот JSP метод внедряется JSP контейнером для каждого запроса клиента с помощью передачи объекта запроса и ответа. Отметьте, что имя метода начинается с нижнего подчеркивания и отличается от других методов жизненного цикла тем, что его невозможно переопределить. Весь JSP код проходит через этот метод и он переопределен по умолчанию. Этот метод определен в HttpJspPage интерфейсе.
  • jspDestroy() - метод вызывается контейнером JSP для удаления объекта из памяти (на последней фазе жизненного цикла JSP - Destroy). Метод вызывается только один раз и мы можем его переопределить для очищения любых ресурсов, которые были созданы в JSP init методе.

  • Какие методы жизненного цикла JSP могут быть переопределены?

Мы можем переопределить jspInit() и jspDestroy() методы с помощью использования скриптов JSP. Метод jspInit() переопределяется для создания общих ресурсов, которые мы хотели бы использовать в методе обслуживания JSP, а jspDestroy() метод переопределяется, чтобы освободить общие ресурсы на фазе уничтожения.

  • Как можно предотвратить прямой доступ к JSP странице из браузера?

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

  • Какая разница между динамическим и статическим содержимым JSP?

Динамические ресурсы. Результаты их деятельности изменяются во время выполнения приложения. Обычно представлены в виде выражений Expression Language, библиотек тегов и тегов разработчика.

Статические ресурсы. Не изменяются сами в процессе работы (HTML, JavaScript, изображения и т. д.).

  • Как закомментировать код в jsp?

JSP предоставляет две возможности закомментировать код:

  • HTML комментарии - <-- HTML Comment --> . Такие комментарии будут видны клиенту при просмотре кода страницы.
  • JSP комментарии - <%-- JSP Comment --%>. Такие комментарии создаются в созданном сервлете и не посылаются клиенту. Для любых комментариев по коду или отладочной информации необходимо использовать этот тип комментариев.

  • Какие основные теги в JSP?

В спецификации JSP 1.2 были объявлены только пять основных тегов:

  • <%@ директива %> - используется для установки параметров серверной страницы JSP;
  • <%! объявление %> - (нежелателен в современном программировании) содержит поля и методы, которые вызываются в expression-блоке и становятся полями и методами генерируемого сервлета.
  • <% скриптлет %> - (нежелателен) вживление java-кода в JSP-страницу. Скриптлеты обычно используют маленькие блоки кода и выполняются во время обработки запроса клиента.
  • <%= вычисляемое выражение %> - (нежелателен) содержит операторы языка Java, которые вычисляются, после чего результат вычисления преобразуется в строку String и посылается в поток out;
  • <%-- JSP-комментарий --%> - комментарий, который не отображается в исходных кодах JSP-страницы после этапа выполнения.

  • Какие типы EL операторов вы знаете?

Стандартные операторы отношения:

  • == (или eq), != (или ne), < (или lt), > (или gt), <= (или le), >= (или ge).
  • Арифметические операторы: +, -, *, / (или div), % (или mod).
  • Логические операторы: && (или and), || (или or), ! (или not).

  • Взаимодействие JSP - сервлет - JSP.

Такая архитектура построения приложений носит название MVC (Model/View/Controller). Model - классы бизнес-логики и длительного хранения, View - страницы JSP, Controller - сервлет.

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