基于jsf的项目_JSF基于事件的交流:新派方法
基于jsf的项目
番石榴EventBus
Google Guava库具有有用的package eventbus 。 EventBus类允许组件之间进行发布-订阅式通信,而无需组件之间进行显式注册。 因为我们开发Web应用程序,所以应该将此类的实例封装在有作用域的bean中。
让我们编写EventBusProvider bean。
public class EventBusProvider implements Serializable {private EventBus eventBus = new EventBus("scopedEventBus");public static EventBus getEventBus() {// access EventBusProvider beanELContext elContext = FacesContext.getCurrentInstance().getELContext();EventBusProvider eventBusProvider =(EventBusProvider) elContext.getELResolver().getValue(elContext, null, "eventBusProvider");return eventBusProvider.eventBus;}
}
我仅以一个示例来演示Guava EventBus的所有主要功能。 让我们编写以下事件层次结构:
public class SettingsChangeEvent {}public class LocaleChangeEvent extends SettingsChangeEvent {public LocaleChangeEvent(Object newLocale) {...}
}public class TimeZoneChangeEvent extends SettingsChangeEvent {public TimeZoneChangeEvent(Object newTimeZone) {...}
}
public MyBean1 implements Serializable {@PostConstructpublic void initialize() throws Exception {EventBusProvider.getEventBus().register(this);}@Subscribepublic void handleLocaleChange(LocaleChangeEvent event) {// do something}@Subscribepublic void handleTimeZoneChange(TimeZoneChangeEvent event) {// do something}
}public MyBean2 implements Serializable {@PostConstructpublic void initialize() throws Exception {EventBusProvider.getEventBus().register(this);}@Subscribepublic void handleSettingsChange(SettingsChangeEvent event) {// do something}
}
要发布事件,只需将事件对象提供给EventBus实例的post()方法。 EventBus实例将确定事件的类型,并将其路由到所有已注册的侦听器。
public class UserSettingsForm implements Serializable {private boolean changed;public void localeChangeListener(ValueChangeEvent e) {changed = true; // notify subscribersEventBusProvider.getEventBus().post(new LocaleChangeEvent(e.getNewValue()));}public void timeZoneChangeListener(ValueChangeEvent e) {changed = true; // notify subscribersEventBusProvider.getEventBus().post(new TimeZoneChangeEvent(e.getNewValue()));}public String saveUserSettings() {...if (changed) {// notify subscribersEventBusProvider.getEventBus().post(new SettingsChangeEvent());return "home";}}
}
- 事件生产者和事件观察者彼此分离。
- 观察者可以指定“选择器”的组合来缩小他们将接收的事件通知的范围。
- 可以立即或延迟通知观察者,直到当前事务结束为止。
- 使用条件观察者方法进行作用域定义时不会感到头痛(还记得作用域bean和Mediator / EventBus的问题吗?)。
public MyBean implements Serializable {public void onLocaleChangeEvent(@Observes Locale locale) {...}
}
如果观察者方法仅对限定的事件感兴趣,则事件参数也可以指定限定符-这些是具有那些限定符的事件。
public void onLocaleChangeEvent(@Observes @Updated Locale locale) {...
}
事件限定符只是使用@Qualifier定义的普通限定符。 这是一个例子:
@Qualifier
@Target({FIELD, PARAMETER})
@Retention(RUNTIME)
public @interface Updated {}
事件生产者使用参数化Event接口的实例来触发事件。 该接口的实例通过注入获得。 生产者通过调用Event接口的fire()方法并传递事件对象来引发事件。
public class UserSettingsForm implements Serializable {@Inject @Any Event<Locale> localeEvent;public void localeChangeListener(ValueChangeEvent e) {// notify all observerslocaleEvent.fire((Locale)e.getNewValue());}
}
// this will raise events to observers having parameter @Observes @Updated Locale
@Inject @Updated Event<Locale> localeEvent;
public void onLocaleChangeEvent(@Observes @Updated Locale locale, User user) {...
}
动态指定限定符怎么办? CDI允许通过AnnotationLiteral获得适当的限定符实例。 这样,我们可以将限定符传递给Event的select()方法。 例:
public class DocumentController implements Serializable {Document document;@Inject @Updated @Deleted Event<Document> documentEvent;public void updateDocument() {...// notify observers with @Updated annotationdocumentEvent.select(new AnnotationLiteral<Updated>(){}).fire(document);}public void deleteDocument() {...// notify observers with @Deleted annotationdocumentEvent.select(new AnnotationLiteral<Deleted>(){}).fire(document);}
}
public void onLocaleChangeEvent(@Observes(receive = IF_EXISTS) @Updated Locale locale) {...
}
翻译自: https://www.javacodegeeks.com/2012/07/jsf-event-based-communication-new.html
基于jsf的项目
基于jsf的项目_JSF基于事件的交流:新派方法相关推荐
- 基于jsf的项目_JSF基于事件的沟通:过时的方法
基于jsf的项目 用JSF编写的Web应用程序由相互交互的bean组成. 在开发Web应用程序时,bean之间的通信是主要的设计模式之一. 有时,一个bean需要将事件发送给其他bean,以通知它们某 ...
- 【论文学习】基于贝叶斯分类的大学生关注热点事件微博文本分类方法研究——殷复莲 张晓宇 冯晴
自己梳理一遍论文,作学习用. 基本信息 作者:殷复莲 张晓宇 冯晴(中国传媒大学信息工程学院) 摘要:针对互联网,尤其是微博平台中大学生用户产生的海量的文本分类问题,应用贝叶斯网络分类器对微博评论进行 ...
- JSF基于事件的交流:新派方法
在上一篇文章中 ,我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信. 由于它们的缺点,我想展示基于事件的通信的更有效方法. 我们将从Google ...
- 基于JSF框架的在线棋牌游戏平台
一.项目总体说明 1.1 项目总体说明 该项目是基于JSF框架的在线棋牌游戏平台,目前有五子棋和象棋两项已完成子模块,皆支持人机对战与在线匹配对战,其中象棋还支持大部分棋牌平台不支持的复盘功能.项目 ...
- 录制元素基于smartgwt框架项目如何开展自动化(一)
时间紧张,先记一笔,后续优化与完善. 基于smartgwt框架项目如何开展自动化(一) 近来接手数据资源平台产品的自动化建立,该项目依附smartgwt框架,项目早期尝试应用watir.webdriv ...
- jap页面使用ajax动态加载列表数据,JSF - 使用AJAX调用基于DataTable中的mimetype值加载不同形式...
对于我的一个项目,我需要根据DataTable组件中可用的mimetype值加载不同的表单.我有标题,内容 - 中间的DataTable和页脚中的数据显示.单击DataTable条目应根据mimety ...
- 基于深度学习的异构时序事件患者数据表示学习框架
基于深度学习的异构时序事件患者数据表示学习框架 刘卢琛, 沈剑豪, 张铭,, 王子昌, 李浩然, 刘泽群 北京大学信息科学技术学院,北京 100871 摘要:患者数据的表示学习可以将患者历史信息综 ...
- 20个基于DPDK开源项目,建议收藏
一.ANS – DPDK 原生加速网络堆栈 ANS(加速网络堆栈)是DPDK本地TCP/IP堆栈,也参考FreeBSD实现.ANS提供了一个与Intel DPDK一起使用的用户空间TCP/IP堆栈. ...
- 自动化运维-----项目实战: 基于Ansible的云平台自动化运维系统
文章目录 项目实战: 基于Ansible的云平台自动化运维系统 一.项目介绍 1.项目介绍 2.项目背景 二.项目环境搭建 1.项目目录的配置 2.远程服务器虚拟环境的配置 3.MySQL数据库配置 ...
最新文章
- ajax文字上下滚动,ajax页面底部 滚动加载效果 实例
- 字符集与编码(四)——Unicode
- 零基础建站第一季视频分享
- 使用DynamoDB映射器将DynamoDB项目映射到对象
- exchange 删除邮件
- 2012021402
- 个人笔记------无级分类格式化
- STM32跑马灯实验蜂鸣器实验按键输入实验NVIC中断优先级管理
- 用最简单的方法生成代码雨,效果相当的哇塞。
- python+gdal+numpy实现影像uint16转uint8
- windows中office无法使用撤销键
- 阿里云企业邮箱:密码登录
- Android so 文件全部报错:Duplicate resources
- python中interval_Python 数值区间处理_对interval 库的快速入门详解
- Manjaro学习笔记
- tp5源码分析之网络请求
- solr mysql 全文搜索_全文检索Solr集成HanLP中文分词
- java开发台球的图片_Java模拟桌球打击处理及绘制
- C#delegate、event、Action、EventHandler 的使用和区别
- 计算机设备与环境安全案例,2-1计算机设备与环境安全.pptx