`
haiyupeter
  • 浏览: 427626 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

OperaMasks中的注解工作方式

阅读更多

1.进入页面后如何根据@ManagedBean找到对应的后台Java类

      (1).装载类@ManagedBean的描述信息

      启动服务器的时候,FacesConfig的load方法里将配置中的及扫描OperaMasks源码包中的classes目录下的所有类文件,将包含@ManagedBean的类的描述信息类ManagedBeanConfig统一装到ManagedBeanContainer中。这个类中包含了所有的后台Bean的信息,如类名、类的范围。而ManagedBeanContainer是保存于ApplicationAssociate中的,然后ApplicationAssociate是保存于Application中的,所以该ManagedBeanContainer在应用生命周期都是可以访问得到的。

      (2).访问并构建@ManagedBean

      在第一和第六阶段,将会进行ModelBindingFactory的applyModelBinding()方法将model bindings到具体的视图view上。里面的getBeans方法理所当然后的调用了由第一点所说的ManagedBeanContainer中查找相应的ManagedBeanConfig,并通过反射的方式构造该Bean,既然无法预知要处理的Bean的构造函数是啥,所以框架要求必须要有无参构造函数,默认不传递任何参数,ManagedBean若不设置无参构造函数,则运行页面时报错。

      查找过程涉及到映射规则的匹配,即涉及到operamasks.xml中配置的ManagedBean映射规则。


      在DefaultManagedBeanContainer的storeBean的过程中,将ManagedBean存储到与ManagedBeanConfig对应的scope中去,如Request或者是Session又或者是Application范围。

      在任何的后台Bean寻找过程都可以通过这个过程来查找,从另一个角度讲,在业务代码中要获取某一个后台Bean都是可以做到的,只要传入相应的EL表达式,由OperaMasks引擎来做初始化工作,并返回相应的Bean实例。可以看到FacesUtils.getBean(String name)方法就是使用这种获取后台Bean的方式。

      至此,我们完成了ManagedBean的创建和存储,并提供了查找方式,后续的注解提供了实例。

2.@BeforeRender

      @BeforeRender太常用了,很多时候我们都需要在渲染页面前进行一些值的初始化。

      上面第1步的操作已经将ManagedBean准备好,在getBeans()后获取正确的Bean,接下来,我们首先要知道的是如何扫描其他的注解信息。


 

 
      已经可以看到BindingBuilder的scan方法了。在BindingBuilder的scan方法里,主要是对配置于comp-core/src/main/resources/META-INF/bean_processors.cfg及/mnt/project/workspace/om/workspace/operamasks-core/src/main/resources/org/operamasks/faces/binding/impl/processor/bean/bean_processors.cfg中配置的Class进行扫描并与bean中的注解进行对比,若存在该与配置文件对应的注解,则找到该类,如BeforeRender对应的是BeforeRenderProcessor.java,其build方法将BeforeRender解释成一个PhaseListenerBinding对象,后添加到ModelBinderImpl.java中的bindings属性中,如果是@BeforeRender,则添加到view的事件监听队列中,如果是@Action呢,好的,我们来看看原理吧,或者是Bind呢,都可以找得到。

      好了,前面所说的只是在构建binding所做的一切。这些都是只是负责将注解解析成Binding,只是记录了注解所要记录的信息。

      后面的事情就留给applyGlobal和applyModel来解决吧,在ModelBindingFactory的applyModelBinding方法中。



     在这里,每一个已经绑定的Binding进行各进的applyGlobal及applyModel方法的调用,IoVC至此将完成。

     来,我们来分析一下@BeforeRender对应的PhaseListenerBinding在applyGlobal及applyModel方法里做了什么!在applyGlobal方法中,view.setBeforePhaseListener(adapter)往视图里写了监听器。好了,当视图渲染前的事件队列调用时,则可调到此方法。PhaseListenerBinding没有覆盖Binding中的apply方法,父类Binding在该方法中没有做任何事情。同理@AfterRender及@BeforePhase及@AfterPhase都是同样的实现方式。

3.@Action

      (1).通过2的方式@Action对应的是ActionProcessor及ActionBinding,同理ActionProcessor在build()方法中创建ActionBinding对象。

      (2).首先调用ActionBinding的applyGlobal,由于其没有覆盖applyGlobal方法,父类Binding不做任何事情;

      (3).在ActionBinding的apply方法中则将@Action对应的Component进行attachEvent绑定事件,那么在ViewRoot.broatcast()事件响应的时候在事件队列寻找事件源的时候则可以找到并进行相应方法的调用。并设置button控件的相应的状态信息,达到统一控制button的效果。

    太神奇了。

4.@Bind

      (1).通过2的方式@Bind对应的是BindProcessor及ValueBinding

      (2).首先看applyGlobal

      (3).在其apply方法中,调用到EL来解析属性值,并将值填入到comp中。当然了,这里得细看,因为Binding只是将EL表达式整合到一起,它有多种类型的绑定,到真正求值的时候如getValue的值才会调用到。

5.@Init

6.@Inject

7.@ManagedProperty

      这个需要注意,在注解扫描时做了一些事情,ManagedBeanConfig

 

备注:

@ManagedProperty与@Inject都有注入功能,两者有什么区别

引自:http://wiki.operamasks.org/pages/viewpage.action?pageId=7635152

@ManagedProperty注入发生在ManagedBean刚创建时,这个动作是在进入JSF生命周期之前完成的(也就是在restore view阶段之前,就已经注入了)。

@Inject发生在IoVC绑定过程中,在首次请求时,IoVC发生在Render Response 阶段,因此在Restore View 的所有生命周期Listener中会得到空,在@BeforeRender 方法中可正确获取。在postback时,IoVC在Restore ViewRender Response 阶段各发生一次,在绑定过程中有可能会更新@Inject所绑 定的内容(详见下一段)。如果Bean的Scope是session或者application,由于在首次调用时已经注入了,因此在aom:Postback 时一般不会为空,但在Restore View 之前的Listener中会获得旧值(如果程序需要更新注入值的话);如果 Bean的Scope是none或者request,则在Restore View 之前的Listener中会获得空值。

那么AOM是如何判断@Inject注入的值在每个请求生命周期中是否更新(重新注入)呢?规则如下:

  • 如果Bean的Scope是Application,则必定不更新;
  • 如果Bean的Scope是Session,则根据@Inject标注的renew属性来判断,为true则更新,否则不更新。renew属性 默认为false;
  • 如果Bean的Scope是Request或None,则必定每次更新。

BindingBuilder详解

BindingBuilder故名思异,用于构建Binding实例。

1.哪些东西需要构建Binding实例呢?

2.如何构建呢?

答:

1.所有与iovc相关的类都需要进行构建Binding实例

    这些相Binding实例对对应的处理类记录在org/operamasks/faces/binding/impl/processor/bean/bean_processors.cfg文件中。每一个processor类都对应着一个注解,给BindingBuilder进行扫描时对比,并调用相关的processor类。组件体系开发人员可以自己指定自己的iovc实现类,记录在文件META-INF/bean_processors.cfg里,但前提是非常的熟悉aom的iovc引擎,否则很难写出与之相关的iovc实现。

2.BindingBuilder的扫描策略

    public void build(Class<?> targetClass);方法里进行了递归调用,先scan当前Class,然后再scan父interface及父类。 若有打上iovc中的annotation的话,则在processor类里调用process方法,其中构建相应的Binding实例,添加到BindingBuilder的binding列表中。

 

@Init详解

1.在哪里把@Init标注的方法写到调用列表中

2.在哪里进行@Init方法的调用

 

指定了标签的value属性后,不会再调用@Init的方法,@Init依赖于IoVC

 

参考文献:

[1] 绑定与注入问题:http://wiki.operamasks.org/pages/viewpage.action?pageId=7635152

[2] AOM JSF引擎实现概述文档:http://www.operamasks.org/forum/thread-2621-1-4.html

 

  • 大小: 35 KB
  • 大小: 47.5 KB
  • 大小: 38.6 KB
分享到:
评论

相关推荐

    operamasks-ui 帮助文档

    只是我在网上找的 operamasks-ui api 文档 , 希望对你们有帮助

    operaMasks_studio应用手册

    2. **代码自动生成**:为了减少重复性工作,operaMasks_studio提供了丰富的代码模板,用户可以根据自己的需求快速生成JSF组件、控制器、视图等基础代码,极大地提高了开发效率。 3. **可视化设计工具**:该工具还...

    operamasks-ui-2.0-doc

    通过深入学习这份"operamasks-ui-2.0-doc",开发者不仅可以掌握Operamasks的集成和自定义方法,还能了解到区块链技术在Web应用中的实际应用,这对于构建基于以太坊或其他区块链平台的DApp至关重要。同时,了解这些...

    OperaMasks快速进阶

    在OperaMasks中,LiteBean是对JSF ManagedBean的扩展,用于实现IoVC。开发者可以通过@ManagedBean注解创建LiteBean,并通过配置文件或标签将其绑定到页面。配置文件中的view-mapping元素用于定义URL模式与模型bean的...

    operamasks-sdk_3.2

    1. **集成能力**:Operamasks SDK 3.2 提供了与金蝶中间件系统的无缝对接,使得开发者能够轻松地在自己的应用程序中整合金蝶的各项服务,如数据管理、工作流控制等。 2. **API接口**:SDK 包含了一套完整的API接口...

    operamasks官方jsf教程

    **OperaMasks** 是一个专为Opera浏览器设计的JSF组件库,它扩展了JSF的功能,使得在Opera中使用JSF应用更加顺畅。 **教程概述:** "operamasks官方jsf教程"是针对初学者的一个资源,旨在介绍如何使用JSF和...

    operamasks-ui-2.1-demo

    在这个项目中,readme.txt可能会详述如何运行和测试OperaMasks UI 2.1的演示版本,以及如何在自己的项目中集成这个UI框架。阅读这个文件是了解和开始使用该框架的第一步。 而"operamasks-ui.war"文件是一个Web应用...

    operamasks安装包

    在使用过程中,用户可以根据自己的需求调整operamasks-options.jar中的设置,或者利用operamasks-api.jar提供的接口与其他软件或扩展进行交互,以实现更个性化的浏览体验。总的来说,OperaMasks通过这些组件提供了一...

    OperaMasks查询、模糊查询、源码

    在本项目中,OperaMasks可能与后端配合,通过AJAX异步请求发送用户输入的模糊查询条件,后端servlet处理这些条件并从数据库中检索相关数据。模糊查询通常涉及到SQL的LIKE或ILIKE操作符,以及通配符(如%和_)的使用...

    operamasks-faces_1.0

    从标签"faces"和"operamasks"我们可以推断,这个包可能包含了一些定制化的图形元素,尤其是与人脸相关的图案,这些图案可能用于聊天、社交媒体或者在Opera浏览器的特定功能中。 在“operamasks-faces_1.0”这个...

    Apusic OperaMasks-jsfdemo

    Apusic OperaMasks很全的JSF的例子,什么都有,如:TREE 、GRID、FORM、BOX、MENU、DIALOG、AJAX。都很漂亮的。

    operamasks-ui-2.0.zip

    在实际应用中,OperaMasks UI 2.0常被用于企业级管理系统的构建,尤其在财务、人力资源、供应链等领域。与金蝶的其他产品相结合,如ERP、CRM系统,能够为企业提供一体化的信息管理平台,提升工作效率。 关于...

    operamasks2.1整合spring、hebernate实现grid增删改查

    在这个项目中,grid可能是由OperaMasks提供的,用户可以通过这个grid查看数据库中的数据,同时进行添加、修改和删除操作。 “crud”代表了数据库操作的四种基本功能:创建(Create)、读取(Read)、更新(Update)...

    operamasks整合spring、hibernate实现grid增删改查

    在IT行业中,Web开发是一项核心任务,而"operamasks整合spring、hibernate实现grid增删改查"是常见的Web应用开发实践。这个主题涵盖了多个关键的技术组件,包括OperaMasks、Spring框架和Hibernate持久化层,以及Grid...

    operamasks-ui

    "Operamasks-UI" 是一个专为Opera浏览器设计的用户界面增强插件的源代码包,其版本为1.2,存储在一个名为"operamasks-ui-1.2.zip"的压缩文件中。这个插件的目标是提供更加个性化、高效且易用的浏览体验。在了解这个...

    operamasks-ui-2.0-demo--.zip

    通过深入研究这个压缩包中的内容,开发者不仅可以了解Opera Masks UI 2.0的工作原理,还能学习到如何将其应用于自己的Web项目,从而提升用户界面的互动性和吸引力。在实践中,你可以逐步掌握如何利用这个工具来创建...

    operamasks_ui

    OperaMasks UI的标签功能可能包括动态添加和删除标签,以及通过拖放等方式进行排列和组织。 "ui"标签则意味着这是一个用户界面相关的工具或框架,它关注的是交互设计和视觉呈现,确保用户能够直观、舒适地与应用...

Global site tag (gtag.js) - Google Analytics