Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:JAVA. Серверные приложения
.pdf
Часть 2 Java Server Page 111
де временного приложения _jspService(), т. е. скриплетах. Предопределенные объекты недостигаемы для методов, определенных с помощью
деклараций.
Сведя воедино все вышесказанное, можно написать небольшой пример, описывающий все вышесказанное:
<html>
<title>Date Display</title>
<body >
<!—DIRECTIVES—>
<%@ page language = "java" %>
<%@ page import = "java.util.*" %>
<%@ page contentType = "TEXT/HTML" %>
<!—SCRIPTLETS—>
<H3>
<% if (Calendar.getInstance().get(Calendar.AM_PM) == Calendar.AM)
{%>
Ну как ты после вчерашнего?
<%} else {%>
И что собираешься делать,
<% }
%>
WebSphere 3 User?
</H3>
<HR>
<!—ACCESSINGIMPLICITOBJECTS—>
<% out.println("Here is the <b>Date Display JSP</b>"); %>
<!—DECLARATIONS—>
<%!
private int calledCount = 0;
private String getDate(GregorianCalendar gcalendar) {
StringBuffer dateStr = new StringBuffer();
dateStr.append(gcalendar.get(Calendar.DATE));
dateStr.append("/");
dateStr.append(gcalendar.get(Calendar.MONTH) + 1);
dateStr.append("/");
dateStr.append(gcalendar.get(Calendar.YEAR));
return (dateStr.toString());
}
private int incrementCounter() {
return (++calledCount);
}
%>
<H1>Сегодня: <%= getDate(new GregorianCalendar()) %> </H1>
<H1>Данную страницу посетили: <%= incrementCounter() %> time(s)</H1>
</bod >
</html>

112 Часть 2 Java Server Page
Глава 11. JSP теги: <jsp:useBean>,
<jsp:getProperty>,<jsp:setProperty>,
<jsp:plugin>,<jsp:forward>,<jsp:include>
В отличие от стандартного HTML, где тегами описываются все элементы страницы, JSP имеет ряд тегов, предназначенных для перенаправления результатов запроса из одного ресурса в другой, и несколько
тегов по работе с надстраиваемыми компонентами JavaBean. В данном
случае JSP подобен XML, у которого практически все элементы создаются разработчиком.
Bean — технология создания компонентов с использованием языка
Java. Благодаря этой технологии у программиста отпадает необходимость переписывать каждый раз новый компонент для использования в
другой среде. Кроме того, bean является программой способной, выполнять действия. Но основная роль bean — это возможность многократного использования одного компонента, созданного в виде bean.
Еще один тип элементов, используемый в JSP, — встроенные теги.
В отличие от директив и скриплетов, JSP теги подобны HTML-тегам,
являясь в своем роде макрокомандами, выполняют специфические функции JSP-страницы. Все JSP-теги в основном могут работать как с динамическими данными, так и со статическими. Это отличает их от директив, которые значительно быстрее выполняются, чем тело скриплета, поскольку не требуют компиляции.
Основной особенностью JSP является возможность работы с bean.
Благодаря встроенным тегам эта работа сводится просто к указанию
нескольких строк, обычно двух- трех, с именованием bean и значений
его атрибутов.
В версии 1.0 описаны следующие теги для работы с JavaBean:
<jsp:useBean>
<jsp:getProperty>
<jsp:setProperty>
Дополнительные теги, предназначенные для надстройки выполнения
программ и перенаправления клиентского запроса:
<jsp:plugin>
<jsp:forward>
<jsp:include>
11.1. Использование тега <jsp:useBean> для установки JavaBean
в JSP-страницу
JavaBean — программные компоненты, т. е. часть программы, изолированная в отдельном элементе с целью повторного использования. JavaBean представляют собой графические элементы, надстраиваемые
над программой. Каждый JavaBean обладает свойствами, обрабатывает
какие-либо события и конечно же имеет методы по работе с данными.
Именно использование JavaBean превращает JSP в полнофункциональ-

