protected int currentOption;
public int getCurrentOption(){...}
public void setCurrentOption(int option){...}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Тег компонента может связать свои данные с 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 Примеры выражений привязки значений
Значение |
Выражение |
Логическое |
|
Свойство, инициализированное контекстным параметром |
|
Свойство бина |
|
Значение в массиве |
|
Значение в коллекции |
|
Свойство объекта в массиве объектов |
|
В следующих двух разделах объясняется, как использовать атрибут 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 Неявные объекты
Неявный объект |
Что это |
|
|
|
|
|
Объект |
|
|
|
Массивы |
|
|
|
|
|
Массивы |
|
|
|
|
|
Корень |
Объект компонента может быть связан со свойством бина с помощью выражения значения в атрибуте 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
компонентов.
Запись свойств, привязанных к объектам компонентов, объясняет, как записать свойства бинов, привязанных к компонентам примера.
Назад | Вперёд | Содержание |