Глава JSP.4

Стандартные Акции


В этой главе описаны стандартные акции JavaServer Pages 1.2 (JSP 1.2).

JSP.4.1 <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-контейнера во время трансляции страницы при обработке запроса клиента.

Конкретно:

Это 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, используемые для доступа к этой ассоциации, таким образом:

Таблица JSP.4-1
page Именованный объект, доступный из javax.Servlet.jsp.PageContext для данной страницы.
Эта ссылка должна быть уничтожена после выполнения текущего запроса телом страницы.
Не допускается изменение объекта экземпляра, ассоциированного таким образом, что его (объекта?) тип времени прогона/выполнения является поднабором типа текущего объекта, ассоциированного ранее.
request Именованный объект, доступный из объекта ServletRequest текущей страницы через использование метода getAttribute(name).
Эта ссылка должна быть уничтожена после выполнения текущего клиентского запроса.
Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, что его (объекта?) тип времени прогона/выполнения является поднабором(-ами) типа объекта, ассоциированного ранее таким же образом.
session Именованный объект, доступный из объекта HttpSession текущей страницы (который, в свою очередь, может быть получен из объекта ServletRequest) через использование методаgetAttribute(name).
Эта ссылка должна быть уничтожена после аннулирования текущей сессии.
Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, чтобы его новый тип времени прогона был поднабором(-ами) типа объекта, ассоциированного ранее.
Заметьте, что будет фатальной ошибкой трансляции попытка использовать область видимости сессии, когда JSP-страница, делающая эту попытку, объявляется через директиву <%@ page ... %> (см. далее) так, что она не участвует в сессии.
application Именованный объект, доступный из объекта ServletContext текущей страницы через использование метода getAttribute(name).
Эта ссылка должна быть уничтожена после использования ServletContext.
Не допускается изменение значения объекта экземпляра, ассоциированного таким образом, чтобы его новый тип времени прогона был поднабором(-ами) типа объекта, ассоциированного ранее таким же образом.
Семантика


Акциями, выполняемыми в jsp:useBean, являются:

  1. Попытка локализовать объект на базе значениях атрибутов id и scope. Синхронно выполняется проверка пространства имён области видимости/scope для исключения недетерминистического поведения.
    Переменная языка скриптинга специфицированного типа (если задан) или class/класс (если type не задан) определяется с данным id в текущей лексической области видимости языка скриптинга.
  2. Если этот объект найден, значение переменной инициализируется ссылкой на локализованный объект, приведённый к специфицированному типу. Если приведение терпит неудачу, должно возникать исключение java.lang.ClassCastException . Это завершает работу данной акции jsp:useBean.
  3. Если элемент jsp:useBean имел непустое тело/body, он игнорируется. Это завершает работу данной акции jsp:useBean.
  4. Если объект не найден в специфицированной области видимости и не заданы ни class, ни beanName, должно возникать исключение java.lang.InstantiationException. Это завершает работу данной акции jsp:useBean.
  5. Если объект не найден в специфицированной области видимости и класс/class специфицировал имена неабстрактного класса, который определяет публичный/public безаргументный конструктор, тогда создаётся экземпляр этого класса.
    Ссылка на новый объект ассоциируется с переменной скриптинга и со специфицированным именем в специфицированной области видимости через использование подходящей области видимости, в зависимости от механизма ассоциирования (см. PageContext). После этого выполняется шаг 7.
    Если объект не найден и класс является абстрактным классом, интерфейсом или не определён public безаргументный/no-args конструктор, тогда должно возникать исключение java.lang.InstantiationException. Это завершает работу данной акции jsp:useBean.
  6. Если объект не найден в специфицированной области видимости и задано имя beanName, тогда метод instantiate() класса java.beans.Beans будет вызван с Class-Loader/Загрузчиком-Классов объекта Servlet и с beanName в качестве аргументов.
    Если метод выполнен успешно, новая ссылка на объект ассоциируется с переменной скриптинга и со специфицированным именем в специфицированной области видимости через использование подходящей области видимости, в зависимости от механизма ассоциирования (см. PageContext). После этого выполняется шаг 7.
  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> имеет следующие атрибуты:

