Вопросы по Java на собеседовании (9)

1. Общее понятие JSP
2. Порядок обработки сервером JSP страниц
3. Жизненный цикл JSP
4. Компоненты JSP страницы
5. Методы жизненного цикла JSP
6. Блокирование прямого доступа к JSP странице
7. Динамическое и статическое содержание JSP страницы
8. Синтаксис JSP страницы
9. Комментирование кода JSP страницы
10. JSP директивы
11. JSP директива page
12. JSP директива taglib
13. JSP директива include
14. JSP директива declarations
15. JSP директива scriptlets
16. Выражения expressions
17. Библиотека тегов JSTL
18. Тег вывода значения <c:out>
19. Тег определения значения <c:set>
20. Тег проверки условия <c:if>
21. Тег проверки нескольких условий <c:choose>
22. Тег формирования цикла <c:forEach>
23. Тег вложения <c:import>
24. Тег перехвата исключений <c:catch>

Вопросы и ответы для собеседование по Java, Содержание.
Вопросы и ответы для собеседование по Java, часть 8.

1. Общее понятие JSP

Java Server Pages (JSP) - это одна из технологий J2EE, представляющая расширение технологии сервлетов для упрощения работы с Web-содержимым. Страница JSP позволяет разделить Web-содержимое на статическую и динамическую часть, допускающую многократное использование ранее определенных компонентов.

Спецификация Java Server Pages наследует и расширяет спецификацию сервлетов. Как и сервлеты, компоненты JSP относятся к компонентам Web и располагаются в Web-контейнере.

Страницы JSP компилируются web-контейнером в сервлеты, которые являются Java-классами, и выполняются на сервере.

2. Порядок обработки сервером JSP страниц

При открытии страницы jsp браузер отправляет http запрос на сервер в виде "GET /page_name.jsp". Сервер (WEB-контейнер) согласно запросу компилирует (при первом обращении) JSP страницу и выполняет Java сервлет, который возвращается пользователю в виде соответствующей страницы. Этот порядок включает 6 шагов :
  1. Запрос от пользователя
  2. Чтение .jsp страницы сервером
  3. Генерация java класса на основе .jsp страницы
  4. Компиляция в class файл
  5. Выполнение class файла
  6. Отправка ответа пользователю в виде html страницы

Формирование class файла (преобразование в сервлет) сервер выполняет только один раз при первом обращении к jsp-странице. При последующих обращениях сервер использует скомпилированный сервлет.

3. Жизненный цикл JSP

Жизненный цикл jsp-страницы состоит из нескольких фаз :

  • Translation - JSP контейнер проверяет код JSP страницы и создает кода сервлета.
  • Compilation - JSP контейнер компилирует исходный код jsp-класса и создает class.
  • Class Loading - WEB-контейнер загружает class в память.
  • Instantiation - вызов конструктора без параметров для инициализации class'a в памяти.
  • Initialization - вызов init метода объекта JSP класса, инициализация сервлета с init параметрами, указанными в дескрипторе развертывания (web.xml).
  • Request Processing - обработка запроса клиента JSP страницей. Обработка является многопоточной и аналогична сервлетам - для каждого запроса создается новый поток, создаются объекты ServletRequest и ServletResponse и выполняется service метод сервлета.
  • Destroy - JSP класс удаляется из памяти.

4. Компоненты JSP страницы

Технология JSP использует следующие компоненты :

  • Директивы (JSP directive) для определения параметров страницы, подключения ресурсов, использования нестандартных библиотек тегов.
  • Действия (JSP actions) для воздействия на стандартный поток вывода, использования, модификации и создания объектов, динамического подключения файла и компонентов JavaBeans, перенанаправления на другую страницу.
  • Скриптлеты (JSP scriptlets) для использования кода Java на странице JSP.
  • Библиотеки тегов (tag library) для расширения свойств библиотеки.

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

Сервер приложений (например, Tomcat, GlassFish) создает из JSP-страницы класс сервлета, наследующего свойства класса org.apache.jasper.runtime.HttpJspBase, включающего следующие методы :

  • jspInit() Метод вызывается в жизненном цикле JSP один раз для инициализации конфигурационных параметров, указанных в дескрипторе приложения;
  • _jspService(HttpServletRequest, HttpServletResponse) Метод вызывается сервером приложений при каждом обращении пользователя к странице с передачей объектов запроса и ответа;
  • jspDestroy() Метод вызывается сервером приложений для удаления объекта из памяти на последней фазе жизненного цикла JSP.

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

