Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Связывание значений компонентов и объектов со свойствами Managed-бина

Тег компонента может связать свои данные с Managed-бином одним из следующих способов:

  • Привязка значения его компонента к свойству бина

  • Привязка объекта компонента к свойству бина

Чтобы связать значение компонента со свойством Managed-бина, атрибут value тега компонента использует выражение значения EL. Чтобы связать объект компонента со свойством бина, атрибут binding тега компонента использует выражение значения.

Когда объект компонента привязан к свойству Managed-бина, свойство содержит локальное значение компонента. И наоборот, когда значение компонента привязано к свойству Managed-бина, свойство содержит значение, хранящееся в Managed-бине. Это значение обновляется локальным значением в фазе обновления значений модели модели жизненного цикла. У обоих этих методов есть свои преимущества.

Привязка объекта компонента к свойству компонента имеет следующие преимущества.

  • Managed-бин может программно изменять атрибуты компонента.

  • Managed-бин может создавать компоненты, а не позволять автору страницы делать это.

Привязка значения компонента к свойству компонента имеет следующие преимущества.

  • Автор страницы имеет больший контроль над атрибутами компонента.

  • Managed-бин не имеет зависимостей от API JavaServer Faces (например, классов компонентов), что позволяет лучше отделить уровень представления от уровня модели.

  • JavaServer Faces может выполнять конвертацию данных на основе типа свойства бина, при этом разработчику не требуется применять конвертер.

В большинстве случаев вы будете привязывать значение компонента, а не его объект, к свойству компонента. Вам нужно будет использовать привязку компонента только тогда, когда вам нужно динамически изменить один из атрибутов компонента. Например, если приложение отображает компонент только при определённых условиях, оно может соответствующим образом установить свойство rendered компонента, получив свойство, к которому привязан компонент.

При ссылке на свойство с помощью атрибута value тега компонента необходимо использовать правильный синтаксис. Для примера предположим, что Managed-бин с именем MyBean имеет это свойство типа int:

protected int currentOption;
public int getCurrentOption(){...}
public void setCurrentOption(int option){...}

Атрибут value, который ссылается на это свойство, должен иметь выражение привязки значения:

#{myBean.currentOption}

Помимо привязки значения компонента к свойству бина атрибут value может указывать литерал или отображать данные компонента в любой примитив (например, int), структуру (например, массив) или коллекцию (например, список), независимо от компонента JavaBeans. Таблица 15-3 перечисляет некоторые примеры выражений привязки значений, которые могут использоваться с атрибутом value.

Таблица 15-3 Примеры выражений привязки значений

Значение

Выражение

Логическое

cart.numberOfItems > 0

Свойство, инициализированное контекстным параметром

initParam.quantity

Свойство бина

cashierBean.name

Значение в массиве

books[3]

Значение в коллекции

books["fiction"]

Свойство объекта в массиве объектов

books[3].price

В следующих двух разделах объясняется, как использовать атрибут value для привязки значения компонента к свойству компонента или другим объектам данных и как использовать атрибут binding для привязки объекта компонента в свойство бина.

Связывание значения компонента со свойством

Чтобы связать значение компонента со свойством Managed-бина, укажите имя компонента и свойство с помощью атрибута value.

Это означает, что первая часть выражения значения EL должна соответствовать имени Managed-бина до первого периода (.), а часть выражения значения после периода должна соответствовать свойству объекта Managed-бина.

Например, в примере Duke's Bookstore тег h:dataTable в bookcatalog.xhtml устанавливает значение компонента равным значению books свойства вспомогательного бина BookstoreBean с именем store:

<h:dataTable id="books"
             value="#{store.books}"
             var="book"
             headerClass="list-header"
             styleClass="list-background"
             rowClasses="list-row-even, list-row-odd"
             border="1"
             summary="#{bundle.BookCatalog}">

Это значение получается путём вызова метода getBooks вспомогательного бина, который в свою очередь вызывает метод getBooks сессионного бина BookRequestBean.

Если вы используете файл конфигурации приложения для настройки Managed-бинов вместо определения их в классах Managed-бинов, имя бина в выражении value должно соответствовать элементу managed-bean-name объявления Managed-бина до первого появления . в выражении. Аналогично, часть выражения значения после точки должна соответствовать имени, указанному в соответствующем элементе property-name в файле конфигурации приложения.

Например, рассмотрим конфигурацию Managed-бина, которая настраивает компонент ImageArea, соответствующий верхней левой книге в карте изображения на странице index.html в примере Duke’s Bookstore:

