<h:inputText id="name"
size="30"
value="#{cashierBean.name}"
...>
</h:inputText>
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Как объясняется в Managed-бинах в JavaServer Faces, свойство Managed-бина может быть связано с одним из следующих элементов:
Значение компонента
Объект компонента
Реализация конвертера
Реализация слушателя
Реализация валидатора
Эти свойства соответствуют соглашениям компонентов JavaBeans (также называемых бинами). Для получения дополнительной информации о компонентах JavaBeans см. учебное пособие по JavaBeans http://docs.oracle.com/javase/tutorial/javabeans/index.html
.
Тег компонента связывает значение компонента со свойством Managed-бина с помощью его атрибута value
и объект компонента со свойством Managed-бина с помощью его атрибута binding
. Аналогично, все теги конвертера, слушателя и валидатора используют свои атрибуты binding
для привязки их реализаций к свойствам Managed-бина. См. Связывание значений и объектов компонентов со свойствами Managed-бина и Связывание конвертеров, слушателей и валидаторов со свойствами Managed-бина для получения дополнительной информации.
Чтобы связать значение компонента со свойством Managed-бина, тип свойства должен соответствовать типу значения компонента. Например, если свойство Managed-бина связано со значением компонента UISelectBoolean
, свойство должно принимать и возвращать значение boolean
или объект-обёртку (wrapper) Boolean
.
Чтобы связать объект компонента со свойством Managed-бина, свойство должно соответствовать типу компонента. Например, если свойство Managed-бина связано с объектом UISelectBoolean
, свойство должно принять и вернуть значение UISelectBoolean
.
Аналогично, чтобы связать реализацию конвертера, слушателя или валидатора со свойством Managed-бина, свойство должно принимать и возвращать объект конвертера, слушателя или валидатора того же типа. Например, если вы используете тег convertDateTime
для привязки javax.faces.convert.DateTimeConverter
к свойству, это свойство должно принять и вернуть объект DateTimeConverter
.
В оставшейся части этого раздела объясняется, как записывать свойства, которые можно привязать к значениям компонентов и к объектам компонентов для компонентов, описанных в Добавление компонентов на страницу с использованием библиотеки тегов HTML, а также к реализации конвертера, слушателя и валидатора.
Чтобы написать свойство Managed-бина, связанное со значением компонента, необходимо сопоставить тип свойства значению компонента.
Таблица 12-1 перечисляет классы javax.faces.component
и допустимые типы их значений.
Таблица 12-1. Допустимые типы значений компонентов
Класс компонента |
Допустимые типы значений компонентов |
|
Любой из примитивных или числовых типов или любой тип Java, для которого есть соответствующий |
|
|
|
|
|
|
|
|
Когда они связывают компоненты со свойствами с помощью атрибутов value
, авторам страниц необходимо убедиться, что соответствующие свойства соответствуют типам значений компонентов.
Классы компонентов UIInput
и UIOutput
представлены тегами компонентов, которые начинаются с h:input
и h:output
соответственно (например, h:inputText
и h:outputText
).
В следующем примере тег h:inputText
связывает компонент name
со свойством name
Managed-бина CashierBean
.
<h:inputText id="name"
size="30"
value="#{cashierBean.name}"
...>
</h:inputText>
В следующем фрагменте кода из Managed-бина CashierBean
показан тип свойства компонента, связанный с предыдущим тегом компонента:
protected String name = null;
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
Как описано в Использование стандартных конвертеров, для преобразования значения входного или выходного компонента вы можете либо применить конвертер, либо создать свойство бина, привязанное к компоненту с соответствующим типом. Вот пример тега Использование DateTimeConverter, который отображает дату отправки товаров.
<h:outputText value="#{cashierBean.shipDate}">
<f:convertDateTime type="date" dateStyle="full" />
</h:outputText>
Свойство бина, представленное этим тегом, должно иметь тип java.util.Date
. В следующем фрагменте кода показано свойство shipDate
из Managed-бина CashierBean
, которое связано со значением тега в предыдущем примере:
private Date shipDate;
public Date getShipDate() {
return this.shipDate;
}
public void setShipDate(Date shipDate) {
this.shipDate = shipDate;
}
Класс компонента UIData
представлен тегом h:dataTable
.
КомпонентыUIData
должны быть связаны с одним из типов свойств Managed-бина, перечисленных в таблице 12-1. Компоненты данных обсуждаются в Использование таблицы Data-Bound. Вот открывающая часть тега dataTable
из этого раздела:
<h:dataTable id="items"
...
value="#{cart.items}"
...
var="item">
Выражение значения указывает на свойство items
бина cart
корзины покупок. Бин cart
содержит отображение (Map) бинов ShoppingCartItem
.
Метод getItems
бина cart
заполняет List
объектами ShoppingCartItem
, которые сохраняются в отображении (Map) items
, когда клиент добавляет книги в корзину, как показано в следующем фрагменте кода:
public synchronized List<ShoppingCartItem> getItems() {
List<ShoppingCartItem> results = new ArrayList<ShoppingCartItem>();
results.addAll(this.items.values());
return results;
}
Все компоненты, содержащиеся в компоненте UIData
, связаны со свойствами компонента cart
, который связан со всем компонентом UIData
. Например, вот тег h:outputText
, который отображает название книги в таблице:
<h:commandLink action="#{showcart.details}">
<h:outputText value="#{item.item.title}"/>
</h:commandLink>
Название на самом деле является ссылкой на страницу bookdetails.xhtml
. Тег h:outputText
использует выражение значения #{item.item.title}
, чтобы связать его компонент UIOutput
со свойством title
объекта Book
. Первым элементом в выражении является объект ShoppingCartItem
, на который ссылается тег h:dataTable
при отображении текущей строки. Второй элемент в выражении ссылается на свойство item
ShoppingCartItem
, которое возвращает Object
(в данном случае, Book
). Часть выражения title
ссылается на свойство title
в Book
. Значение компонента UIOutput
, соответствующего этому тегу, связано со свойством title
объекта Book
:
private String title;
...
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
Компонент UIData (и UIRepeat) поддерживает интерфейсы Map
и Iterable
, а также кастомные типы.
Для UIData и UIRepeat поддерживаются следующие типы:
null
(становится пустым списком)
javax.faces.model.DataMode
java.util.List
java.lang.Object[]
java.sql.ResultSet
javax.servlet.jsp.jstl.sql.Result
java.util.Collection
java.lang.Iterable
java.util.Map
java.lang.Object
(становится ScalarDataModel)
Класс компонента UISelectBoolean
представлен тегом компонента h:selectBooleanCheckbox
.
Свойства Managed-бина, которые содержат данные компонента UISelectBoolean
, должны иметь тип boolean
или Boolean
. Пример тега selectBooleanCheckbox
из раздела Компоненты выбора одного из значений связывает компонент со свойством. В следующем примере показан тег, который связывает значение компонента со свойством boolean
:
<h:selectBooleanCheckbox title="#{bundle.receiveEmails}"
value="#{custFormBean.receiveEmails}">
</h:selectBooleanCheckbox>
<h:outputText value="#{bundle.receiveEmails}">
Вот пример свойства, которое можно привязать к компоненту, представленному тегом примера:
private boolean receiveEmails = false;
...
public void setReceiveEmails(boolean receiveEmails) {
this.receiveEmails = receiveEmails;
}
public boolean getReceiveEmails() {
return receiveEmails;
}
Класс компонента UISelectMany
представлен тегами компонента, которые начинаются с h:selectMany
(например, h:selectManyCheckbox
и h:selectManyListbox
).
Поскольку компонент UISelectMany
позволяет пользователю выбирать один или несколько элементов из списка, этот компонент должен сопоставляться со свойством бина типа List
или array
. Это свойство бина представляет набор выбранных в данный момент элементов из списка доступных.
Следующий пример тега selectManyCheckbox
взят из Компонент выбора нескольких значений:
<h:selectManyCheckbox id="newslettercheckbox"
layout="pageDirection"
value="#{cashierBean.newsletters}">
<f:selectItems value="#{cashierBean.newsletterItems}"/>
</h:selectManyCheckbox>
Вот свойство бина, которое отображается на value
тега selectManyCheckbox
из предыдущего примера:
private String[] newsletters;
public void setNewsletters(String[] newsletters) {
this.newsletters = newsletters;
}
public String[] getNewsletters() {
return this.newsletters;
}
Компоненты UISelectItem
и UISelectItems
используются для представления всех значений в компоненте UISelectMany
. См. Свойства UISelectItem и Свойства UISelectItems для получения информации о написании свойств компонента для компонентов UISelectItem
и UISelectItems
.
Класс компонента UISelectOne
представлен тегами компонента, которые начинаются с h:selectOne
(например, h:selectOneRadio
и h:selectOneListbox
).
СвойстваUISelectOne
принимают те же типы, что и свойства UIInput
и UIOutput
, поскольку компонент UISelectOne
представляет выбор одного элемента из набора. Этот элемент может быть любого из примитивных типов и всего, для чего вы можете применить конвертер.
Вот пример тега h:selectOneMenu
из Отображение меню тегом h:selectOneMenu:
<h:selectOneMenu id="shippingOption"
required="true"
value="#{cashierBean.shippingOption}">
<f:selectItem itemValue="2"
itemLabel="#{bundle.QuickShip}"/>
<f:selectItem itemValue="5"
itemLabel="#{bundle.NormalShip}"/>
<f:selectItem itemValue="7"
itemLabel="#{bundle.SaverShip}"/>
</h:selectOneMenu>
Вот свойство бина, соответствующее этому тегу:
private String shippingOption = "2";
public void setShippingOption(String shippingOption) {
this.shippingOption = shippingOption;
}
public String getShippingOption() {
return this.shippingOption;
}
Обратите внимание, что shippingOption
представляет текущий выбранный элемент из списка в компоненте UISelectOne
.
Компоненты UISelectItem
и UISelectItems
используются для представления всех значений в компоненте UISelectOne
. Это объясняется в Отображение меню тегом h:selectOneMenu.
Для получения информации о том, как написать свойства Managed-бина для компонентов UISelectItem
и UISelectItems
, см. Свойства UISelectItem и Свойства UISelectItems.
Компонент UISelectItem
представляет одно значение в наборе в компоненте UISelectMany
или UISelectOne
. Компонент UISelectItem
должен быть связан со свойством Managed-бина типа javax.faces.model.SelectItem
. Объект SelectItem
состоит из Object
, представляющего значение, и двух Strings
, представляющих метку и описание объекта UISelectItem
.
Пример тега selectOneMenu
из Свойства UISelectOne содержит теги selectItem
, которые задают значения списка элементов на странице. Вот пример свойства компонента, который может устанавливать значения для этого списка в компоненте:
SelectItem itemOne = null;
SelectItem getItemOne(){
return itemOne;
}
void setItemOne(SelectItem item) {
itemOne = item;
}
КомпонентыUISelectItems
являются дочерними для компонентов UISelectMany
и UISelectOne
. Каждый компонент UISelectItems
состоит из набора объектов UISelectItem
или любой коллекции объектов, таких как массив, список или даже POJO.
В следующем фрагменте кода из CashierBean
показано, как записать свойства для тегов selectItems
, содержащих объекты SelectItem
.
private String[] newsletters;
private static final SelectItem[] newsletterItems = {
new SelectItem("Duke's Quarterly"),
new SelectItem("Innovator's Almanac"),
new SelectItem("Duke's Diet and Exercise Journal"),
new SelectItem("Random Ramblings")
};
...
public void setNewsletters(String[] newsletters) {
this.newsletters = newsletters;
}
public String[] getNewsletters() {
return this.newsletters;
}
public SelectItem[] getNewsletterItems() {
return newsletterItems;
}
Здесь свойство newsletters
представляет объект SelectItems
, а свойство newsletterItems
представляет статический массив объектов SelectItem
. Класс SelectItem
имеет несколько конструкторов. В этом примере первым аргументом является Object
, представляющий значение элемента, тогда как вторым аргументом является String
, представляющий метку, которая появляется на странице в компоненте UISelectMany
.
Свойство, связанное с объектом компонента, возвращает и принимает объект компонента, а не его значение. Следующие компоненты связывают объект компонента со свойством Managed-бина:
<h:selectBooleanCheckbox id="fanClub"
rendered="false"
binding="#{cashierBean.specialOffer}" />
<h:outputLabel for="fanClub"
rendered="false"
binding="#{cashierBean.specialOfferText}"
value="#{bundle.DukeFanClub}" />
</h:outputLabel>
Тег selectBooleanCheckbox
отображает флажок и связывает fanClub
компонента UISelectBoolean
со свойством specialOffer
в CashierBean
. Тег outputLabel
связывает значение атрибута value
, представляющего метку флажка, со свойством specialOfferText
элемента CashierBean
. Если пользователь заказывает книги на сумму более 100 долларов США и кликает кнопку «Отправить», метод submit
бина CashierBean
устанавливает свойства rendered
обоих компонентов в true
, в результате чего флажок и метка отображаются при повторном отображении страницы.
Поскольку компоненты, соответствующие тегам из примера, связаны со свойствами Managed-бина, эти свойства должны соответствовать типам компонентов. Это означает, что свойство specialOfferText
должно иметь тип UIOutput
, а свойство specialOffer
должно иметь тип UISelectBoolean
:
UIOutput specialOfferText = null;
UISelectBoolean specialOffer = null;
public UIOutput getSpecialOfferText() {
return this.specialOfferText;
}
public void setSpecialOfferText(UIOutput specialOfferText) {
this.specialOfferText = specialOfferText;
}
public UISelectBoolean getSpecialOffer() {
return this.specialOffer;
}
public void setSpecialOffer(UISelectBoolean specialOffer) {
this.specialOffer = specialOffer;
}
Для получения общей информации о связывании компонентов см. Managed-бины в JavaServer Faces.
Для получения информации о том, как ссылаться на метод Managed-бина, который выполняет навигацию при клике кнопки, см. Ссылка на метод, который выполняет навигацию.
Для получения дополнительной информации о написании методов Managed-бина, которые обрабатывают навигацию, смотрите Пишем метод для обработки навигации.
Все стандартные теги конвертеров, слушателей и валидаторов, включённые в JavaServer Faces, поддерживают атрибуты binding, которые позволяют привязывать реализации конвертеров, слушателей или валидаторов к свойствам Managed-бина.
В следующем примере показан стандартный тег convertDateTime
, использующий выражение значения с его атрибутом binding
для привязки объекта javax.faces.convert.DateTimeConverter
к свойству convertDate
у LoginBean
:
<h:inputText value="#{loginBean.birthDate}">
<f:convertDateTime binding="#{loginBean.convertDate}" />
</h:inputText>
Поэтому свойство convertDate
должно принимать и возвращать объект DateTimeConverter
, как показано здесь:
private DateTimeConverter convertDate;
public DateTimeConverter getConvertDate() {
...
return convertDate;
}
public void setConvertDate(DateTimeConverter convertDate) {
convertDate.setPattern("EEEEEEEE, MMM dd, yyyy");
this.convertDate = convertDate;
}
Поскольку конвертер привязан к свойству Managed-бина, свойство Managed-бина может изменять атрибуты конвертера или добавлять к нему новые функциональные возможности. В случае предыдущего примера свойство устанавливает шаблон даты, который конвертер использует для анализа ввода пользователя в объект Date
.
Свойства Managed-бина, привязанные к реализациям валидатора или слушателя, записываются одинаково и имеют одинаковое общее назначение.
Назад | Вперёд | Содержание |