什么是EventBus
Web平台运行期为什么要用EventBus
- 便于业务逻辑解耦
- 提供丰富的扩展点,包括前扩展、后扩展和覆盖
- 使用事件驱动,让事件触发更加清晰
- 让代码更加简洁清楚
Web平台运行期在那些地方使用了EventBus
- 业务逻辑调度中心,包括前端、Web服务端任何地方
- 通过EventBus集成各种超类、模板、页面
- 通过EventBus集成各种系统服务与业务组件
EventBus结构图
EventBus注册与触发顺序图
什么是Event
- 一个事件,是注册和触发EventBus的入口
- Web平台的推荐应用方式为:由运行期框架自动触发,比如页面初始化、页面渲染、异常、页面关闭等
什么是Action
- 一个动作。是Event的一个子类。比Event增加了一个action名称
- Web平台的推荐应用方式为:由页面的自有逻辑的代码主动触发。比如保存、新增、复制等
Handler
- 处理器,消息响应后触发的具体的实现(可为Js、Java或Ranio脚本)
扩展方式
- 可以在EventBus注入的扩展点,共分为三种:Before/After/Overwrite
- 如果没有定义,缺省为After
EventBus的两个实现层面-前端EventBus实现
- [扩展开发平台]-[设置]-[页面事件]
- [定义工具]-[设置]-[页面功能]
- [定义工具]-[保存],直接生成进行注册的js代码
前端EventBus的API:
_self.getEventBus
方法:getEventBus:function(){}
描述:直接返回前端EventBus对象,不推荐直接使用。
_self.subscribeEvent
方法:subscribeEvent:function(event,fn,pointcut){}
描述:注册事件,并指定实现方法和插入点
参数:event:字符串形式事件名,命名规则为Event或ActionEvent结尾
fn:实现方法
插入点类型:after、overwrite、before
_self.unSubscribeEvent
方法:unSubscribeEvent:function(event){}
描述:取消注册事件
参数:event:字符串形式事件名,命名规则为Event或ActionEvent结尾
_self.fireEvent
方法:fireEvent:function(event){}
描述:触发某个具体事件,执行这个事件对于的实现方法队列
参数:event:字符串形式事件名,命名规则为Event或ActionEvent结尾
其他参数:可以增加一些后续参数
Handler实现说明:
参数:接收fireEvent方法传递过来的参数
特殊参数e:只有按钮绑定的页面功能才有值,手工调用不会有e的。页面功能代码生成时,默认会生成这个e,值为jquery.event
返回值:无返回值的处理,只能通过返回值确定是否继续执行后续的方法队列
true/无:继续执行后续的实现方法队列
false:停止执行后续的实现方法队列
其他:返回true
Handle队列中数据的传递:只能利用页面的全局变量,本身没有提供处理机制
EventBus的两个实现层面-服务端端EventBus实现
- [定义工具]-[设置]-[后台功能]
- [定义工具]-[保存],在页面元数据中生成对应配置文件uic配置文件片段,并保存于页面元数据中
服务端EventBus的API:
Event:com.kingdee.bos.eventbus.KDEvent
private boolean needReturn = true;
描述:是否返回结果
private Object successResult = null;
描述:成功执行的正确的JSon结果
private Object jsonResult = null;
描述:返回的JSon结果
public final RequestContext getReqeustContext() {
描述:获得服务的申请参数,包括事件名、httpRequest、额外的参数列表
public final RequestContext getReqeustContext() {
描述:获得响应的申请参数,包括httpRespose、额外的参数列表、重定向路径
public void kill() {}
描述:直接阻止后续实现器的执行
Action:com.kingdee.bos.eventbus.event.action.KDActionEvent
String actionName;
描述:action的名称
Handle队列中数据的传递:
在Handler实现器中,传递Event对象,因此可以通过定义对象类增加属性的方式,实现在各个handler中传值
通过event.getReqeustContext()对象,实现在各个handler中传值
返回值:优先级为标注的的成功信息属性>事件对象的成功结果变量>事件对象的返回结果
优先级为标注的的成功信息属性:这种注解方式不推荐实现
事件对象的成功结果变量:successResult
事件对象的返回结果: jsonResult
响应Action的Handler:
继承com.kingdee.bos.webframework.dynamic.handler.AbstractWebEventHandler
实现com.kingdee.bos.eventbus.event.action.IActionEventHandler
响应Event的Handler:
继承com.kingdee.bos.webframework.dynamic.handler.AbstractWebEventHandler
com.kingdee.bos.eventbus.support.SimpleEventBus
描述:是EventBus中最主要的一个实现类
public void fireEvent(KDEvent event) {}
描述:触发一个事件
private void doFire(KDEvent event, Object source) {}
描述:找到event所对应的全部handler,按扩展类型,排序执行
com.kingdee.bos.eventbus.definition.UIConfig
描述:UIC解析的主要类
public Map<String, Collection<Plugin>> getRegisterPlugins(HandlerType handlerType) {}
描述:取已经注册插件的集合,是获得handler的入口
private void collectPlugins(Map<HandlerType, Map<String, Collection<Plugin>>> pluginMap, Set<String> overwrited) {}
描述:按递归的方式,逐层获得uic中对应的plugin及handler
com.kingdee.bos.webframework.dynamic.application.WebApplication
描述:每个Web页面的应用对象。
public IEventBus getEventBus() {}
描述:获得EventBus对象(SimpleEventBus),不推荐直接这么使用
public IKDEventFireFirer getEventFirer() {}
描述:获得EventBus触发器(WebEventFirer),直接发起后台服务请求时使用
public UIConfig getUIConfig {}
描述:获得UIC配置对象(UIConfig)
public IModelService getModelService() {}
描述:获得数据模型服务(WebDefaultModelService)
com.kingdee.bos.webframework.dynamic.event.register.WebEventFirer
描述: Web页面的EventBus触发器
public KDEvent fireWebActionEvent(HttpServletRequest request,HttpServletResponse response, odelMap modelMap,String actionName) {}
描述:触发一个Action事件
public void fireWebEvent(HttpServletRequest request,HttpServletResponse response, ModelMap modelMap,KDEvent event) {}
描述:触发一个事件