JBoss Seam如何做到松耦合的架构呢?光有具备上下文的组件模型是不够的。还必须有:
事件模型。事件模型通过事件<-->监听器模式来构建。采用的方式是象JSF方法绑定一样的方式实现。
使用注释和拦截器来纵向切入实现业务逻辑的组件,从而达到松耦合的事件触发和响应
JBoss Seam的组件模型本身就是为事件驱动的应用来设计的。这些事件都是通过JSF的表达式语言的方法绑定来映射的。在JBoss Seam中,事件可以分为:
JSF事件,例如:<h:commandButton value="Click me!" action="#{helloWorld.sayHello}"/> JSF的按钮绑定动作
jBPM状态转移事件,例如:<start-page name="hello" view-id="/hello.jsp"> <transition to="hello"> <action expression="#{helloWorld.sayHello}"/> </transition></start-page> jBPM流程或页面流定义
Seam页面动作,页面事件发生在我们渲染一个页面之前,我们通过在WEB-INF/pages.xml文件中配置页面动作。我们可以为一个特定的JSF视图ID (View ID)设定一个页面动作,例如:<pages> <page view-id="/hello/hello.jsp" action="#{helloWorld.sayHello1}"/></pages>
我们也可以使用通配符为一个页面模式设定页面动作,例如:
<pages> <page view-id="/hello/*" action="#{helloWorld.sayHello2}"/></pages>
如果多个页面动作匹配当前的页面视图的话,那么所有动作按照最窄到最宽泛的顺序依次调用
例如上述sayHello1,sayHello2动作都和hello.jsp匹配,那么在hello.jsp页面上先调用
sayHello1然后调用sayHello2。页面动作可以返回一个JSF的输出outcome,如果outcome
不为null的话,Seam将使用定义好的规则去导向到一个视图。更棒的是page元素中的视图
view-id可以不是JSP页面或者Facelet页面,允许我们通过view-id来整合基于动作的Struts
或者Webwork框架。你可以使用action元素指定多个条件页面动作(在某种条件下才执行的动作)
例如:
<pages> <page view-id="/hello.jsp"> <action execute="#{helloWorld.sayHello}" if="#{not validation.failed}"/> <action execute="#{hitCount.increment}"/> </page></pages>
Seam组件驱动的事件,Seam组件之间可以直接通过方法调用来相互沟通。有状态的组件可以实现观察者模式。虽然如此,Seam提供的组件驱动的事件比直接通过方法调用更加松耦合。我们来看一下如何设置组件驱动的事件。我们可以在components.xml文件中设置事件监听器(观察者):<components> <event type="hello"> // 设置事件, Observable <action execute="#{helloListener.sayHelloBack}"/> // 设置监听器,Observer <action execute="#{logger.logHello}"/> // 设置监听器,Observer </event></components> 你可能想问事件类型type="hello"是什么,它只是一个任意的字串。事件类型将在组件驱动事件的时候使用
(raiseEvent)。当事件发生时,在事件中注册的动作将根据在components.xml文件中的次序依次调用。你可能要问:我如何
在组件中触发一个事件呢?基本上,你有两种选择:使用内置的组件和通过注释。下列代码在运行HelloWord的sayHello方法时
触发事件类型为"hello"的事件(在components.xml文件中配置):
@Name("helloWorld")public class HelloWorld { public void sayHello() { FacesMessages.instance().add("Hello World!"); Events.instance().raiseEvent("hello"); // Events 内置组件 触发hello事件 }}
@Name("helloWorld")public class HelloWorld { @RaiseEvent("hello") // 注释 触发hello事件 public void sayHello() { FacesMessages.instance().add("Hello World!"); }}
我们看到HelloWorld的sayHello方法其实是事件的产生者。值得注意的是事件的产生者和事件的消费者
(监听者)没有任何依赖性,例如下面的hello监听器和上述的HelloWord没有依赖:
@Name("helloListener") // 在components.xml文件的hello事件中注册的监听者public class HelloListener { public void sayHelloBack() { // 当hello事件触发后,监听者调用该监听方法 FacesMessages.instance().add("Hello to you too!"); }}
注意:如果你讨厌在components.xml文件配置太多事件和监听器,那么你也可以使用注释来配置:
@Name("helloListener")public class HelloListener { @Observer("hello") // 指明使用sayHelloBack方法来监听hello事件 public void sayHelloBack() { FacesMessages.instance().add("Hello to you too!"); }}
到这里你会发现我们根本没有用事件对象!实际上,事件产生者和事件消费者之间根本不必有事件对象来
处理状态的问题。状态问题由Seam的上下文处理了,并且在Seam组件之间共享!
不过,你要真的想要一个事件对象,可以象这样:
@Name("helloWorld") // 事件产生者public class HelloWorld { private String name; public void sayHello() { FacesMessages.instance().add("Hello World, my name is #0.", name); Events.instance().raiseEvent("hello", name); // name是String参数,传递多个Object参数 }}
@Name("helloListener") // 事件监听者public class HelloListener { @Observer("hello") public void sayHelloBack(String name) { FacesMessages.instance().add("Hello #0!", name); }}
Seam具有上下文的事件,Seam本身定义了一系列内置的事件。注意这些事件的名称都是字符串定义的:
Seam组件可以监听(观察)这些事件,就像他们观察组件驱动的事件一样。我们将在别的文章中专门讲述。
分享到:
相关推荐
《JBoss Seam:超越Java EE的简易与强大》是一本深度探索JBoss Seam框架的权威著作,由Michael Yuan和Thomas Heute共同撰写。本书聚焦于JBoss Seam框架,旨在为读者提供一个全面、深入的理解,以掌握其在企业级应用...
### 关于《Beginning JSF2 APIs and JBoss Seam》的知识点总结 #### 一、书籍简介与背景 《Beginning JSF2 APIs and JBoss Seam》是一本深入介绍JavaServer Faces 2(简称JSF2)及其相关API以及JBoss Seam框架的...
2. **事件(Events)**: 事件模型是Seam的一大特色,允许组件之间通过发布和监听事件进行通信,增强了组件间的解耦合。 3. **注入(Injection)**: Seam支持依赖注入,可以将一个组件的实例自动注入到其他组件中,...
2. **工作原理**:详细讲解了Seam在注册过程中所涉及的核心概念和技术细节,比如事件处理机制、组件通信方式等。 ##### 1.3 Seam中的可点击列表:消息示例 本示例通过实现一个简单的消息列表功能,演示了Seam中...
这本书深入浅出地介绍了如何使用Seam进行实际项目开发,涵盖了Seam的核心概念、组件模型、事件驱动机制、持久化处理以及与富客户端框架如RichFaces的集成等内容。通过这本书,读者可以全面理解Seam框架的精髓,提升...
- **会话管理**:Seam 的会话管理机制使得应用能够处理长时间的交互过程。 - **会话生命周期**:详细解释了会话的创建、维护和销毁过程。 **1.6.4 Seam UI 控制库** - **控件组件**:Seam 提供了一系列 UI 控件,...
- **理解Seam对话**:深入探讨了Seam对话机制的工作原理及其在多步骤交互中的应用。 - **Seam UI控件库**:介绍了一套专门为Seam设计的UI控件,用于增强用户界面的功能性。 - **Seam调试页面**:提供了一个调试工具...
Seam不仅仅是一个集成框架,它拥有自己的状态管理机制,允许框架之间通过注解和EL表达式实现深度整合。Seam的开发者对第三方框架有着深刻的理解,因此能够更好地将它们融合在一起,而不仅仅是简单的拼接。例如,Seam...
2. **参与社区讨论**:加入JBoss Seam相关的开发者社区或论坛,与其他开发者交流心得,可以获得宝贵的反馈和建议。 3. **参考官方文档**:除了本书之外,还应该经常查阅官方文档,以便了解最新的更新和发展趋势。 4....
- 事件处理:Seam提供了一种强大的事件发布和订阅机制,允许组件之间通过事件进行通信。 - 集成性:与JSF、EJB、Hibernate等Java EE技术无缝集成,简化了开发流程。 二、Seam 2.0的主要组件和服务 2.1 JSF(Java...
《从新手到专业:JBoss Seam入门指南》一书由Joseph Faisal Nusairat撰写,旨在引导读者学习并掌握JBoss Seam这一强大的开源轻量级Java EE5应用框架,从而构建企业级和下一代Web 2.0应用程序。本书不仅适合初学者,...
JBoss Seam 是一款开源的Java框架,主要用于简化企业级Java应用程序的开发,它结合了JSF(JavaServer Faces)和EJB(Enterprise JavaBeans)等技术,提供了强大的组件模型和事件驱动机制。Seam工程的创建是开发Seam...
JBoss Seam通过其强大的上下文管理和事件模型实现了这一点。它允许开发者在不使用XML配置的情况下声明依赖关系,提供了强大的依赖注入(DI)机制。此外,Seam还支持基于组件的事件传播,使得组件之间可以通过事件进行...
- **工作原理**:深入探讨了示例中使用的 Seam 特性,如事件处理机制和页面流。 ##### 1.4 Seam 和 jBPM:待办事项列表示例 - **代码理解**:展示了如何集成 Seam 和 jBPM 这两个框架,实现一个简单的待办事项列表...
**JBoss Seam 学习资源概述** JBoss Seam 是一个开源的应用程序框架,它整合了JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Java Persistence API (JPA) 和其他Java EE技术,旨在简化开发过程,提高开发...
- **事件系统**:事件是Seam中的重要概念,它允许组件之间通过事件来进行通信,提高了组件之间的解耦性。 - **转换器和验证器**:Seam内置了丰富的转换器和验证器,用于处理数据类型转换和输入验证,简化了开发者的...
2. **事件驱动**:Seam的事件模型允许组件之间通过发布和监听事件进行通信,这种松耦合的方式提高了代码的可维护性和可扩展性。 3. **表达式语言**:Seam支持JSF EL(JavaServer Faces Expression Language)和Seam...