Это пятая запись в серии предварительного просмотра новых функций 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 для гибридной проверки на стороне клиента и сервера. Наличие этой системы также позволяет использовать еще одну новую функцию, о которой я расскажу в следующей записи, — перемещение ресурсов. Я не буду приводить здесь слишком много подробностей, но перемещение ресурсов — это средство, позволяющее отображать таблицы стилей или сценарии в одном из нескольких мест, независимо от того, где в определении представления был размещен фактический тег.
( *) — Это событие не будет опубликовано при восстановлении представления из постбека.