
отчеты по лабораторным работам / лабораторная работа 6 (jsp) / Java Server Page
.docx
Наименование объекта |
Тип объекта |
Назначение |
request (запрос) |
javax.servlet.HttpServletRequest |
Запрос, требующий обслуживания. Область видимости - запрос. Основные методы : getAttribute, getParameter, getParameterNames, getParameterValues Таким образом, запрос request обеспечивает обращение к параметрам запроса через метод getParameter, типу запроса (GET, POST, HEAD, и т.д.), и входящим HTTP заголовкам (cookies, Referer и т.д.). |
response (ответ) |
javax.servlet.HttpServletResponse |
Ответ на запрос. Область видимости - страница. Поскольку поток вывода (см. out далее) буферизован, можно изменять коды состояния HTTP и заголовки ответов, даже если это недопустимо в обычном сервлете, но лишь в том случае, если какие-то данные вывода уже были отправлены клиенту. |
out (вывод) |
javax.servlet.jsp.JspWriter |
Объект, который пишет в выходной поток. Область видимости - страница. Основные методы : clear, clearBuffer, flush, getBufferSize, getRemaining. Необходимо помнить, размер буфера можно изменять и даже отключить буферизацию, изменяя значение атрибутаbuffer директивы page. Также необходимо обратить внимание, что out используется практически исключительно скриплетами, поскольку выражения JSP автоматически помещаются в поток вывода, что избавляет от необходимости явного обращения к out. |
pageContext (содержание страницы) |
javax.servlet.jsp.pageContext |
Содержимое JSP-страницы. Область видимости - страница. pageContext поддерживает доступ к полезным объектам и методам, обеспечивающим явный доступ реализации JSP к специфическим объектам. Основные методы : getSession, getPage, findAttribute, getAttribute, getAttributeScope, getAttributeNamesInScope, getException. |
session (сеанс) |
javax.servlet.HttpSession |
Объект типа Session, создаваемый для клиента, приславшего запрос. Область видимости - страница. Основные методы getId, getValue, getValueNames, putValue. Сессии создаются автоматически, и переменная session существует даже если нет ссылок на входящие сессии. Единственным исключением является ситуация, когда разработчик отключает использование сессий, используя атрибут session директивы page. В этом случае ссылки на переменную session приводят к возникновению ошибок при трансляции JSP страницы в сервлет. |
application (приложение) |
javax.servlet.ServletContext |
Контекст сервлета, полученный из объекта конфигурации сервлета при вызове методов : getServletConfig или getContext. Область видимости - приложение. Основные методы : getMimeType, getRealPath. |
config (конфигурация) |
javax.servlet.ServletConfig |
Объект ServletConfig текущей страницы JSP. Область видимости - страница. Основные методы : getInitParameter, getInitParameterNames |
page (страница) |
java.lang.Object |
Экземпляр класса реализации текущей страницы JSP, обрабатывающий запрос. Область видимости - страница. Объект доступен, но, как правило, используется редко. По сути является синонимом для this, и не нужен при работе с Java. |
exception (исключение) |
java.lang.Throwable |
Объект Throwable, выводимый в страницу ошибок error page. Область видимости - страница. Основные методы :printStackTrace, toString, getMessage, getLocalizedMessage. |
Java Server Page. Компонент JavaBean
Компоненты JavaBeans – это многократно используемые классы Java, позволяющие разработчикам существенно ускорять процесс разработкии WEB-приложений путем их сборки из программных компонентов. JavaBeans и другие компонентные технологии привели к появлению нового типа программирования – сборки приложений из компонентов, при котором разработчик должен знать только сервисы компонентов; детали реализации компонентов не играют никакой роли.
Компоненты JavaBean – это одноуровневые объекты, использующиеся для того, чтобы инкапсулировать в одном объекте сложный код, данные или и то и другое. КомпонентJavaBean может иметь свойства, методы и события, открытые для удаленного доступа.
Компонент JavaBean – это java-класс, удовлетворяющий определенным соглашениям о наименовании методов и экспортируемых событий. Одним из важных понятий технологииJavaBeans является внешний интерфейс properties (свойства). Property – это пара методов (getter и setter), обеспечивающих доступ к информации о внутреннем состоянии компонента JavaBean.
Для обращения к компонентам JavaBeans на странице JSP необходимо использовать следующее описание тега в разделе head :
<jsp:useBean id="BeanID" [scope="page | request | session | application"] class="BeanClass" />
BeanID определяет имя компонента JavaBean, являющееся уникальным в области видимости, заданной атрибутом scope. По умолчанию принимается область видимостиscope="page", т.е. текущая страница JSP.
Обязательный атрибут класса компонента "class" может быть описан следующим способом:
class="имя класса" [type="полное имя суперкласса"]
Свойство компонента JavaBean с именем myBean устанавливается тегом:
<jsp:setProperty name="myBean" property="Имя свойства" value="Строка или выражение JSP" />
Для чтения свойства компонента JavaBean с именем myBean используется тег:
<jsp:getProperty name="myBean" property="Имя свойства" />
В следующем листинге приведен пример компонента JavaBean, содержащего строку mystr, используемую в качестве свойств.
Листинг компонента JavaBean
package beans;
public class myBean
{
private String mystr;
//----------------------------------------------
public void setMystr(String mystr)
{
this.mystr = mystr;
}
//----------------------------------------------
public String getMystr()
{
return mystr;
}
//----------------------------------------------
}
Java Server Page. Теги JSP
В соответствии с определением в спецификации JSP библиотека тегов – это коллекция действий, инкапсулирующих некоторую функциональность, которые могут использоваться из страницы JSP. То есть, библиотека тегов представляет собой java-классы, реализующие определенную бизнес-логику в соответствии с Tag Libraries Interface (интерфейс библиотеки тегов).
Структура тегов напоминает структуру сервлетов, которые могут быть многократно использованы в течение цикла жизни тегов. Библиотека тегов включает один или несколько тегов-классов и XML-дескриптор, содержащий описание тегов и параметров, используемых тегами. Применение библиотеки тегов напоминает использование компонентов JavaBean, поскольку в обоих случаях часть действий и логика выносится за пределы страницы JSP, решая задачу модульного программирования информационных систем.
Существенным преимуществом использования библиотеки тегов перед компонентами JavaBean заключается в том, что тег (java-класс) имеет доступ к странице JSP и может оперировать содержимым самой страницы JSP.
Библиотека тегов может определять сложные расчеты в более компактной форме. Однако установка библиотек тегов требует большей работы по сравнению с компонентамиJavaBean. Компоненты JavaBean особенно эффективны для организации взаимодействия между другими компонентами, поскольку компонент JavaBean может быть создан в одном сервлете, а использоваться другими сервлетами и JSP. Библиотеки тегов, как правило, представляют более замкнутую и самодостаточную систему. Код java-класса, оформленный в виде тега для выполнения определенных действий, скрывает от пользователя набор операций, определяющих его функциональность. При использовании библиотеки тегов разработка java-кода на странице JSP заключается в описании пользовательских дескрипторов и определением необходимых атрибутов тега(java-класса).
Для использования/создания библиотеки тегов необходимо разработать:
класс (Tag handler class), обрабатывающий тег и определяющий его функциональные свойства;
XML-файл – дескриптор библиотеки тегов Tag Library Descriptor (файл TLD) – связывающий наименование элементов описания тегов с их реализацией.
Кроме вышеуказанных составляющих библиотеки тегов необходимо выполнить еще два условия использования библиотеки тегов:
Зарегистрировать в дескрипторе поставки web.xml с помощью директивы описание месторасположения библиотеки тегов. Пример описания библиотеки тегов templates.tld в дескрипторе поставки web.xml:
<taglib> |
|
|
<taglib-uri>/sdo<taglib-uri> |
|
<taglib-location>/WEB-INF/tlds/templates.tld</taglib-location> |
</taglib> |
После этого на странице JSP можно использовать ссылку на библиотеку следующим образом:
<%@ taglib uri="/sdo" prefix="sdo %> |
На странице JSP с помощью директивы необходимо указать месторасположение файла TLD. Пример описания библиотеки тегов templates.tld на странице JSP:
<%@ taglib uri=”/WEB-INF/tlds/usertags.tld" prefix="tag" %> |
В данных примерах библиотека тегов templates.tld располагается в директории WEB-INF/tlds.
При компиляции страницы JSP в сервлет пользовательские теги преобразуются в действия над объектами серверной стороны. Интерфейсы и классы, с помощью которых создаются пользовательские теги, располагаются в пакете javax.servlet.jsp.tagext.
Пользовательские действия определяются согласно следующей структуре:
открывающий тег – действие, выполняемое java-классом при открытии тега;
тело действия;
закрывающий тег – действие, выполняемое java-классом при закрытии тега.
Java-класс, обрабатывающий тег, может реализовывать один из следующих интерфейсов:
Tag;
IterationTag;
BodyTag.
Интерфейс Tag
Интерфейс Tag, являющийся наиболее общим интерфейсом, поддерживает пользовательские действия в JSP и определяет следующие базовые методы, инициируемые контейнером:
setter методы для инициализации переменных;
doStartTag () – метод, определяющий начало обработки действия тега;
doEndTag () (либо doFinally () при использовании интерфейса TryCatchFinally ()) – метод, определяющий окончание обработки действия тега.
Когда контейнер обнаруживает дескриптор пользователя, он вызывает методы setPageContext () и setParent () объекта, реализующего интерфейс Tag. Затем контейнер вызывает метод doStartTag (), определяя начало выполнения действия, и завершает его вызовом метода doEndTag ().
Интерфейс IterationTag
Интерфейс IterationTag расширяет интерфейс Tag, добавляя метод doAfterBody (), используемый для перезагрузки тела. Метод doAfterBody () вызывается после каждой загрузки с тем, чтобы определить, требуется ли следующая перезагрузка.
Интерфейс BodyTag
Интерфейс BodyTag расширяет интерфейс IterationTag, добавляя два новых метода для манипуляции с телом тега:
setBodyContent () – метод, посылающий в буфер объект BodyContent;
doInitBody () – метод, предоставляющий возможность обрабатывать буфер перед первой загрузкой в него тела тега.
Для обработчиков тегов можно использовать классы TagSupport, BodyTagSupport и TagExtraInfo в качестве базовых классов. Обработчик тега имеет доступ к API, позволяющему взаимодействовать с JSP-страницей. Входной точкой в API является объект контекста страницы javax.servlet.jsp.PageContext, через который обработчик тега может извлечь все другие внутренние объекты (запрос, сессию и приложение), доступные из JSP-страницы.
Использование тегов с атрибутами
Возможность использования тегов с атрибутами делает технологию использования библиотек тегов еще более гибкой. Обращение к пользовательскому тегу с атрибутами на странице JSP имеет следующий формат:
<prefix:tag_name attribute1='value1' attribute2='value2' .../>
Пример простейшего тега приведен в следующем листинге.
Java-класс простейшего заказного тега
package tags.sdo;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class InfoTag extends TagSupport
{
public int doStartTag () throws JspException
{
pageContext.getOut ().print ("Библиотека тегов");
return SKIP_BODY;
}
}
Исходный код необходимо откомпилировать обычным образом и установить в контейнер так же, как устанавливается сервлет. Необходимо контролировать соответствие пакетов Java и каталогов файловой системы : в каталоге WEB-INF/classes данный тег InfoTag.class должен быть установлен в подкаталог tags/sdo.
Java Server Page. Пример JSP-страницы
В отличие от сервлетов, требующих компиляции java-файла для получения класса (файла *.class) JSP-страницы не требуют компиляции и регистрации в дескрипторе поставкиweb.xml. Контейнер сервлетов расширили препроцессором, переводящим запись страницы JSP в сервлет. Препроцессор обрабатывает страницу JSP автоматически при первом обращении к ней. Полученный в результате его работы сервлет тут же компилируется и выполняется. Откомпилированный сервлет затем сохраняется в WEB-контейнере так же, как и все сервлеты, и выполняется при последующих вызовах страницы JSP.
Листинг JSP-страницы HelloWorld.jsp
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<%@ page contentType="text/html; charset=windows-1251" %>
<%@ page import="java.util.*, java.text.*" %>
<html>
<head>
<title>Простейшая страница JSP</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
Добро пожаловать! Сегодня <%= getFormattedDate () %>
</body>
</html>
<%!
String getFormattedDate ()
{
SimpleDateFormat sdf = new SimpleDateFormat ("dd.MM.yyyy hh:mm:ss");
return sdf.format (new Date ());
}
%>
Результатом выполнения данной JSP-страницы будет сформированный HTML-документ с приветствием и текущей датой.