JSF基于事件的沟通:过时的方法
观察员/事件听众
public class LocaleChangeEvent extends EventObject {Locale locale;public LocaleChangeEvent(Object source, Locale locale) {super(source);this.locale = locale;}public Locale getLocale() {return locale;}
}
其次,我们需要一个接口LocaleChangeListener。
public interface LocaleChangeListener extends EventListener {void processLocaleChange(LocaleChangeEvent event);
}
@ManagedBean
@SessionScoped
public class UserSettingsForm implements Serializable {private Locale selectedLocale;private List<SelectItem> locales;private List<LocaleChangeListener> localeChangeListeners = new ArrayList<LocaleChangeListener>();public void addLocaleChangeListener(LocaleChangeListener listener) {localeChangeListeners.add(listener);}public void localChangeListener(ValueChangeEvent e) {...// notify listenersLocaleChangeEvent lce = new LocaleChangeEvent(this, this.selectedLocale);for (LocaleChangeListener lcl : localeChangeListeners) {lcl.processLocaleChange(lce);}}...
}
@ManagedBean
@SessionScoped
public MyBean implements LocaleChangeListener, Serializable {// UserSettingsForm can be injected e.g. via @ManagedProperty annotation or via Spring facilityprivate UserSettingsForm userSettingsForm;@PostConstructpublic void initialize() {userSettingsForm.addLocaleChangeListener(this);}public void processLocaleChange(LocaleChangeEvent event) {// reset something related to I18N data...}
}
就观察者模式而言,UserSettingsForm是可观察的,而LocaleChangeListener的实例(如MyBean)则是观察者。 讨论的模式带有一些您需要注意的重要问题。 豆紧密耦合。 有很多手动工作来重新注册bean。 Bean必须实现定义的接口。 如果您有100个语义不同的更改通知了bean,则它必须实现100个接口。 无法通知已注册的侦听器的子集–即使不需要通知所有侦听器,也总是会通知他们。 最后但并非最不重要的– 内存管理问题 。 马丁·福勒(Martin Fowler)写道: “假设我们有一些观察某些域对象的屏幕。 关闭屏幕后,我们希望将其删除,但是域对象实际上通过观察者关系携带了对屏幕的引用。 在内存管理的环境中,寿命长的域对象可能会占据很多僵尸屏幕,从而导致大量内存泄漏。”
调解员
public interface MediatorEvent {...
}public interface MediatorListener {public void listenToEvent(MediatorEvent event);
}public class Mediator implements Serializable {private Collection<MediatorListener> collaborators = new HashSet<MediatorListener>();public static Mediator getCurrentInstance() {// access Mediator bean by JSF-Spring facilityreturn ContextLoader.getCurrentWebApplicationContext().getBean("mediator");}public void fireEvent(MediatorEvent event) {for (MediatorListener mediatorListener : collaborators) {mediatorListener.listenToEvent(event);}}public void addCollaborator(MediatorListener collaborator) {collaborators.add(collaborator);}public void removeCollaborator(MediatorListener collaborator) {collaborators.remove(collaborator);}
}
public MyBean implements MediatorListener, InitializingBean, Serializable {public void afterPropertiesSet() throws Exception {...Mediator.getCurrentInstance().addCollaborator(this);}@Overridepublic void listenToEvent(MediatorEvent event) {if (event instanceof LocaleChangeEvent) {// do something}}
}
public class LocaleChangeEvent implements MediatorEvent {...
}public class UserSettingsForm implements Serializable {private Locale selectedLocale;private List<SelectItem> locales;public void localChangeListener(ValueChangeEvent e) {...// notify listenersMediator.getCurrentInstance().fireEvent(new LocaleChangeEvent(this, this.selectedLocale));}...
}
参考: JSF中基于事件的通信。 我们的JCG合作伙伴 Oleg Varaksin在“ 软件开发思想”博客上的过时做法 。
翻译自: https://www.javacodegeeks.com/2012/07/jsf-event-based-communication-old.html
JSF基于事件的沟通:过时的方法相关推荐
- JSF基于事件的交流:新派方法
在上一篇文章中 ,我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信. 由于它们的缺点,我想展示基于事件的通信的更有效方法. 我们将从Google ...
- 基于jsf的项目_JSF基于事件的交流:新派方法
基于jsf的项目 在上一篇文章中 ,我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信. 由于它们的缺点,我想展示基于事件的通信的更有效方法. 我们 ...
- 基于jsf的项目_JSF基于事件的沟通:过时的方法
基于jsf的项目 用JSF编写的Web应用程序由相互交互的bean组成. 在开发Web应用程序时,bean之间的通信是主要的设计模式之一. 有时,一个bean需要将事件发送给其他bean,以通知它们某 ...
- 激光雷达角点检测 c语言,一种基于事件帧的角点检测方法与流程
本发明属于图像处理领域,用于解决基于事件相机的SLAM项目的角点检测. 背景技术: 在过去几十年里,由于计算机视觉算法的研究与发展,人们对机器人感知的兴趣也日益增加.这种传统相机能够捕获相机周围环境的 ...
- [译] 基于事件流构建的服务
[译] 基于事件流构建的服务 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 原文:https://www.confluent.i ...
- 港科大开源 | 基于事件的双目视觉里程计
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1 摘要 本文提出了一种双目事件相机的视觉里程计方法.我们的系统遵循并行跟踪和建图的方法,建图模块以概 ...
- 基于事件的 NIO 多线程服务器--转载
JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个客户端请求而分配独立的服务线程,而是通过多线程充分使用用多个 CPU 的处 ...
- 基于事件的异步模式——BackgroundWorker
转自strangeman原文 基于事件的异步模式--BackgroundWorker 实现异步处理的方法很多,经常用的有基于委托的方式,今天记录的是基于事件的异步模式.利用BackgroundWork ...
- 基于事件的 NIO 多线程服务器
2019独角兽企业重金招聘Python工程师标准>>> JDK1.4 的 NIO 有效解决了原有流式 IO 存在的线程开销的问题,在 NIO 中使用多线程,主要目的已不是为了应对每个 ...
最新文章
- python合并两个有序列表(list)
- vs2005 Key not valid for use in specified state
- linux nice线程,linux nice 线程
- Delphi的实数计算结果中只保留2位小数
- 二分类minst0-1到0-9近似迭代次数公式和准确率公式汇总
- c++中默认32位int类型转换截取高位部分
- !+\v1 用来“判断浏览器类型”还是用来“IE判断版本”的问题!
- 【TencentOS tiny】深度源码分析(4)——消息队列
- CentOS7下LVS+Keepalived实现高性能高可用负载均衡
- 最想学 Go、Python,全栈开发者紧缺!分析了 11 万条程序员数据后有了这些发现...
- 一、安装mysql 单机版
- 从例图中学习思维导图的基本概念
- 【应急响应】Linux应急响应入侵排查思路
- T分布和T检验的理解,Python代码实现T检验的计算
- 物联网技术概论:第2章
- springboot整合mybatis错误 Invalid bound statement (not found): 解决办法
- Storm-kafka【接口实现】4 - KafkaSpout
- 构思编辑器教你如何不用代码排版出好看的微信公众号文章
- SPI通讯协议详解 基于STM32
- 使用XGBoost在Python中进行特征重要性分析和特征选择
热门文章
- linux-basic(13)学习shell script
- spring(4)面向切面的Spring(AOP)
- AQS的细节--自用,非正常教程
- 会话技术Session
- apache ignite_Kubernetes集群上的Apache Ignite和Spring第1部分:Spring Boot应用程序
- apache pdfbox_Apache PDFBox命令行工具:无需Java编码
- camel 使用_使用Camel从WildFly 8向WebLogic 12发送JMS消息
- JAR文件句柄:烦恼后清理!
- 使用Angular,Ionic 4和Spring Boot构建移动应用
- [JDK 11] jcmd中的类加载器层次结构详细信息