Часть 2 Java Server Page 113
ное приложение. При установке JavaBean в JSP используется метод
Beans.instantiate () из серилизованного (.ser файл). В противном случае
вызывается метод newInstance () для создания нового экземпляра JavaBean. В отличие от остальных тегов, <jsp:useBean > не может быть пустым и обязательно должен иметь закрывающийся тег. В принципе размещение тега в JSP-странице не имеет большого значения. Одно основное правило необходимо соблюдать: JavaBean должен быть установлен
до того момента, прежде чем будут использоваться методы JavaBean,
т. е. теги <jsp:getProperty> и <jsp:setProperty> должны идти по тексту
после тега <jsp:useBean>. Для большей наглядности описание JavaBean
помещают в начало документа.
<HTML>
<HEAD>
<TITLE>Using JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<jsp:useBean id="primeTable" class="hall.NumberedPrimes" >
<% table.setRows("name",12323,jonh); %>
</jsp:useBean>
<jsp:setProperty name="primeTable" property="numDigits" />
<jsp:getProperty name="primeTable" property="numDigits" />
</BODY>
</HTML>
По предложению компании SUN все создаваемые JavaBean должны
соответствовать некоторым стандартам проектирования. Для получения
свойств JavaBean используются методы getXXX(), а для установки
свойств setXXX(). Это очень важно при использовании JavaBean в других программах. JSP использует пару методов getXXX()/setXXX для
передачи и получения данных JavaBean.
Для работы с методами и свойствами JavaBean в JSP необходимо инстанцировать используемый bean:
<jsp:useBean id="ccart"
class="com.rrlabs.webbank.jsp.Cart" scope="session"/>
Хорошей практикой считается использование директивы errorPage
при использовании тега инстанцирования JavaBean в JSP-страницу.
В этом случае обработкой ошибки невозможности создания класса JavaBean администратор системы будет оповещен через страницу с указанной директивой errorPage.
Тег <jsp:useBean> — основной тег по работе с бобами, занимает главенствующее положение, так как определяет сам JavaBean и его свойства, с которыми работает запрос пользователя. Имеет следующие атрибуты:
<jsp:useBean
id — "èìÿ áîáà"
scope — "page|request|session|application"
class — "package.class"

114 Часть 2 Java Server Page
type — "package.class"
class — "package.class" type-"package.class"
beanName="package.class"<%= выражение %> type="package.class"/>
Тег <jsp:useBean> предназначен только для работы с JavaBean и не
работает с Enterprise JavaBean. Для работы с Enterprise JavaBean можно создать простой JavaBean, вызывающий EJB, или же создать пользовательский тег, который непосредственно вызывает EJB.
В теле тега <jsp:useBean> используются два основных атрибута.
Первый атрибут — id — указывает универсальное имя, используемое в
дальнейшем на JSP-странице для работы с методами и свойствам установленного JavaBean. Имя, по которому идентифицируется данный боб,
чаще всего это просто имя класса без указания названия пакета или
просто псевдоним, затем это имя можно использовать в различных выражениях. Имя должно соответствовать правилам языка Java. Другой
атрибут, обязательно указываемый в теге scope, — область видимости,
в которой существует данный JavaBean, и переменная id доступна.
В JSP-странице область видимости объектов различна. Объекты могут
быть встроенными с помощью директив, определены при помощи JSPтегов или указаны в коде.
Наверное, область видимости легче описать графическим способам
рис. 2.3, нежели попытаться использовать ограниченный запас ключевых слов используемого языка.
Существуют четыре области видимости, используемые в JSP для
каждого экземпляра JavaBean:
•
page — данное указание предполагает использование боба в момент посылания ответа и ожидания запроса, при данном условии
bean сохраняется как контекст страницы. Использовать JavaBean
можно без ограничений на любой JSP-странице, на которой создан.
Экземпляр JavaBean живет до тех пор, пока формируется ответ;
•
request — использование боба осуществляется на момент обработки запросом, здесь bean представлен как объект запроса (HttpServletRequest). Доступ к установленному JavaBean может осуществлять любая страница, доступная для запроса, т. е. пока клиент по-
Рис. 2.3. Область видимости встроенных объектов