6. Блокирование прямого доступа к JSP странице

Из WEB браузера можно обратиться к любой JSP-странице. Однако, если разместить страницу в директории приложения WEB-INF, которая не имеет прямого доступа из браузера, то открыть страницу напрямую будет нельзя. Поэтому, разместив JSP страницу внутри папки WEB-INF, можно запретить прямой доступ к странице из браузера. В этом случае, необходимо настраивать доступ к JSP странице в дескрипторе развертывания приложения (web.xml) подобно сервлету. Это можно сделать для страницы stub.jsp следующим образом :

<servlet>
    <servlet-name>Stub</servlet-name>
    <jsp-file>/WEB-INF/stub.jsp</jsp-file>
    <init-param>
        <param-name>name</param-name>
        <param-value>value</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>Stub</servlet-name>
    <url-pattern>Stub.xhtml</url-pattern>
</servlet-mapping>

7. Динамическое и статическое содержание JSP страницы

Динамическое содержание определяются во время выполнения приложения. Обычно динамическое содержание страницы представлено в виде выражений Expression Language (EL), библиотек тегов и тегов разработчика.

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

8. Синтаксис страницы JSP

JSP страница имеют комбинированный синтаксис : объединение стандартного синтаксиса, соответствующего спецификации HTML, и синтаксиса JSP, определенного спецификацией Java Server Pages. Синтаксис JSP определяет правила записи страниц JSP, состоящих из стандартных тегов HTML и тегов JSP. Страницы JSP, кроме HTML-тегов, содержат теги JSP следующих категорий :

  • комментарии (comments);
  • директивы (directives);
    • page;
    • taglib;
    • include;
  • объявления (declarations);
  • скриптлеты (scriptlets);
  • выражения (expressions);

9. Комментирование кода JSP страницы

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

  1. Обычный HTML комментарий. Комментарии данного типа включаются сервером в страницу и будут видны клиенту при просмотре кода страницы.
  2. JSP комментарии. Такие комментарии не включаются сервером в страницу и не отправляются клиенту. Для комментарования кода или добавления отладочной информации необходимо использовать этот тип комментариев.

Кроме этого можно использовать комментарии с динамическим содержимым. Для этого внутрь закомментированного блока должен быть встроен тег скриптлета. Примеры комментирования :

<!-- Обычный комментарий, выводится в выходной поток -->

<%-- JSP комментарий --%>

<!-- Динамический комментарий : <%= expression %> -->

10. JSP директивы

JSP директивы всегда помещаются в начале JSP-страницы до всех остальных тегов, чтобы анализатор (parser) JSP при разборе текста выделил глобальные инструкции. JSP директивы предоставляют глобальную необходимую на стадии трансляции информации, касающихся конкретных запросов, направляемых на сервер. Таким, образом, JSP Engine (среда исполнения JSP), анализируя код, создает из JSP сервлет. Т.е. директивы представляют собой сообщения для WEB-контейнера JSP.

Синтаксис JSP директив имеет следующий вид :

<%@ директива имяАтрибута="значение" %>

Директива может иметь несколько атрибутов. В этом случае директива может быть повторена для каждого из атрибутов. В то же время пары "имяАтрибута=значение" могут располагаться под одной директивой с пробелом в качестве разделителя.

Согласно спецификации JSP существует три типа директив :

  • page (страница);
  • taglib (библиотека тегов);
  • include (включить).

11. JSP директива page

JSP директива "page" определяет свойства страницы JSP, которые необходимо использовать транслятору. Порядок следования атрибутов в директиве page не имеет значения. Нарушение синтаксиса или наличие нераспознанных атрибутов приводит к ошибке трансляции. Пример директивы "page" :

<%@ page buffer="none" isThreadSafe="yes" errorPage="/error.jsp" %>

В примере директива "page" объявляет, что JSP страница не использует буферизацию, но возможно одновременное обращение к данной странице JSP многих пользователей, и что поддерживается страница ошибок с именем error.jsp.

JSP директива "page" может содержать информацию о странице :

<%@ page info = "JSP Sample 1" %>

Список возможных атрибутов директивы "page" можно посмотреть здесь.