Таблица JSP.4-1
id Имя, используемое для идентификации экземпляра объекта в пространстве имён специфицированной области видимости, а также имя переменной скриптинга, объявленное и инициализированное вместе со ссылкой на этот объект.
Специфицированное пространство имён чувствительно к регистру и должно соответствовать соглашениям текущего языка скриптинга по именованию переменных.
scope Область видимости/scope, в зоне которой ссылка доступна. Значение по умолчанию - page.
См. описание атрибута scope, определённого ранее здесь же.
class Полное квалифицированное имя класса, определяющего реализацию объекта.
Имя класса чувствительно к регистру.
Если атрибуты class и beanName не специфицированы, объект обязан быть представлен в данной области видимости.
beanName Имя для Bean, как предполагается методом instantiate() класса java.beans.Beans. Этот атрибут может принимать в качестве значения выражение атрибута времени запроса.
type Если специфицирован, определяет тип переменной скриптинга.
Это позволяет типу переменной скриптинга отличаться от (но соотноситься с) типа специфицированного класса реализации.
Тип должен быть самим классом, суперклассом этого класса, либо интерфейсом, реализованным специфицированным классом.
Объект, на который ссылаются, должен быть этого типа, иначе должно возникать исключение java.lang.ClassCastException во время запроса, когда делается попытка назначения объекта, на который ссылаются, переменной скриптинга.
Если не специфицировано, значение будет тем же, что и значение атрибута class.

JSP.4.2 <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> имеет следующие атрибуты:

Таблица JSP.4-2
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

Значение, присваиваемое данному свойству.
Этот атрибут может принимать выражение атрибута времени запроса в качестве значения.
Акция может не иметь атрибутов param и value.

JSP.4.3 <jsp:getProperty>

Акция <jsp:getProperty> помещает значение свойства экземпляра Bean'а, конвертированное к String, в неявный объект вывода, из которого Вы можете отобразить значение в качестве вывода. Экземпляр Bean'а обязан быть определён так, как указано в атрибуте 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" />

Таблица JSP.4-3 Атрибуты
name Имя экземпляра объекта, из которого получено свойство.
property Именует получаемое свойство.

JSP.4.4 <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:

Синтаксис
 

<jsp:include page="urlSpec" flush="true|false"/>

и

<jsp:include page="urlSpec" flush="true|false">

{ <jsp:<code></code> .... /> }*

</jsp:include>
 

В первом примере синтаксиса выполняется включение на этапе запроса.

Во втором случае значения в субэлементах param используются для увеличения запроса с целью включения.


Верными атрибутами являются:

Таблица JSP.4-4
page Этот URL является относительным urlSpec, как указано в Разделе JSP.2.2.1.
Относительные пути интерпретируются относительно текущей JSP-страницы.
Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL).
flush Необязательный булев атрибут. Если "true", буфер немедленно очищается. По умолчанию - "false".

JSP.4.5 <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>


Этот тэг позволяет автору страницы осуществлять воздействие на процессинг текущего запроса специфицированными атрибутами:

Таблица JSP.4-5
page URL является относительным urlSpec, как указано в Разделе JSP.2.2.1.
Относительные пути интерпретируются относительно текущей JSP-страницы.

Принимает атрибут времени запроса value (который обязан вычисляться до String, которая является спецификацией относительного URL).

JSP.4.6 <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.4.6.1 Синтаксис
 

<jsp:param name="name" value="value" />
 

Эта акция имеет два мандатных/обязательных атрибута: name и value.
Name это имя параметра, а value, которое может быть выражением времени запроса, это его значение.

JSP.4.7 <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>

Таблица JSP.4-1
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.4.8 <jsp:params>

Акция jsp:params является частью акции jsp:plugin и может появляться только как прямой потомок элемента <jsp:plugin>.

Использование элемента jsp:params в любом ином контексте должно приводит к ошибке времени трансляции.

Семантика и синтаксис jsp:params описаны в Разделе JSP.4.7.

JSP.4.9 <jsp:fallback>

Акция jsp:fallback является частью акции jsp:plugin и может появляться только как прямой потомок элемента <jsp:plugin>.

Использование элемента jsp:fallback в любом ином контексте должно приводит к ошибке времени трансляции.

Семантика и синтаксис jsp:fallback описаны в Разделе JSP.4.7.