Часть 2 Java Server Page 115
лучает ответ или клиентский запрос перенаправляется в другой
источник;
session — работать с bean можно во время всей сессии, аналогичен
•
указанию атрибута session в директиве page, полностью зависит от
сессий, являясь ее частью. В данном контексте JavaBean является
частью объекта HttpSession. JavaBean доступен для любого ресурса, используемого в сессии. Страница, на которой создается JavaBean, должна иметь значение true для атрибута session директивы
<%@ page%>;
application — указывает, что данный JavaBean находится в сис-
•
темном окружении приложения (servlet), т. е., любое другое приложение может использовать установленный JavaBean. При указа-
нии данного значения объект становится наиболее видимым.
По умолчанию значение атрибута scope всегда page.
Другие используемые атрибуты являются необязательными, и при
установке JavaBean обычно не инициализируются.
Атрибут class — устанавливает боб, используя ключевое слово new и
конструктор класса. Класс не должен быть абстрактным, и уровень доступа должен быть public. Конструктор класса должен быть без аргументов. Имя класса регистрозависимо, что является требованием языка
программирования Java.
Атрибут type — указывает тип переменных, находящихся в самом
классе или в родительском классе, от которого порожден данный боб
или интерфейс, реализуемый данным бобом. Значение атрибута должно
указывать имя класса или родительского класса, от которого порожден
JavaBean, указанный в атрибуте class. Если используется без указания
имени класса или имени JavaBean, экземпляр JavaBean не устанавливается.
Совмещенный атрибут class="pakage.class", type="package.class"-
данный атрибут совмещает два значения вышеперечисленных атрибутов.
Атрибут BeanName="package.class | <%= выражение %>" — уста-
навливает боб из указанного класса. При использовании данного выражения вызывается метод java.beans.Beans.instantate. Этот метод проверяет соответствие пакета и класса. type указывает интерфейс, реализованный данным бобом. Äëÿ использования методов bean они
обязательно должны существовать в классе, описывающем bean.
После установки JavaBean можно обращаться к данному объекту, ис-
пользуя атрибут id, указанный в теге <jsp:useBean>. Методы установленного bean можно использовать в скриплетах, а можно вызывать непосредственно из JSP-тегов, специально предусмотренных для установки и
получения параметров bean. Использование метода установки свойств
setXXX() осуществляется через тег <jsp:setProperty>. Для получения
свойств методами getXXX() используется тег <jsp:getProperty>.
Продублировать исполняемый класс JavaBean можно, воспользовав-
шись директивой <%@page%>. В принципе делать дубликат не имеет
большого смысла. Для того чтобы воспользоваться экземпляром JavaBean на данной странице, необходимо использовать директиву %@page%>

116 Часть 2 Java Server Page
с точно указанным именем класса у атрибута import <%@ page import=" com.rrlabs.bank.AccountBean" %>.
Одной из причин использования директивы может служить провер-
ка правильной установки класса JavaBean в момент трансляции. Дабы
не рыскать потом в поисках ошибки, перед началом установки JavaBean неплохо было бы проверить состояние переменной CLASSPATH на
наличие jar-архива, содержащего класс используемого JavaBean.
<%@ page import="com.rrlabs.Counter" %>
<jsp:useBean id="session_counter" class="" scope=" " />
<jsp:useBean id="app_counter" class="" scope=" " />
<% session_counter.increaseCount();
synchronized(page) {
app_counter.increaseCount();
}%>
<h3><jsp:getProperty name="" property="count" /></h3>
<p><h3>Total number of accesses:
<% synchronized(page) { %>
<jsp:getProperty name="" property="count" />
<% } %></h3>
Совместное использование директивы <%@page%> и отсутствие
указания класса в теге установки JavaBean приводит к использованию
импортированного класса в качестве основного класса, устанавливаемого JavaBean. Атрибуты scope по умолчанию всегда имеют значения page. Вторая (2) и третья (3) строки используются для создания различных копий одного JavaBean. Шестая (6) и десятая (10) строки работают
с одним и тем же методом JavaBean, при этом создаются два разных
объекта.
11.2. Получение свойств JavaBean, используя тег <jsp:getProperty>
Каждый сам по себе хорош, bean не исключение, но для того bean и
встраивается в JSP, дабы прогрессивное мировое сообщество узнало,
насколько хорош. Еще один принцип любви — мы должны узнать, что
наш объект самый лучший. Или, попросту говоря, получить свойства
объекта. Зачем может потребоваться вообще получать какие-либо свойства JavaBean? Как это ни странно звучит, все зависит от самого JavaBean. Bean по своей природе являются переносимыми элементами и могут выполнять любую задачу, от соединения с базой данных до формирования графической презентации в виде полноэкранного фильма.
Большая часть работы Web-приложения сводится к сравнению и передаче данных.
Тег <jsp:getProperty> предназначен для получения из свойств, со-
храненных в JavaBean и используемых затем в результирующей JSPстранице.
<jsp:getProperty name ="BeanName" property="propertyName">