12. JSP директива taglib

JSP директива "taglib" объявляет, что на данной JSP странице используется библиотека тегов, которая идентифицируется уникальным образом с помощью URI. В директиве определяется префикс тега, с помощью которого возможны обращения к библиотеке. Если контейнер не может найти библиотеку тегов, возникает фатальная ошибка трансляции. Директива "taglib" имеет следующий синтаксис :

<%@ taglib uri="http://www.taglib/mytags" prefix="customs" %>
 . . .
<customs:myTag>

В примере библиотека тегов располагается по URI-адресу "http://www.taglib/mytags". В качестве префикса определена строка "customs", которая используется в коде странице JSP при обращении к элементам (myTag) библиотеки тегов.

13. JSP директива include

Директива "include" позволяет вставлять текст или код в процессе трансляции JSP страницы в сервлет.

<%@ include file="copyright.html" %>

В примере WEB-контейнер включает файл "copyright.html" в страницу JSP. Если содержимое файла изменится, то контейнер может перекомпилировать страницу JSP. Директива "include" рассматривает ресурс, например, страницу JSP, как статический объект.

Заданный URI обычно интерпретируется относительно JSP страницы, на которой расположена ссылка. Но, как и при использовании любых других относительных URI, можно задать системе положение интересующего ресурса относительно домашнего каталога WEB-сервера добавлением в начало URI символа "/". Содержимое подключаемого файла обрабатывается как обычный текст JSP и поэтому может включать такие элементы, как статический HTML, элементы скриптов, директивы и действия.

14. JSP директива declarations

JSP директива "declarations" применяется для определения переменных и методов, которые используются на странице JSP. Примеры директивы "declarations" :

// Объявление глобальной целочисленной переменной i
<%! int i ; %>

// Объявление и инициализация глобальной строковой переменной s
<%! String s = "Hello, World!"; %>

// Объявление метода adding (сложение целочисленных значений)
<%! public int adding (int a, int b){return a + b}; %>

15. JSP директива scriptlets

Скриптлеты "scriptlets" включают различные фрагменты кода, написанного на языке скрипта, определенного в директиве language, т.е. соответствуют, как правило, синтаксису языка Java. "scriptlets" имеют следующий синтаксис :

<% текст скриптлета %>

В спецификации JSP приводится простой и понятный пример скриптлета, обеспечивающего динамическое изменение приветствия на странице JSP в течение дня.

<% 
if (Calendar.getInstance().get (Calendar.AM_PM)==Calendar.AM){%>
   Good Morning 
<% } else { %>
Good Afternoon 
<% } %>

Следует отметить, что код внутри скриптлета вставляется в том виде, как он записан, а весь статический HTML-текст (текст шаблона) до или после скриптлета конвертируется при помощи оператора print. Это означает что скриптлеты не обязательно должны содержать завершенные фрагменты на Java, и что оставленные открытыми блоки могут оказать влияние на статический HTML-текст вне скриптлета.

16. Выражения expressions

Выражения "expressions" в странице JSP обозначает исполняемое выражение. Результат выражения JSP, имеющий обязательный тип String, направляется в стандартный поток вывода out с помощью текущего объекта JspWriter. Если результат выражения не может быть приведен к типу String, возникает либо ошибка трансляции, если проблема была выявлена на этапе трансляции, либо возбуждается исключение ClassCastException, если несоответствие было выявлено в процессе выполнения запроса. Пример выражения :

Текущее время: <%= new java.util.Date () %>

В выражениях можно использовать несколько определенных переменных. Наиболее часто используемые переменные :

  • request, HttpServletRequest;
  • response, HttpServletResponse;
  • session, HttpSession;
  • out, PrintWriter - буферизированный вариант типа JspWriter для отсылки данных клиенту.

17. Библиотека тегов JSTL

Стандартная библиотека тегов JSP (JavaServer Pages Standard Tag Library, JSTL) используется для условной обработки, создания циклов, интернационализации страницы, разбора XML данных. JSTL является альтернативой скриплетам, встроенным в JSP, то есть прямым вставкам Java кода, и представляет собой набор тегов в стиле HTML, позволяющих обращаться к объектам Java и выполнять многие из конструкций языка Java.

Для подключения библиотеки тегов JSTL используются следующие выражения :

// Основные теги создания циклов, определения условий и т.д.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

