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. Допустимые типы значений компонентов

Класс компонента

Допустимые типы значений компонентов

UIInput, UIOutput, UISelectItem, UISelectOne

Любой из примитивных или числовых типов или любой тип Java, для которого есть соответствующий javax.faces.convert.Converter

UIData

array бинов, List бинов, единичный бин, java.sql.ResultSet, javax.servlet.jsp.jstl.sql.Result, javax.sql.RowSet

UISelectBoolean

boolean или Boolean

UISelectItems

java.lang.String, Collection, Array, Map

UISelectMany

array или List, а также элементы array или List могут быть любого стандартного типа

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

Свойства UIInput и UIOutput

Классы компонентов 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

Класс компонента 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

Класс компонента 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

Класс компонента 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

Класс компонента 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

Компонент 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

Компоненты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-бина, привязанные к реализациям валидатора или слушателя, записываются одинаково и имеют одинаковое общее назначение.


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