基于jsf的项目_JSF基于事件的沟通:过时的方法
基于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的项目_JSF基于事件的沟通:过时的方法相关推荐
- 基于jsf的项目_JSF基于事件的交流:新派方法
基于jsf的项目 在上一篇文章中 ,我们学习了基于Observer / Event Listener和Mediator模式的基于事件的通信. 由于它们的缺点,我想展示基于事件的通信的更有效方法. 我们 ...
- 项目经理如何才能做好沟通?
很多项目经理都知道沟通是很重要的,因为项目经理工作时间中的80%左右都是在沟通,可是现实中,有多少个项目经理真正花时间去学习.去研究过沟通呢?真正了解沟通的本质与方法的项目经理又有多少呢?这就引发了一 ...
- 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数据库配置 ...
最新文章
- ROS系统 常用可视化工具的使用
- windows redis 客户端_redis高并发的最佳解决方案
- kotlin学习之数据类(七)
- python开发范围_Python上的字母范围
- composer(作曲家)安装php-ml
- HDU-5877-Weak Pair(树状数组+离散化+dfs)
- 面试精讲之面试考点及大厂真题 - 分布式专栏 05 公司使用什么RPC框架,聊聊你理解的RPC原理
- 文件操作fstream
- 以太坊合约24小时新增2.44万ETH
- 2020,人工智能与产业结合的新纪年,你需要哪些能力可以脱颖而出?
- 乐观锁、悲观锁,这一篇就够了!
- SqlServer两表之间:根据一个表的字段更新另一个表的字段
- Python使用matplotlib可视化模拟学生课程分数雷达图
- 课题申报书范文_教师课题申报书范例
- 车载高精度GNSS定位天线
- Linux 查看网络流量 iftop
- Java task类需要自己销毁_并发编程之线程创建到销毁、常用API
- mysql rds云数据库_云数据库 RDS MySQL快速入门手册
- 怎么处理视频声音变声?视频声音变声处理软件哪个好?
- 产品人的三个层次——老吴说产品