Часть 2 Java Server Page 117
Прежде чем использовать <jsp:getProperty>, необходимо установить
Bean, у которого будут браться свойства, т. е. строчка с указанием боба
(Bean)<jsp:useBean> должна предшествовать <jsp:getProperty>. В спецификации указано несколько ограничений по использованию данного
тега, <jsp:getProperty> работает только с обычными бобами (JavaBean)
и не работает с Enterprise JavaBean. Для использования Enterprise JavaBean можно создать пользовательский тег, получающий значение из
директории или папки, содержащей EJB.
Еще одно ограничение <jsp:getProperty> связано с невозможностью
получить несколько свойств одновременно, если же получаемое свойство имеет знание null, то будет возбуждена исключительная ситуация
NullPointerException, если данное значение null является результатом
выражения, то оно будет отражено в браузере клиента.
<jsp:getProperty> имеет следующие атрибуты:
name="имя боба", из которого получаются свойства. Это имя должно
совпадать с именем боба, указанным в <jsp:useBean>
property="имя свойства", свойство JavaBean, отображенное в пользо-
вательском интерфейсе.
11.3. Установка свойств JavaBean при помощи тега <jsp:setProperty>
Устанавливать свойства JavaBean с помощью тега <jsp:setProperty>
двумя способами. Первый — использование тега установки свойств вне
тега установки JavaBean <jsp:useBean>.
<jsp:useBean id="myBean" ... />
<jsp:setProperty name="myName" property="someProperty" ... />
В случае такого использования установка средств выполняется неза-
висимо от того, является ли экземпляр JavaBean новым или же JavaBean представляет уже существующий экземпляр.
Второй способ использования тега установки свойств заключается в
помещении тега <jsp:setProperty> в тело тега установки JavaBean
<jsp:useBean>:
<jsp:useBean id="myName" ... >
<jsp:setProperty name="myName" property="someProperty" ... />
</jsp:useBean>
При таком использовании тегов инициализация выполняется только
для нового экземпляра JavaBean, даже в том случае, если копия JavaBean уже существует, вышеуказанный способ использования тегов инициализирует создание новой копии JavaBean.
Независимо от способа использования тегов атрибуты <jsp:setPro-
perty> не меняются. Основным атрибутом тега <jsp:setProperty> без
преувеличения, можно назвать name. Атрибут Name указывает JavaBean, свойства которого и будут изменяться. В теге <jsp:useBean> за эту
операцию отвечает атрибут id, это значит <jsp:useBean>.id = <jsp:setProperty>. name, это указывает на эквивалентность двух атрибутов у
различных тегов, указывающих на имя JavaBean.

118 Часть 2 Java Server Page
Итак, сам тег <jsp:setProperty>. имеет несколько конструкций с раз-
личными способами реализации свойств дополнительных атрибутов.
Можно использовать <jsp:setProperty> несколькими разными способами, можно использовать все значения, введенные пользователем, либо
часть из них, либо указать конкретное свойство.
<jsp:setProperty name="имя JavaBean" property="*"/>
<jsp:setProperty name="имя JavaBean" property= "имя Свойства" param="имя параметра"/>
<jsp:setProperty name="èìÿ JavaBean" property="имя Свойства" value="<%= выражение%>"/>
Откуда берутся параметры, используемые для передачи в JavaBean?
Самый простой ответ — из HTML-страницы, точнее, HTML-форм. Обработка HTML-форм описывается в главе 14. Остальные параметры могут либо вычисляться динамически, либо передаваться из других источников. Имя свойства боба должно совпадать с именем передаваемого параметра, обычно это название HTML-формы.
Первый из указанных выше вариантов, кроме атрибута name, содер-
жит атрибут property. Благодаря атрибуту property указываются те
свойства JavaBean, которые и будут устанавливаться. Property="*" сохраняет все значения, введенные пользователем на данной JSP-странице, как свойства боба. Имена свойств, сохраненные в JavaBean, должны
соответствовать именам свойств запрошенных параметров. Поскольку
значения параметров, посылаемых клиентом на сервер, всегда являются строкой (тип String), то необходимо конвертировать получаемые данные для правильной обработки и сохранения. Для конвертации входящих строковых параметров необходимо воспользоваться методами, предоставляемыми самой Java.
Таблица 2.1
Методы конвертации строковых значений (String) в примитивные типы
Тип свойства Методы для конвертации
Boolean java.lang.Boolean.valueOf(String)
Byte java.lang.Byte.valueOf(String)
Char java.lang..Character.valueOf(String)
Double java.lang.Double.valueOf(String)
Integer java.lang.Integer.valueOf(String)
Float java.lang.Float.valueOf(String)
Long java.lang.Long.valueOf(String)
Если параметр имеет пустое значение или null, то данное свойство
не помещается в боб для дальнейшей обработки.
Следующий способ заменяет атрибут property на param, значением
которого является имя передаваемого параметра. Это указывает на

