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

Конкретно:



  • имя

    обязано быть уникальным в пределах трансляционного модуля и идентифицирует определённый элемент, в котором оно появляется в JSP-контейнере и странице. Дубликаты id, найденные в том же самом трансляционном модуле, приводят в фатальной ошибке времени трансляции.


  • JSP-контейнер будет ассоциировать объект (компонент JavaBean) с именованным значением и получать доступ по этому имени в различных контекстах через объект

    page-context, описанный далее в этой спецификации.


  • Это name используется также для экспонирования переменной (имени) в среде языка скриптинга. Область видимости переменной языка скриптинга зависит от правил видимости и возможностей языка скриптинга, используемого на этой странице.

    Заметьте, что это подразумевает, что синтаксис значения name обязан соответствовать синтаксическим правилам именования переменных языка скриптинга, используемого на этой странице.

    В детально рассматривается случай, когда атрибут 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.

    Содержание раздела