Статьи

JSF 2.0 Новая функция предварительного просмотра серии (часть 3) Система публикации / подписки событий

Это пятая запись в серии предварительного просмотра новых функций JSF 2.0. Последняя запись завернутой нового обращения ресурсов приложения. Теперь мы переключим фокус на новую систему событий публикации / подписки.

Несколько API уровня компонентов и приложений были добавлены, чтобы дать возможность разработчикам компонентов и приложений использовать преимущества надежной системы событий. Обратите внимание, что этот блог основан на EDR1, и поэтому сигнатуры API будут меняться. В таком случае я постараюсь не забыть обновить блог соответствующим образом.

Начнем с изменений в javax.faces.component.UIComponent.

public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass,
                                                               ComponentSystemEventListener componentListener)

public void unsubscribeFromEvent(Class<? extends SystemEvent> systemEventClass,
      ComponentSystemEventListener listener)

public List<SystemEventListener> getListenersForEventClass(Class<? extends SystemEvent> systemEventClass)

Подписи довольно прямые. API позволяет разработчику на этом отдельном экземпляре компонента ассоциировать / разобщать ComponentSystemEventListener с некоторым типом события, расширяющим SystemEvent . Метод getListenersForEventClass () используется реализацией приложения при публикации события.

Другой класс, центральный для системы событий, — это javax.faces.application.Application. Были добавлены следующие методы:

public void subscribeToEvent(Class<? extends SystemEvent> systemEventClass,
Class sourceClass,
SystemEventListener listener)

public void publishEvent(Class<? extends SystemEvent> systemEventClass,
SystemEventListenerHolder source)

public void unsubscribeFromEvent(Class<? extends SystemEvent> systemEventClass,
Class sourceClass,
SystemEventListener listener)

Методы subscripbe / unsubscribe аналогичны методам, определенным в UIComponent , однако они распространяются на все приложения, а не на компоненты. Следует отметить, что необязательный sourceClass может быть предоставлен так, что слушатель будет вызываться только тогда, когда источник события имеет настроенный тип. Должен заметить, что в Application есть версия с двумя аргументами для подписки и публикации, у которой в подписи нет sourceClass . Они просто обращаются к версии с тремя аргументами, передавая null как sourceClass .

Теперь publishEvent — это место, где происходит вся работа. Как в настоящее время spec’d, publishEventбудет искать любых слушателей, определенных в предоставленном SystemEventListenerHolder (UIComponent реализует этот интерфейс, следовательно, описание методов в UIComponent), заинтересованных в предоставленном типе SystemEvent. После этого publishEvent вызовет любых слушателей, заинтересованных как в предоставляемом SystemEvent, так и в типе источника. Наконец, publishEvent будет вызывать любых слушателей, заинтересованных в получении указанного типа SystemEvent, независимо от источника.

Спецификация включает в себя несколько новых событий:

  • AfterAddToParentEvent . Это событие будет опубликовано при следующих обстоятельствах:

    • Когда вызывается UIComponent.getChildren (). Add (childToAdd) ( * )
    • Когда вызывается UIComponent.getFacets (). Put (facetName, facetChildToAdd) ( * )
    • После того, как вид был построен
  • BeforeRenderEvent . Это событие будет опубликовано при вызове UIComponent.encodeBegin ().
  • ViewMapCreatedEvent . Это событие будет опубликовано при вызове UIViewRoot.getViewMap () или UIViewRoot.getViewMap (true) (это основа для новой области просмотра ).
  • ViewMapDestroyedEvent . Это событие будет опубликовано NavigationHandler по умолчанию, когда представление переводится в новое представление (т. Е. Идентификаторы представления не равны), и карта представления использовалась приложением.

Ко времени завершения спецификации JSF 2.0 может быть добавлено больше событий.

Как видите, новая система событий достаточно гибкая и достаточно расширяемая, чтобы ее можно было использовать для многих целей. Например, демонстрационное приложение jsf-guessNumber2.0 (которое будет включено в выпуск Mojarra 2.0.0 EDR1 на этой неделе) задействует BeforeRenderEvent для гибридной проверки на стороне клиента и сервера. Наличие этой системы также позволяет использовать еще одну новую функцию, о которой я расскажу в следующей записи, — перемещение ресурсов. Я не буду приводить здесь слишком много подробностей, но перемещение ресурсов — это средство, позволяющее отображать таблицы стилей или сценарии в одном из нескольких мест, независимо от того, где в определении представления был размещен фактический тег.

( *) — Это событие не будет опубликовано при восстановлении представления из постбека.