JSP в вопросах и ответах

На странице рассмотрены следующие вопросы JSP :

  1. Технология JSP
  2. Этапы (фазы) жизненного цикла JSP
  3. Методы жизненного цикла JSP
  4. Комментарий на странице JSP
  5. Объявление declarations на странице JSP
  6. Скриплет scriptlet на странице JSP
  7. Выражения expression на странице JSP
  8. Неявные (implicit) объекты на JSP странице
  9. Библиотека JSTL
  10. Категории библиотеки JSTL
  11. Использование PageContext
  12. Блокирование выполнение выражений EL
  13. Обработка ошибок с помощью JSTL <c:catch>
  14. Обработка ошибки на JSP странице

Технология JSP

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

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

На странице JSP можно использовать компоненты JavaBeans, подключать собственные библиотеки нестандартных тегов, которые инкапсулируют сложные динамические функциональные средства.

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

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

Фазы жизненного цикла JSP

Исходный код JSP страницы ближе к HTML, чем к java-классу (сервлету). Конвертацию JSP страницы в java-код осуществляет сервер приложений типа Tomcat, который при первом обращении к JSP странице создает исходный код сервлета (java-класса). Сервлет размещается в директории /webapp/org/apache/jsp. Полный путь директории TOMCAT/work/Catalina/localhost/WEBAPP/org/apache/jsp. В исходном коде сервлета определен путь (пакет) package org.apache.jsp. Таким образом, жизненный цикл JSP страницы практически совпадает с жизненным циклом сервлета :

  1. Translation Cервер приложений "парсит" код JSP страницы и формирует java-класс сервлета. Если страница JSP называется index.jsp, то созданный сервлет обычно будет иметь имя index_jsp.java.
  2. Compilation Cервер приложений компилирует исходный код JSP класса и создает класс (class).
  3. Class Loading Контейнер JSP загружает class сервлет в память.
  4. Instantiation Внедрение конструкторов без параметров для инициализации класса в памяти.
  5. Initialization Вызывается метод init объекта JSP и выполняется инициализация сервлета параметрами, указаными в дескрипторе приложения web.xml. После этой фазы JSP сервлет "загружен в память" и готов для обработки запросов пользователей.
    Обычно это происходит при первом запросе, т.е. выполняется "ленивая загрузка". Но можно настроить загрузку и инициализацию JSP по аналогии с сервлетами на старте приложения;
  6. Request Processing Обработка запросов клиента JSP страницей. Обработка является многопоточной, аналогично сервлетам — для каждого запроса создается отдельный Thread, объекты ServletRequest и ServletResponse.
  7. Destroy Удаление JSP класса из памяти. Обычно это происходит при остановке сервера или выгрузки из контейнера JSP приложения.

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

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

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

Комментарий на странице JSP

Текст на JSP странице можно закомментировать либо с использованием тегов HTML, либо JSP тегов. Комментарии JSP не отображаются на странице, их можно использовать в качестве отладочных комментариев.

<!—- HTML комментарий; отображается на странице JSP —->
<%—- JSP комментарий; не отображается на странице JSP —-%>

Объявление declarations

JSP declarations предназначены для объявления методов и переменных. Синтаксис declarations определяется тегом <%! declaration %>, например :

<%! public static int count=0; %>
<%! String s = "Hello, World!"; %>
// Объявление метода в одну строку
<%! public int adding (int a, int b){return a + b}; %>

// Объявление метода в нескольких строках
<%! 
public static int fact (int n) 
{ 
    if (n <= 1) 
        return 1; 
    else 
        return n * fact (n - 1); 
 } 
%>

Скриплет scriptlet на странице JSP

Scriptlet представляет собой скриптовый элемент внутри JSP страницы, который должен быть выполнен. Синтаксис скриптлета задается тегом <% scriplet %>. Код внутри этих тегов передается в метод _jspService() для исполнения.

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

<%
Date d = new Date();
out.println("Current Date="+d);
%>

<%
String queryData = request.getQueryString (); 
out.println ("Дополнительные данные запроса: " + queryData); 
%>

Выражения expression на странице JSP

Часто возникает необходимость отобразить динамическую информацию с использованием метода out.print(). Для этого можно использовать язык выражений expression, который записывается как <%= expression %>.

Выражение <% out.print(«Я люблю отдыхать на природе»); %> может быть переписано с помощью JSP выражения <%= «Я люблю отдыхать на природе» %>. Весь текст внутри тегов <%= .. %> будет передан в out.print() метод.

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

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

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

  • HttpServletRequest request;
  • HttpServletResponse response;
  • HttpSession session;
  • PrintWriter out.

Неявные (implicit) объекты на JSP странице

Неявные объекты (implicit objects) создаются контейнером при конвертации JSP страницы в код сервлета. Эти объекты можно использовать в скриптлетах для передачи информации в сервис методы. Но неявные объекты нельзя использовать в JSP declarations. Можно использовать 9 неявных объектов прямо на JSP странице.

