Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

JAVA. Серверные приложения

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
2 Мб
Скачать
Часть 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 — программные компоненты, т. е. часть программы, изоли­рованная в отдельном элементе с целью повторного использования. Ja­vaBean представляют собой графические элементы, надстраиваемые над программой. Каждый JavaBean обладает свойствами, обрабатывает какие-либо события и конечно же имеет методы по работе с данными. Именно использование JavaBean превращает JSP в полнофункциональ-
Часть 2 Java Server Page 113
ное приложение. При установке JavaBean в JSP используется метод Beans.instantiate () из серилизованного (.ser файл). В противном случае вызывается метод newInstance () для создания нового экземпляра Java­Bean. В отличие от остальных тегов, <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-страницу. В этом случае обработкой ошибки невозможности создания класса Ja­vaBean администратор системы будет оповещен через страницу с ука­занной директивой 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 представлен как объект запроса (HttpSer­vletRequest). Доступ к установленному JavaBean может осуществ­лять любая страница, доступная для запроса, т. е. пока клиент по-
Рис. 2.3. Область видимости встроенных объектов
Часть 2 Java Server Page 115
лучает ответ или клиентский запрос перенаправляется в другой источник;
session — работать с bean можно во время всей сессии, аналогичен
указанию атрибута session в директиве page, полностью зависит от сессий, являясь ее частью. В данном контексте JavaBean является частью объекта HttpSession. JavaBean доступен для любого ресур­са, используемого в сессии. Страница, на которой создается Java­Bean, должна иметь значение 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%>. В принципе делать дубликат не имеет большого смысла. Для того чтобы воспользоваться экземпляром JavaBe­an на данной странице, необходимо использовать директиву %@page%>
116 Часть 2 Java Server Page
с точно указанным именем класса у атрибута import <%@ page im­port=" com.rrlabs.bank.AccountBean" %>.
Одной из причин использования директивы может служить провер-
ка правильной установки класса JavaBean в момент трансляции. Дабы не рыскать потом в поисках ошибки, перед началом установки JavaBe­an неплохо было бы проверить состояние переменной 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 по умолчанию всегда имеют значения pa­ge. Вторая (2) и третья (3) строки используются для создания различ­ных копий одного JavaBean. Шестая (6) и десятая (10) строки работают с одним и тем же методом JavaBean, при этом создаются два разных объекта.
11.2. Получение свойств JavaBean, используя тег <jsp:getProperty>
Каждый сам по себе хорош, bean не исключение, но для того bean и
встраивается в JSP, дабы прогрессивное мировое сообщество узнало, насколько хорош. Еще один принцип любви — мы должны узнать, что наш объект самый лучший. Или, попросту говоря, получить свойства объекта. Зачем может потребоваться вообще получать какие-либо свой­ства JavaBean? Как это ни странно звучит, все зависит от самого Java­Bean. 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 Ja­vaBean можно создать пользовательский тег, получающий значение из директории или папки, содержащей 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 новым или же JavaBe­an представляет уже существующий экземпляр.
Второй способ использования тега установки свойств заключается в
помещении тега <jsp:setProperty> в тело тега установки JavaBean <jsp:useBean>:
<jsp:useBean id="myName" ... > <jsp:setProperty name="myName" property="someProperty" ... /> </jsp:useBean>
При таком использовании тегов инициализация выполняется только
для нового экземпляра JavaBean, даже в том случае, если копия Java­Bean уже существует, вышеуказанный способ использования тегов ини­циализирует создание новой копии JavaBean.
Независимо от способа использования тегов атрибуты <jsp:setPro-
perty> не меняются. Основным атрибутом тега <jsp:setProperty> без преувеличения, можно назвать name. Атрибут Name указывает JavaBe­an, свойства которого и будут изменяться. В теге <jsp:useBean> за эту операцию отвечает атрибут id, это значит <jsp:useBean>.id = <jsp:set­Property>. name, это указывает на эквивалентность двух атрибутов у различных тегов, указывающих на имя JavaBean.
118 Часть 2 Java Server Page
Итак, сам тег <jsp:setProperty>. имеет несколько конструкций с раз-
личными способами реализации свойств дополнительных атрибутов. Можно использовать <jsp:setProperty> несколькими разными способа­ми, можно использовать все значения, введенные пользователем, либо часть из них, либо указать конкретное свойство.
<jsp:setProperty name="имя JavaBean" property="*"/> <jsp:setProperty name="имя JavaBean" property= "имя Свойства" pa­ram="имя параметра"/> <jsp:setProperty name="èìÿ JavaBean" property="имя Свойства" va­lue="<%= выражение%>"/>
Откуда берутся параметры, используемые для передачи в 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> работает с обоими типами файлов. Если файл способен