Ответы на вопросы на собеседование 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) в каждом запросе и ответе между клиентом и сервером.
способом поддерживать сессию является пересылка уникальной информации (session id) в каждом запросе и ответе между клиентом и сервером.
Существуют несколько распространенных способов управления сессией в сервлетах:
- Аутентификация пользователя
- HTML hidden field (скрытое поле)
- Cookies
- URL Rewriting
- Session Management API
- Что означает URL Rewriting?
Для управления сессией в сервлетах мы можем использовать HTTPSession, но он работает с Cookies, а их иногда отключают. Для этого случая в сервлетах предусмотрена возможность URL Rewriting. С точки зрения программирования необходимо всего одно действие - кодирование URL. Другим достоинством является то, что этот метод является как бы запасным и включается только при выключенных куках.
Применяя метод HttpServletResponse encodeURL() мы можем закодировать URL. Если необходим редирект к другому ресурсу, то для предоставления информации о сессии применяется метод encodeRedirectURL().
- Что такое Cookie?
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 шагов:
- Запрос от пользователя.
- Чтение .jsp страницы сервером.
- Генерация java класса на основе этой .jsp страницы.
- Компиляция в class файл.
- Выполнение class файла.
- Отправка ответа пользователю в виде 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 - сервлет.
0 коментарі :
Отправить комментарий