Пример JSP страницы с использованием неявных объектв implicit objects

<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> 
<%@ page import="java.util.Date" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
        <title>Пример JSP страницы</title>
    </head>
    <body>
        <h1>Добро пожаловать</h1>
        <%-- Запросы объектов (request object) --%>
        <b>Текущая дата</b>: <% out.print(new Date()); %><br><br>
        <b>Заголовок User-Agent</b>: <%= request.getHeader("User-Agent") %><br><br>

        <%-- Добавить cookie --%>
        <%response.addCookie(new Cookie("Test","Value")); %>

        <%-- Параметры конфигурации --%>
        <b>Значение параметра Timeout </b> : <%= config.getInitParameter("Timeout") %><br><br>
        <%-- Объект application --%>
        <b>Значение параметра Login</b> : <%= application.getInitParameter("User") %><br><br>
        <%-- Объект session --%>
        <b>Идентификатор сессии SessionID</b> : <%= session.getId() %><br><br>

        <%-- Объект pageContext --%>
        <p>Установлен атрибут pageContext : ключ "Account", значение "Serg".</p>
        <% pageContext.setAttribute("Account", "Serg"); %>
        <b>Атрибут PageContext</b> : { Key = "Account", Value="<%= pageContext.getAttribute("Account")%>"}<br><br>

        <%-- Объект page --%>
        <b>Имя сгенерированного класса сервлета</b> : <%= page.getClass().getName() %>
    </body>
</html>

Библиотека JSTL

JSTL (JavaServer Pages Standard Tag Library) - это стандартная библиотека тегов JSP, расширяющая ее функциональные возможности и позволяющая проводить такие операции/действия, как разбор XML данных, условные переходы, создание циклов и поддержку интернационализации.

JSTL является альтернативой встроенной в JSP логики типа скриптлетов, то есть прямые вставки Java кода. Для использования JSTL тегов необходимо подключить библиотеку (taglib) и указать пространство имен (prefix).

<%@ taglib uri="http://java.sun.com/jsp/jstl/core"      prefix="c"   %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"       prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql"       prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml"       prefix="x"   %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"  %>

Категории библиотеки тегов JSTL

Стандартную библиотеку тегов JSTL делят на пять категорий согласно их функциональности :

  • Core tags - циклы, объявления, обработка исключений, url, forward и redirect response и т.д.
  • Formatting и Localization Tags – форматирование Numbers, Dates, поддержка i18n локализации и resource bundles.
  • SQL Tags – поддержка работы с базами данных типа MySQL, Oracle и т.д.
  • XML Tags – работа с XML документами; парсинга, преобразование данных XML и т.п.
  • Functions Tags – набор функций для выполнения различных операций со строками типа конкатенации, разбиению строк и т.п.

Использование PageContext

Неявный implicit объект PageContext можно использовать для установки атрибутов с различной областью видимости и для передачи запросов другому ресурсу.

<p>Определение атрибута pageContext : ключ "Account", значение "Serg".</p>
<% pageContext.setAttribute("Account", "Serg"); %>
<%-- Чтение атрибута pageContext --%>
<p>Атрибут PageContext : {Key="Account", Value="<%= pageContext.getAttribute("Account")%>"}</p>

Блокирование выполнение выражений EL на JSP странице

Для игнорирования выполнения выражений на JSP странице существует два способа:

  • можно использовать директиву <%@ page isELIgnored=«true» %>;
  • настроить дескриптор приложения web.xml.
<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored>
    </jsp-property-group>
</jsp-config>

Можно блокировать выполнение выражения JSTL также размещением обратного слэша '\' перед EL.

Обработка ошибок с помощью JSTL тега <c:catch>

Для перехвата исключения с помощью JSTL Core Tags необходимо использовать тег <c:catch>. Тег c:catch записывает в переменную exception описание ошибки, которую можно обработать в теге c:if.

<c:catch var ="exception">
    <% int x = 5/0;%>
</c:catch>
  
<c:if test = "${exception ne null}">
   <p>Exception : ${exception} <br />
   Exception message : ${exception.message}</p>
</c:if>

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

Обработка ошибки на JSP странице

Для обработки исключений на JSP странице необходимо определить страницу ошибки. Для создания такой страницы необходимо установить значение аттрибута isErrorPage директивы page в значение true. В этом случае будет открыт доступ к неявным объектам исключений в JSP.

Например на JSP странице errorPageAttribute.jsp определяем страницу представления ошибки errorPage.jsp

<%@ page errorPage="errorPage.jsp" %>

На JSP странице обработки ошибки errorPage.jsp определяем аттрибут isErrorPage

<%@ page isErrorPage="true" %>

<html>
    <head>
        <title>Error Page</title>
    </head>
    <body>
        Your page generated an error : <%= exception.toString() %>
    </body>
</html>

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

  Рейтинг@Mail.ru