// Теги для работы с XML-документами
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>

// Теги для работы с базами данных 
<%@ taglib prefix="s" uri="http://java.sun.com/jsp/jstl/sql" %>

// Теги для форматирования и интернационализации информации
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %>

18. Тег вывода значения <c:out>

Тэг <c:out> используется для вывода данных на страницу. Примеры использования тега :

// 1. отображение текста 16+64*2
<c:out value="16+64*2" />

// 2. отображение значения 144
<c:out value="144" />

// 3. вывод значения user или guest, если user=null
<c:out value="" default="guest" />

Первый пример вернет текст "16+64*2", а вот второй — 144, поскольку используется выражение EL (Expression Language). Если выражение value вернет значение null, то тег <c:out> выведет на экран пустое место. Но если определить значение атрибута по-умолчанию (3-ий пример), то на странице отобразится это значение.

19. Тег определения значения <c:set>

Тег <c:set> используется для определения переменной. Пример использования :

<c:set var="user" scope="session" value="Sergey" />
<c:out value="" />

В примере создается переменная user, имеющая значение "Sergey". Обратиться к переменной можно с использованием EL выражения . Вторая строка примера выводит содержимое переменной на страницу. Атрибут "scope" определяет область видимости и не является обязательным; по-умолчанию имеет значение "page", т.е. доступен на странице. Возможные варианты атрибута scope [ session, page, request, application].

С помощью тэга <c:set> можно устанавливать свойства компонентов JavaBean, добавлять значения к спискам и массивам. Для этого используется параметр target. Например :

<c:set target="" property="fio" value="Остап Бендер" />
<c:out value="" />

20. Тег проверки условия <c:if>

Тег <c:if> позволяет проверить некоторое условие, но не может быть использован для формирования ветки else или elseif. Пример :

<c:if test="false">
    Возраст более 24 лет
</c:if>
<c:if test="false">
    Возраст не менее 24 лет
</c:if>

21. Тег проверки нескольких условий <c:choose>

Тег <c:choose> является аналогом оператора switch в Java. Он позволяет организовать выбор из нескольких условий. Синтаксис <c:choose> включает вложенный тег <c:when>, отвечающий за определенное действие. Пример :

<c:set var="alter" scope="session" value=""/>
<c:choose>
    <c:when test="false">
       Переменная alter <= 0
    </c:when>
    <c:when test="false">
        Переменная alter > 28
    </c:when>
    <c:otherwise>
        Условие не определено
    </c:otherwise>
</c:choose>

22. Тег формирования цикла <c:forEach>

Тег <c:forEach> позволяет сформировать цикл. Пример использования forEach :

<table>
  <c:forEach var="clip" items="" varStatus="сounter" >
    <tr><td>></td>
        <td></td></tr>
  </c:forEach>
</table>

Переменной атрибута var в цикле присваивается значение из списка items, которое отображается в ячейке таблицы. Значение можно вывести в ячейку таблицы с использованием выражения EL без тега <c:out>, т.е. . Тэг <c:forEach> может включать опциональный параметр varStatus, позволяющий, реализовать счетчик типа переменной 'i' в цикле.

23. Тег вложения <c:import>

Тег <c:import> позволяет выполнять вложения одной страницы в другую. Пример :

<c:import url="footer.jsp" >
    <c:param name="company" value="Рога и копыта" />
</c:import>

Страница footer.jsp загружается динамически на этапе выполнения запроса. В качестве url может использоваться страница за пределами сервера приложений. Если необходимо передать какой-либо параметр удаленной странице, то можно использовать тэг <c:param>. Таким образом тег <c:import> позволяет разбить страницу на части.

Дополнительную информацию об использовании библиотеки тегов JSTL можно увидеть здесь.

24. Тег перехвата исключений <c:catch>

Для перехвата и обработки возможных исключений в теле JSP следует использовать тэг <c:catch>. Пример :

<c:catch var ="exception">
   <% int x = 5/0;%>
</c:catch>

<c:if test = "false">
   <p>Возникло исключение :  <br />
      Сообщение : </p>
</c:if>

В примере при перехвате исключения была определена переменная "exception", значение которой выводится на страницу.

Вопросы и ответы для собеседование по Java, Содержание.
Вопросы и ответы для собеседование по Java, часть 8.

  Рейтинг@Mail.ru