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

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

Регистрация слушателей в компонентах

Разработчик приложения может реализовывать слушатели как классы или как методы Managed-бина. Если слушатель является методом Managed-бина, автор страницы ссылается на метод либо из атрибута valueChangeListener компонента, либо из его атрибута actionListener. Если слушатель является классом, автор страницы может ссылаться на слушателя либо из тега f:valueChangeListener, либо из тега f:actionListener и вкладывать внутрь тега компонента для регистрирации слушателя в компоненте.

Ссылка на метод-обработчик действия и Ссылка на метод-обработчик изменения значения объясняют, как автор страницы использует атрибуты valueChangeListener и actionListener для ссылки на методы Managed-бина, которые обрабатывают события.

В этом разделе объясняется, как зарегистрировать слушатель изменения значения NameChanged и слушатель действия BookChange в компонентах. В примере Duke's Bookstore участвуют оба этих слушателя.

Регистрация слушателя изменения значения в компоненте

Автор страницы может зарегистрировать реализацию ValueChangeListener в компоненте, который реализует EditableValueHolder, вложив тег f:valueChangeListener в тег компонента на странице. Тег f:valueChangeListener поддерживает атрибуты, показанные в таблице 11-5, один из которых обязательно должен использоваться.

Таблица 11-5 Атрибуты для тега f:valueChangeListener

Атрибут

Описание

type

Ссылается на полное имя класса реализации ValueChangeListener. Может принимать литерал или выражение значения.

binding

Ссылается на объект, который реализует ValueChangeListener. Может принимать только выражение значения, которое должно указывать на свойство Managed-бина, принимающее и возвращающее реализацию ValueChangeListener.

В следующем примере показан слушатель изменения значения, зарегистрированный в компоненте:

<h:inputText id="name"
             size="30"
             value="#{cashierBean.name}"
             required="true"
             requiredMessage="#{bundle.ReqCustomerName}">
    <f:valueChangeListener
        type="javaeetutorial.dukesbookstore.listeners.NameChanged" />
</h:inputText>

В этом примере атрибут type основного тега указывает кастомный слушатель NameChanged как реализацию ValueChangeListener, зарегистрированную в name компонента.

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

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

Регистрация слушателя действий в компоненте

Автор страницы может зарегистрировать реализацию ActionListener в командном компоненте, вложив тег f:actionListener в тег компонента на странице. Аналогично тегу f:valueChangeListener, тег f:actionListener поддерживает оба атрибута: type и binding. Один из этих атрибутов должен использоваться для ссылки на слушатель действия.

Вот пример тега h:commandLink, который ссылается на реализацию ActionListener:

<h:commandLink id="Duke" action="bookstore">
    <f:actionListener
        type="javaeetutorial.dukesbookstore.listeners.LinkBookChangeListener" />
    <h:outputText value="#{bundle.Book201}"/>
</h:commandLink>

Атрибут type тега f:actionListener указывает полное имя класса реализации ActionListener. Аналогично тегу f:valueChangeListener, тег f:actionListener также поддерживает атрибут binding. Смотрите Связывание конвертеров, слушателей и валидаторов со свойствами Managed-бина для получения дополнительной информации о связывании слушателей со свойствами Managed-бина.

В дополнение к тегу actionListener, который позволяет вам зарегистрировать пользовательский слушатель в компоненте, библиотека основных тегов включает тег f:setPropertyActionListener. Этот тег используется для регистрации специального слушателя действий в объекте ActionSource, связанном с компонентом. Когда компонент активирован, слушатель сохраняет объект, на который ссылается атрибут value, в объект, на который ссылается атрибут target.

Страница bookcatalog.xhtml приложения Duke's Bookstore использует f:setPropertyActionListener с двумя компонентами: компонентом h:commandLink, используемым для ссылки на страницу bookdetails.xhtml и компонентом h:commandButton, используемым для добавления книги в корзину:

<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}" >
    ...
    <h:column>
        <f:facet name="header">
            <h:outputText value="#{bundle.ItemTitle}"/>
        </f:facet>
        <h:commandLink action="#{catalog.details}"
                       value="#{book.title}">
            <f:setPropertyActionListener target="#{requestScope.book}"
                                         value="#{book}"/>
        </h:commandLink>
    </h:column>
    ...
    <h:column>
        <f:facet name="header">
            <h:outputText value="#{bundle.CartAdd}"/>
        </f:facet>
        <h:commandButton id="add"
                         action="#{catalog.add}"
                         value="#{bundle.CartAdd}">
            <f:setPropertyActionListener target="#{requestScope.book}"
                                         value="#{book}"/>
        </h:commandButton>
    </h:column>

Теги h:commandLink и h:commandButton находятся внутри тега h:dataTable, который перебирает список книг. Атрибут var ссылается на одну книгу в списке.

Объект, на который ссылается атрибут var тега h:dataTable, находится в области видимости страницы. Однако в этом случае вам нужно поместить этот объект в область запроса, чтобы при активации пользователем компонента commandLink для перехода на bookdetails.xhtml или компонента commandButton для перехода на bookcatalog.xhtml данные книги стали доступны для этих страниц. Следовательно, тег f:setPropertyActionListener используется для установки объекта текущей книги в область запроса, когда активирован компонент commandLink или commandButton.

В предыдущем примере атрибут value тега f:setPropertyActionListener ссылается на объект book. Атрибут target тега f:setPropertyActionListener ссылается на выражение значения requestScope.book, в котором содержится объект book атрибута value, когда активируется компонент commandLink или commandButton.


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