<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-бина, привязанные к реализациям валидатора или слушателя, записываются одинаково и имеют одинаковое общее назначение.
| Назад | Вперёд | Содержание |
Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены.
Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)