Часть 2 Java Server Page 119
единственность передаваемого параметра. Отдельному свойству присваивается определенный параметр. Property="имя свойства" param="имя
передаваемого параметра" — здесь указывается одно конкретное свойство и передаваемое значение, которое будет присвоено свойству боба,
т. е. в боб помещается одно значение для обработки. При отсутствии у
передаваемого параметра каких-либо значений свойству bean ничего не
присваивается.
И наконец последний способ, рассматриваемый здесь, — присвоение
параметру вычисляемого значения.
Property="имя свойства "value=" <%= выражение %>" — присваи-
вает свойству специальное значение строкового типа или результат выражения. Если значение является строкой (тип String), то данное выражение необходимо конвертировать в соответствующий тип, используемый в bean для его свойства. Если это выражение, то его результат
должен иметь тип, который может обработать данный bean.
Нельзя использовать одновременно установку свойств <jsp:setPro-
perty> с двумя атрибутами param и value, должен использоваться
только один из них.
11.4 Перенаправление клиентского запроса в другой источник, тег
<jsp:forward>
Неисповедимы пути конспирации. Часто клиент должен быть ото-
слан к другому ресурсу, находящемуся совсем в другой точке земного
шара. И вот он бегает по URL. В JSP существует еще один способ избавиться от назойливого клиента переправить клиентский запрос поможет JSP тег <jsp:forward>. Тег <jsp:forward> имеет всего один атрибут
page, именно на этот рage будет отправлен клиент при использовании
тега в JSP. Значение атрибута page есть относительный путь URL к документу, который не обязательно должен быть JSP-страницей, этим ресурсом может быть также и HTML, и servlet, и масса других источников, указываемых через URL. Кроме всего прочего, URL, на который
посылается клиентский запрос может быть вычислен динамически:
<jsp:forward page="/error/errorReporter.jsp" />
<jsp:forward page="<%= someJavaExpression %>" />.
Использование встроенного тега <jsp:param> позволяет послать не
запрос, а определенные параметры клиентского запроса:
<jsp:forward page="URL | <%= выражение %> />
<jsp:param paramName=" username" value="user"/>
</jsp:forward>
Данная конструкция позволяет отправлять параметры на обработку
в другой файл, который может быть или servlet, или JSP, или любой
другой программой, способной обрабатывать данные параметры. Можно
использовать несколько передаваемых параметров. Для этого необходимо описать каждый из них в отдельном теге <jsp:param>. Важно учитывать соответствие именования передаваемых параметров, они долж-

120 Часть 2 Java Server Page
ны быть именованы так же, как они были переданы в JSP. При указании в директиве <%@page%> значения none атрибута buffer может
возникнуть исключительная ситуация, поскольку данные не кэшированы, то нечего будет перенаправлять, используя <jsp:forward>. Атрибут
Page тега <jsp:forward> указывает адрес перенаправления клиентского
запроса, который можно получить динамически, используя конструкцию выражения. Param определяет пересылаемые параметры для источника, способного обрабатывать данные параметры. При пересылке
нескольких параметров необходимо указать адекватное количество в
передаваемом теге <jsp:forward>.
11.5. Включение данных из других источников при использовании тега
<jsp:include>
Где-то уже мелькало подобное. В отличие от директивы (указания
транслятору) %@include%
, предназначенной для импортирования в
транслируемую страницу удаленных ресурсов, действия, определяемые
с помощью тега <jsp:include>, можно рассматривать как импортирование ресурса в момент поступления клиентского запроса:
<jsp:include page="relative URL" flush="true" />
<HTML>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<LI><jsp:include page="/Index1.html" flush="true"/>
<LI><jsp:include page="/Index2.html" flush="true"/>
<LI><jsp:include page="/Index3.html" flush="true"/>
<LI><jsp:include page="/Index4.html" flush="true"/>
</OL>
</BODY>
</HTML>
Тег <jsp:include>, в отличие от директивы-однофамильца, позволяет
включать в тело JSP-файла статические данные из других файлов или
посылать запрос для обработки динамическим файлом:
<jsp:include page ="url | <%= выражение %> " flush="true">
<jsp:param name=" имя параметра"
value=" значение праметра " | <%= выражение%> />
</jsp:include>
Именно возможность включать в исполняемый JSP-файл динамические данные отличает <jsp:include> от директивы <%@ include%>.
В результате включения динамических данных JSP перешлет часть
информации к странице, указанной в атрибуте Page тега <jsp:include>.
Результатом данной операции будет включение в исполняемый модуль
текста из статического файла или результат обработки запроса динамическим файлом. <jsp:include> полезен, когда неизвестно, какого характера включаемый ôàéë, динамический èëè статический. Тег
<jsp:include> работает с обоими типами файлов. Если файл способен
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