<managed-bean eager="true">
    ...
    <managed-bean-name>Book201</managed-bean-name>
    <managed-bean-class>dukesbookstore.model.ImageArea</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
    <managed-property>
        ...
        <property-name>shape</property-name>
        <value>rect</value>
    </managed-property>
    <managed-property>
        ...
        <property-name>alt</property-name>
        <value>Duke</value>
    </managed-property>
    ...

В этом примере настраивается компонент с именем Book201, который имеет несколько свойств, одно из которых называется shape.

Хотя теги bookstore:area на странице index.xhtml не привязываются к свойству ImageArea (они привязываются к самому компоненту), вы можете ссылаться на свойство, используя выражение значения из атрибута value тега компонента:

<h:outputText value="#{Book201.shape}" />

Смотрите Настройка Managed-бинов для получения информации о том, как настроить бины в файле конфигурации приложения.

Связывание значения компонента со внутренним объектом

Один внешний источник данных, на который может ссылаться атрибут value, — это неявный объект.

Страница bookreceipt.xhtml примера Duke's Bookstore содержит ссылку на неявный объект:

<h:outputFormat title="thanks"
                value="#{bundle.ThankYouParam}">
    <f:param value="#{sessionScope.name}"/>
</h:outputFormat>

Этот тег получает имя клиента из области видимости сессии и вставляет его в параметризованное сообщение по ключу ThankYouParam из bundle-ресурса. Например, если имя клиента Gwen Canigetit, этот тег будет отображать:

Thank you, Gwen Canigetit, for purchasing your books from us.

Получение значений из других неявных объектов выполняется аналогично примеру, показанному в этом разделе. Таблица 15-4 перечисляет неявные объекты, на которые может ссылаться атрибут value. Все неявные объекты, за исключением объектов области видимости, доступны только для чтения и поэтому не должны использоваться в качестве значений для компонента UIInput.

Таблица 15-4 Неявные объекты

Неявный объект

Что это

applicationScope

Map значений атрибутов области приложения с ключами — именами атрибутов

cookie

Map значений файлов cookie для текущего запроса с указанием имени файла cookie

facesContext

Объект FacesContext для текущего запроса

header

Map значений заголовка HTTP для текущего запроса с ключами — именами заголовков

HeaderValues

Массивы Map из String, содержащие все значения заголовков для заголовков HTTP в текущем запросе с указанием имени заголовка

initParam

Map параметров инициализации контекста для этого веб-приложения

param

Map параметров запроса с кключами — именами параметров

paramValues

Массивы Map из String, содержащие все значения параметров для параметров запроса в текущем запросе, с указанием имени параметра

requestScope

Map атрибутов запроса с ключами — именами атрибутов

sessionScope

Map атрибутов сессии с ключами — именами атрибутов

view

Корень UIComponent в текущем дереве компонентов, хранящийся в FacesRequest для этого запроса

Связывание объекта компонента со свойством бина

Объект компонента может быть связан со свойством бина с помощью выражения значения в атрибуте binding тега компонента. Обычно привязывается объект компонента, а не его значение, к свойству компонента, если компонент должен динамически изменять атрибуты компонента.

Вот два тега со страницы bookcashier.xhtml, которые связывают компоненты со свойствами бина:

<h:selectBooleanCheckbox id="fanClub"
                         rendered="false"
                         binding="#{cashierBean.specialOffer}" />
<h:outputLabel for="fanClub"
               rendered="false"
               binding="#{cashierBean.specialOfferText}"
               value="#{bundle.DukeFanClub}"/>
</h:outputLabel>

Тег h:selectBooleanCheckbox отображает флажок и связывает fanClub компонента UISelectBoolean со свойством specialOffer бинаcashier. Тег h:outputLabel связывает компонент, представляющий метку флажка, со свойством specialOfferText компонента EJB cashier. Если локаль приложения — английский, отображается тег h:outputLabel.

I'd like to join the Duke Fan Club, free with my purchase of over $100

Атрибуты rendered обоих тегов установлены в false, чтобы не отображать флажок и его метку. Если клиент делает большой заказ и кликает кнопку «Отправить», метод submit для CashierBean устанавливает для свойств rendered обоих компонентов значение true, вызывая отображение флажка и его метки.

В этих тегах используются привязки компонентов, а не привязки значений, поскольку Managed-бин должен динамически устанавливать значения свойств rendered компонентов.

Если бы теги использовали привязки значений вместо привязок компонентов, Managed-бин не имел бы прямого доступа к компонентам и, следовательно, потребовал бы дополнительного кода для доступа к компонентам из объекта FacesContext для изменения свойств rendered компонентов.

Запись свойств, привязанных к объектам компонентов, объясняет, как записать свойства бинов, привязанных к компонентам примера.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)