В этой главе описаны стандартные акции JavaServer Pages 1.2 (JSP 1.2).
<jsp:useBean>
Акция jsp:useBean
ассоциирует экземпляр объекта языка программирования Java,
определённый в данной области видимости/scope
и доступный с данным id
через вновь
объявленную переменную скриптинга с тем же id
.
Акция jsp:useBean
весьма гибка: её точная семантика зависит
от заданных атрибутов. Базовая семантика пытается найти
существующий объект, используя id
и область видимости.
Если объект не найден, будет сделана попытка создания этого
объекта с использованием других атрибутов.
Можно использовать эту акцию также для задания локального имени
объекту, определённому в другом месте,
например, в другой JSP-странице или
Сервлете. Это может быть выполнено с помощью атрибута
типа без предоставления атрибутов class
или
beanName
. Должен быть представлен как минимум тип или класс,
и неверным будет предоставление и class
,
и beanName
.
Если тип и класс имеются, class
обязан быть назначен типу (в понимании
Java-платформы). Невозможность его назначить является ошибкой времени трансляции.
Атрибут beanName
специфицирует имя Bean'а, как указано в спецификации JavaBeans. Оно
используется в качестве аргумента для метода instantiate()
класса java.beans.Beans
.
Оно обязано иметь форму "a.b.c" и может
быть именем класса или ресурса в форме "a/b/c.ser",
которое будет разрешено в текущем ClassLoader/ЗагрузчикеКлассов.
Если это не так, будет вызвано исключение
времени запроса, как указано в семантике instantiate()
.
Значением этого атрибута может быть выражение атрибута времени запроса.
Более детально о роли id
и scope
говорится далее.
id
Пара атрибут/значение id
="имя"
является элементом jsp:useBean
и имеет специальное значение для JSP-контейнера
во время трансляции страницы при обработке запроса клиента.
Конкретно:
id
, найденные в том же самом трансляционном
модуле, приводят в фатальной ошибке времени трансляции.Это name используется также для экспонирования переменной (имени) в среде языка скриптинга. Область видимости переменной языка скриптинга зависит от правил видимости и возможностей языка скриптинга, используемого на этой странице.
Заметьте, что это подразумевает, что синтаксис значения name
обязан соответствовать синтаксическим правилам именования
переменных языка скриптинга, используемого на этой странице.
В Главе JSP.6 детально рассматривается
случай, когда атрибут language
- "java"
.
Пример использования правил правил области видимости, только что упомянутых, дан здесь:
<% {
// вводится новый блок
%>
...
<jsp:useBean id="customer" class="com.myco.Customer" />
<%
/*
* тэг создаёт или получает ссылку на Customer Bean,
* ассоциирует её с именем "customer"
* в PageContext и объявляет переменную языка программирования Java
* с тем же именем, которое инициализировано для ссылки на объект
* в пределах видимости этого блока.
*/
%>
...
<%= customer.getName(); %>
...
<% } // закрывает блок %>
<%
// переменная customer находится сейчас вне области видимости ,
// но объект всё ещё действует (и доступ к нему осуществляется через PageContext)
%>
scope
Пара атрибут/значение scope="page|request|session|application"
ассоциирована с (и
модифицирует) поведением атрибута id
,
описанного выше (она (пара) имеет
семантику и времени трансляции, и времени процессинга запроса клиента).
Конкретнее, она описывает пространство имён, предполагаемый жизненный цикл ссылки на объект, ассоциированной
с name, и API, используемые для доступа к этой ассоциации, таким образом:
page
|
Именованный объект, доступный из javax.
для данной страницы.Эта ссылка должна быть уничтожена после выполнения текущего запроса телом страницы. Не допускается изменение объекта экземпляра, ассоциированного таким образом, что его (объекта?) тип времени прогона/выполнения является поднабором типа текущего объекта, ассоциированного ранее. |
request
|
Именованный объект, доступный из объекта ServletRequest текущей страницы через использование
метода getAttribute(name) .Эта ссылка должна быть уничтожена после выполнения текущего клиентского запроса. Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, что его (объекта?) тип времени прогона/выполнения является поднабором(-ами) типа объекта, ассоциированного ранее таким же образом. |
session
|
Именованный
объект, доступный из объекта HttpSession текущей страницы
(который, в свою очередь, может быть получен из объекта ServletRequest )
через использование методаgetAttribute(name) .Эта ссылка должна быть уничтожена после аннулирования текущей сессии. Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, чтобы его новый тип времени прогона был поднабором(-ами) типа объекта, ассоциированного ранее. Заметьте, что будет фатальной ошибкой трансляции попытка использовать область видимости сессии, когда JSP-страница, делающая эту попытку, объявляется через директиву <%@ page ... %>
(см. далее) так, что она не участвует в сессии. |
application
|
Именованный объект, доступный из объекта ServletContext
текущей страницы через использование метода getAttribute(name) .Эта ссылка должна быть уничтожена после использования ServletContext .Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, чтобы его новый тип времени прогона был поднабором(-ами) типа объекта, ассоциированного ранее таким же образом. |
Акциями, выполняемыми в jsp:useBean
, являются:
id
и scope
.
Синхронно выполняется проверка пространства имён области
видимости/scope
для исключения недетерминистического поведения.class
/класс
(если type
не задан) определяется с данным
id
в текущей лексической области видимости языка скриптинга.java.lang.ClassCastException
. Это завершает работу данной акции
jsp:useBean
.jsp:useBean
имел непустое тело/body, он игнорируется. Это завершает работу
данной акции jsp:useBean
.class
,
ни beanName
, должно возникать исключение
java.lang.InstantiationException
. Это завершает работу данной
акции jsp:useBean
.class
специфицировал имена неабстрактного класса, который
определяет публичный/public безаргументный конструктор,
тогда создаётся экземпляр этого класса.PageContext
). После этого выполняется шаг 7.java.lang.InstantiationException
.
Это завершает работу данной акции jsp:useBean
.beanName
,
тогда метод instantiate()
класса java.beans.Beans
будет вызван с Class-Loader/Загрузчиком-Классов объекта Servlet
и с beanName
в
качестве аргументов.PageContext
). После этого выполняется шаг 7.jsp:useBean
имеет непустое тело/body, оно
обрабатывается, переменная инициализируется и становится доступной в области видимости тела.
Текст внутри тела рассматривается как обычно. Любой шаблонный текст будет передан в поток вывода.
Тэги скриптлетов и акций вычисляются.jsp:setProperty
и скриптлеты,
которые вычисляются. Это завершает работу данной акции
jsp:useBean
.
В этом примере Bean с именем "connection" и типом "com.myco.myapp.Connection"
доступен после выполнения акций в этом элементе, или потому что он уже создан и найден, или потому что он
создан заново.
<jsp:useBean
id="connection" class="com.myco.myapp.Connection" />
В следующем примере свойство timeout устанавливается в 33, если Bean был инстанциирован.
<jsp:useBean
id="connection" class="com.myco.myapp.Connection">
<jsp:setProperty
name="connection" property="timeout" value="33">
>
</jsp:useBean
В последнем примере объект должен существовать в данной сессии.
Если это так, ему присваивается локальное имя wombat типа WombatType. Может возникать исключение
ClassCastException
, если это объект неверного класса,
а InstantiationException
может возникать, если объект не определён.
<jsp:useBean
id="wombat"
type
="my.WombatType" scope="session"/>
Эта акция может иметь или не иметь тело/body. Если акция не имеет тела, она имеет форму:
<jsp:useBean id="name" scope="page|request|session|application" typeSpec />
typeSpec ::=
class
="className" |
class
="className"type
="typeName" |
type
="typeName"class
="className" |
beanName
="beanName"type
="typeName" |
type
="typeName"beanName
="beanName" |
type
="typeName"
Если акция имеет тело, она имеет форму:
<jsp:useBean id="name" scope="page|request|session|application" typeSpec >
body
</jsp:useBean>
В этом случае тело тело будет вызвано, если Bean, обозначаемый этой акцией, создаётся.
Обычно body будет содержать тэги скриптлетов или jsp:setProperty
,
которые будут использоваться для модификации вновь созданного объекта, но содержимое тела не ограничивается.
Тэг
<jsp:useBean
>
имеет следующие атрибуты:
id
|
Имя, используемое для идентификации
экземпляра объекта в пространстве имён специфицированной области видимости, а
также имя переменной скриптинга, объявленное и инициализированное
вместе со ссылкой на этот объект. Специфицированное пространство имён чувствительно к регистру и должно соответствовать соглашениям текущего языка скриптинга по именованию переменных. |
scope
|
Область видимости/scope ,
в зоне которой ссылка доступна. Значение по умолчанию - page.См. описание атрибута scope ,
определённого ранее здесь же. |
class
|
Полное
квалифицированное имя класса, определяющего реализацию объекта. Имя класса чувствительно к регистру. Если атрибуты class и beanName
не специфицированы, объект обязан быть представлен в данной области видимости.
|
beanName
|
Имя для Bean, как предполагается методом instantiate()
класса java.beans.Beans . Этот атрибут может принимать в
качестве значения выражение атрибута времени запроса. |
type
|
Если специфицирован, определяет тип переменной скриптинга. Это позволяет типу переменной скриптинга отличаться от (но соотноситься с) типа специфицированного класса реализации. Тип должен быть самим классом, суперклассом этого класса, либо интерфейсом, реализованным специфицированным классом. Объект, на который ссылаются, должен быть этого типа, иначе должно возникать исключение java.lang. во время
запроса, когда делается попытка назначения объекта, на который ссылаются, переменной скриптинга.Если не специфицировано, значение будет тем же, что и значение атрибута class . |
<jsp:setProperty>
Акция jsp:setProperty
устанавливает значения свойств в Bean'е.
Атрибут name
, обозначающий этот Bean,
обязан быть определён до появления этой акции.
Имеются два варианта акции jsp:setProperty
.
Оба они устанавливают значение одного или более свойств в Bean
на базе типа свойств. Обычно в Bean
выполняется самоанализ с целью обнаружения существующих свойств,
и, для каждого из них, имени,
простое оно или индексированное, его типа и методов
setter
и getter
. Самоанализ также указывает,
имеет ли тип данного свойства класс PropertyEditor
.
Свойства в Bean могут быть установлены из одного или более параметров объекта request
, из
String-константы или из вычисленного выражения времени запроса. Простые и
индексированные свойства могут быть установлены с использованием
jsp:setProperty
.
При установке из параметра объекта request
применяется конвертация,
описанная в Разделе JSP.2.13.2.1, использующая целевое свойство для определения
целевого типа.
При присвоении из значения, заданного как String-константа, применяется
конвертация, описанная в Разделе JSP.2.13.2.1, использующая целевое свойство для
определения целевого типа.
При присвоении из значения, заданного как атрибут времени запроса, никакая
конвертация типов не применяется, как указано в Разделе
JSP.2.13.2.3.
При присвоении значений индексированным свойствам значение обязано быть
массивом/array; к элементам применяются правила, описанные в предыдущем
параграфе. Неудача конверсии приводит к ошибке времени трансляции или времени
запроса.
Следующие два элемента устанавливают значение из значений параметра request
:
<jsp:setProperty name="request" property="*" />
<jsp:setProperty name="user" property="user" param
="username" />
Следующие два элемента устанавливают свойство из значения:
<jsp:setProperty name="results" property="row" value="<%= i+1 %>" />
<jsp:setProperty name="beanName" prop_expr />
prop_expr ::=
property="*" |
property="propertyName"|
property="propertyName" param
="parameterName"|
property="propertyName" value="propertyValue"
propertyValue ::= string
Значение propertyValue может также быть значением атрибута времени
запроса, как описано в Разделе JSP.2.13.1.
propertyValue ::= expr_scriptlet
(См. синтаксис скриптлета выражения
"<%= ... %>"
)
Элемент <jsp:setProperty>
имеет следующие атрибуты:
name
|
Имя экземпляра Bean'а, определённое элементом <jsp:useBean>
или каким-либо другим элементом.Экземпляр Bean'а обязан содержать свойство, которое Вы хотите установить. Определяющий элемент обязан появиться до элемента <jsp:setProperty> в том же файле. |
property
|
Имя свойства Bean'а, значение которого Вы хотите установить. Если Вы устанавливаете propertyName в
*, тогда тэг будет выполнять итерацию поверх текущих параметров
ServletRequest , подбирая совпадения имён параметров и типа(-ов)
значений с именами свойств и типом(-ами) метода setter ,
устанавливая каждое совпавшее свойство в значение совпадающего параметра.Если параметр имеет значение "", соответствующее свойство не модифицируется. |
param
|
Имя параметра запроса, значение которого Вы хотите дать
свойству Bean'а. Имя параметра запроса приходит обычно от web-формы. Если param опущен, принимается, что имя параметра запроса - то
же самое, что и имя свойства Bean'а.Если param не установлен в объекте
Request или если он имеет значение "", элемент
jsp:setProperty не оказывает влияния (a noop - шо цэ такэ?).Акция может не иметь атрибутов param и value . |
value
|
Значение, присваиваемое данному свойству. |
<jsp:getProperty>
Акция <
помещает значение свойства экземпляра
Bean'а, конвертированное к String, в неявный объект вывода, из которого Вы можете отобразить значение в качестве
вывода. Экземпляр Bean'а обязан быть определён так, как указано в атрибуте
jsp:getProperty
>name
до этой точки страницы (обычно посредством акции jsp:useBean
).
Конверсия к String выполняется также, как в методах
println()
, т.е. метод toString()
данного объекта
применяется для экземпляров Object
, а примитивные типы конвертируются напрямую.
Если объект не найден, вызывается исключение времени запроса.
Значение атрибута name
в jsp:setProperty
и
jsp:getProperty
будет ссылаться на объект, который получен из
объекта PageContext
с помощью его метода
findAttribute()
.
Объект, именованный посредством name
, обязан быть "представлен" JSP-процессору
путём использования акции
jsp:useBean
или специальной акции с ассоциированным входом VariableInfo
для данного имени.
Примечание
: из предыдущего параграфа следует, что объекты,
хранимые, скажем, в сессии лицевым/front компонентом, не являются автоматически видимыми акциям
jsp:set-Property
и
jsp:getProperty
на данной странице, если только акция
jsp:useBean
или какая-нибудь другая не делает их видимыми.
Если JSP-процессор может убедиться, что имеется альтернативный способ,
гарантирующий доступ к тому же объекту, он может использовать эту информацию.
Например, он может использовать переменную скриптинга, но он обязан
гарантировать, что никакой вставляемый код не нарушит копию, хранимую переменной
скриптинга. Верным всегда будет значение, содержащееся объектом PageContext
.
<jsp:getProperty name="user" property="name" />
<jsp:getProperty name="name" property="propertyName" />
name
|
Имя экземпляра объекта, из которого получено свойство. |
property
|
Именует получаемое свойство. |
<jsp:include>
Элемент <jsp:include .../>
предоставляется для включения статических
и динамических ресурсов в тот же контекст, что и у текущей страницы. См. в
Таблице JSP.2-1 резюме по облегчению включения.
Включение производится в текущее значение out/вывода.
Этот ресурс специфицирован путём использования relativeURLspec/спецификации
относительного URI, которая интерпретируется в
контексте web-сервера (т.е. она отображается/mapped).
Атрибуты page
акций
jsp:include
и jsp:forward
интерпретируются
относительно текущей
JSP-страницы, поскольку атрибут
file
в директиве include
интерпретируется относительно текущего JSP-файла.
См. ниже примеры таких комбинаций.
Включаемая страница имеет доступ только к объекту
JspWriter
и не может устанавливать шапки/headers. Это предотвращает вызов
методов, подобных setCookie()
.
Попытки вызова таких методов будут игнорироваться. Это ограничение эквивалентно
ограничению, вводимому методом include()
класса RequestDispatcher
.
Акция jsp:include
может иметь субэлементы jsp:param
,
которые могут предоставлять значения некоторым параметрам в запросе для
использования в процессе включения.
Процессинг запроса продолжается вызовом JSP-страницы, после того как включение выполнено.
Атрибут flush
управляет очисткой. Если он true
, тогда, если вывод
страницы буферизуется и атрибут flush
получает значение 'true',
буфет очищается до включения, в ином случае буфер не очищается. По умолчанию
атрибут flush
имеет значение 'false'.
<jsp:include page="/templates/copyright.html"/>
Вышеприведённый пример - это простое включение объекта. Путь интерпретируется
в контексте Web-Приложения. Это похоже на static/статичный объект, но он может
также отображаться в, например,
Servlet
посредством web.xml.
Например, в качестве более сложного набора включений рассмотрим следующие 4
ситуации, построенные с использованием 4
JSP-файлов: A.jsp, C.jsp, dir/B.jsp и dir/C.jsp:
<%@ include file="dir/B.jsp"%>
, а
dir/B.jsp говорит <%@ include file="C.jsp"%>
.<jsp:include page="dir/B.jsp"/>
, а dir/B.jsp говорит <jsp:include
page="C.jsp" />
.<%@ include file="dir/B.jsp"%>
, а dir/B.jsp говорит <jsp:include
page="C.jsp"/>
.
<jsp:include page="urlSpec" flush="true|false"/>
и
<jsp:include page="urlSpec" flush="true|false">
{ <jsp:<code></code> .... /> }*
</jsp:include>
В первом примере синтаксиса выполняется включение на этапе запроса.
Во втором случае значения в субэлементах param
используются для увеличения запроса с целью включения.
Верными атрибутами являются:
page
|
Этот URL является относительным urlSpec,
как указано в Разделе JSP.2.2.1. Относительные пути интерпретируются относительно текущей JSP-страницы. Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL). |
flush
|
Необязательный булев атрибут. Если "true", буфер немедленно очищается. По умолчанию - "false". |
<jsp:forward>
Элемент <jsp:forward page="urlSpec" />
позволяет направлять на этапе
прогона текущий запрос статическому ресурсу - JSP-странице или Java-классу Servlet
в том же контексте, что и текущая страница.
jsp:forward
эффективно прерывает выполнение текущей страницы.
Относительный
urlSpec - как в Разделе JSP.2.2.1. Объект запроса будет настроен в
соответствии со значением атрибута
page
.
Акция jsp:forward
может иметь субэлементы jsp:param
,
которые могут предоставлять значения для некоторых параметров запроса,
используемых для перенаправления.
Если вывод страницы буферизуется, то буфер очищается перед перенаправлением.
Если вывод страницы буферизуется и буфер был очищен, то попытка направить запрос
вызовет исключение
IllegalStateException
.
Если вывод страницы не буферизовался и в него что-то
было записано, то попытка направить запрос вызовет исключение
IllegalStateException
.
Следующий элемент может использоваться для направления статической странице, на
базе некоторого динамического условия.
<% String whereTo = "/templates/"+someValue; %>
<jsp:forward page='<%= whereTo %>' />
<jsp:forward
page="relativeURLspec" />
и
<jsp:forward page="urlSpec">
{ <jsp:param .... /> }*
</jsp:forward>
Этот тэг позволяет автору страницы осуществлять воздействие на процессинг
текущего запроса специфицированными атрибутами:
page
|
URL является относительным urlSpec, как указано в
Разделе JSP.2.2.1. Относительные пути интерпретируются относительно текущей JSP-страницы.
Принимает атрибут времени запроса |
<jsp:param>
Элемент jsp:param
используется для предоставления информации ключ/значение.
Этот элемент используется в элементах
jsp:include, jsp:forward
и jsp:params
. Должна
вызываться ошибка времени трансляции, если этот элемент используется в другом
месте.
При выполнении jsp:include
или jsp:forward
,
включаемая страница или перенаправляемая страница будет просматривать оригинал
объекта запроса с оригинальными параметрами, дополненными новыми параметрами с
новыми значениями, имеющими приоритет над существующими значениями, где это
нужно.
Областью видимости новых параметров является вызов jsp:include
или jsp:forward
; т.е., в случае с
jsp:include
- новые параметры (и значения)
не будут применяться после включения. Это то же поведение, что и при использовании
методов include
и forward
в ServletRequest
(см.
Раздел 8.1.1 в спецификации Servlet 2.2).
Например, если запрос имеет параметр A=foo, и параметр A=bar специфицирован для
перенаправления, направляемый запрос должен будет сдержать A=bar,foo. Обратите
внимание, что новый param
имеет приоритет.
<jsp:param name="name"
value="value" />
Эта акция имеет два мандатных/обязательных атрибута: name
и value
.
Name
это имя параметра, а
value
, которое может быть выражением времени запроса, это его
значение.
<jsp:plugin>
Акция plugin
даёт автору JSP-страниц возможность генерировать HTML,
содержащий соответствующие клиентскому браузеру конструкции (OBJECT или EMBED),
которые приводят к загрузке компонента Java
Plugin (если это необходимо) и последующему выполнению специфицированного
компонента Applet или JavaBeans.
Тэг <jsp:plugin>
замещается тэгом <object>
или <embed>
- как больше подходит для запрашивающего
Пользовательского Агента (ПА) - и выводится в поток вывода ответа/response.
Атрибуты тэга
<jsp:plugin>
предоставляют данные конфигурации для
представления элемента, как показано далее в таблице.
Элементы <jsp:param>
это параметры компонентов Applet или JavaBeans.
Элемент <jsp:fallback>
это содержимое, используемое
клиентским браузером, если компонент plugin не может стартовать (из-за того, что OBJECT
или EMBED не поддерживаются клиентским браузером, либо по каким-то другим
причинам).
Если plugin может стартовать, но компонент Applet или JavaBeans
не может быть найден или не может стартовать, то сообщение, специфическое для
данного plugin, будет показано пользователю: вероятнее всего - всплывающее окно,
содержащее ClassNotFoundException
.
Реальный код plugin
не должен быть связан с JSP-контейнером. Ссылка на место
размещения plugin'а Sun может использоваться
вместо этого, хотя некоторые продавцы ПО предпочитают включать plugin
для
удобства пользователя.
<jsp:plugin type=applet code="Molecule.class" codebase="/html" >
<jsp:params>
<jsp:param
name="molecule"
value="molecules/benzene.mol"/>
</jsp:params>
<jsp:fallback>
<p> unable to start plugin </p>
</jsp:fallback>
</jsp:plugin>
<jsp:plugintype="bean|applet"
code="objectCode"
codebase="objectCodebase"
{ align="alignment" }
{ archive="archiveList" }
{ height="height" }
{ hspace="hspace" }
{ jreversion="jreversion" }
{ name="componentName" }
{ vspace="vspace" }
{ width="width" }
{ nspluginurl="url" }
{ iepluginurl="url" } >
{ <jsp:params>
{ <jsp:<code></code> name="paramName" value="paramValue" /> }+
</jsp:params> }
{ <jsp:fallback> arbitrary_text </jsp:fallback> }
</jsp:plugin>
type
|
Идентифицирует тип компонента: Bean или Applet. |
code
|
Как определено в HTML. |
codebase
|
Как определено в HTML. |
align
|
Как определено в HTML. |
archive
|
Как определено в HTML. |
height
|
Как определено в HTML. Принимает значение выражения времени прогона программы. |
hspace
|
Как определено в HTML. |
jreversion
|
Идентифицирует номер версии JRE, необходимый компоненту для работы; по умолчанию: "1.2" |
name
|
Как определено в HTML. |
vspace
|
Как определено в HTML. |
title
|
Как определено в HTML. |
width
|
Как определено в HTML. Принимает значение выражения времени прогона программы. |
nspluginurl
|
URL, с которого JRE-plugin может быть загружен для использования в Netscape Navigator, по умолчанию - определяется реализацией. |
iepluginurl
|
URL, с которого JRE-plugin может быть загружен для использования в IE, по умолчанию - определяется реализацией. |
<jsp:params>
Акция jsp:params
является частью акции jsp:plugin
и
может появляться только как прямой потомок элемента <jsp:plugin>
.
Использование элемента jsp:params
в любом ином контексте должно
приводит к ошибке времени трансляции.
Семантика и синтаксис jsp:params
описаны в Разделе JSP.4.7.
<jsp:fallback>
Акция jsp:fallback
является частью акции jsp:plugin
и
может появляться только как прямой потомок элемента <jsp:plugin>
.
Использование элемента jsp:fallback
в любом ином контексте должно
приводит к ошибке времени трансляции.
Семантика и синтаксис jsp:fallback
описаны в Разделе
JSP.4.7.