`
yingfang05
  • 浏览: 123347 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

配置Seam组件之二

    博客分类:
  • jsf
阅读更多
如果你有大量的组件需要在XML中进行配置,那么就很有必要将 components.xml 文件中的内容分散到多个文件中去。 Seam允许你把类(例如名为 com.helloworld.Hello )的配置放到一个资源中(名为com/helloworld/Hello.component.xml)。 (你对这种模式可能很熟悉,因为它与我们在Hibernate中使用的相同)。 文件的根元素应该是 <components> 或者 <component> 。

第一个选项允许你在一个文件中定义多个组件:

<components>
    <component class="com.helloworld.Hello" name="hello">
        <property name="name">#{user.name}</property>
    </component>
    <factory name="message" value="#{hello.message}"/>
</components>
第二个选项只允许你定义或者配置单个组件,不过麻烦会少一点:

<component name="hello">
    <property name="name">#{user.name}</property>
</component>
在第二个选项中,类名与组件定义所在的文件是一致的。

你还可以选择将所有类的配置都放在 com/helloworld/components.xml 的 com.helloworld 包中。

可配置的属性类型
String的属性、基本类型以及基本类型的包装类型可以像我们期望的那样进行配置:

org.jboss.seam.core.manager.conversationTimeout 60000
<core:manager conversation-timeout="60000"/>
<component name="org.jboss.seam.core.manager">
    <property name="conversationTimeout">60000</property>
</component>
也支持由String或者基本类型构成的数组、Set和List:

org.jboss.seam.bpm.jbpm.processDefinitions order.jpdl.xml, return.jpdl.xml, inventory.jpdl.xml
<bpm:jbpm>
    <bpm:process-definitions>
        <value>order.jpdl.xml</value>
        <value>return.jpdl.xml</value>
        <value>inventory.jpdl.xml</value>
    </bpm:process-definitions>
</bpm:jbpm>
<component name="org.jboss.seam.bpm.jbpm">
    <property name="processDefinitions">
        <value>order.jpdl.xml</value>
        <value>return.jpdl.xml</value>
        <value>inventory.jpdl.xml</value>
    </property>
</component>
甚至也支持那些包含String值为键、String或者基本类型值的Map:

<component name="issueEditor">
    <property name="issueStatuses">
        <key>open</key> <value>open issue</value>
        <key>resolved</key> <value>issue resolved by developer</value>
        <key>closed</key> <value>resolution accepted by user</value>
    </property>
</component>
最后,你可以利用值绑定表达式来将所有的组件装配起来。 注意这与使用 @In 注解进行注入非常不同,因为它是在组件初始化而不是被调用时起作用的。 因而它与传统的IoC容器例如JSF或者Spring所提供的依赖注入功能非常非常类似。

<drools:managed-working-memory name="policyPricingWorkingMemory" rule-base="#{policyPricingRules}"/>
<component name="policyPricingWorkingMemory"
          class="org.jboss.seam.drools.ManagedWorkingMemory">
    <property name="ruleBase">#{policyPricingRules}</property>
</component>
使用XML命名空间
纵观整个示例,有两种完全不同的声明组件的方式:使用或者不使用XML命名空间。 下面的示例展示了一个典型的 components.xml 文件,它没有使用命名空间,而是使用Seam Components DTD:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
            xsi:schemaLocation="http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd">

    <component class="org.jboss.seam.core.init">
        <property name="debug">true</property>
        <property name="jndiPattern">@jndiPattern@</property>
    </component>

</components>
正如你所见,这样的配置有点繁琐。更糟的是,这些组件和属性的名称在开发时是无法被校验的。

使用命名空间的配置看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://jboss.com/products/seam/components"
            xmlns:core="http://jboss.com/products/seam/core"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation=
                "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.0.xsd
                 http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.0.xsd">

    <core:init debug="true" jndi-pattern="@jndiPattern@"/>

</components>
虽然Schema的声明很繁琐,不过实际的XML内容是清晰而简单易懂的。 Schema提供了关于每个可用组件和属性的详细信息,这使得XML编辑器可以发挥其自动完成的功效。 所以,使用命名空间的元素使生成和维护正确的 components.xml 文件都变得更加简单。

现在,这种方式对于Seam内建的组件工作得很好,但是对于用户自定义的组件又如何呢? 这里有两种选择:第一种,Seam支持两种模型的混合使用,允许使用普通的 <component> 声明来配置用户自定义的组件,同时也使用命名空间来配置内置组件。 不过更好的方法是,Seam允许你快速地为你自己的组件声明命名空间。

任何Java包都可以通过用 @Namespace 注解该包,而与XML命名空间而关联起来。 (包级别的注解是在一个名为 package-info.java 的文件中声明的,该文件处于包的同级目录下)。 下面是一个来自seampay演示的例子:

@Namespace(value="http://jboss.com/products/seam/examples/seampay")
package org.jboss.seam.example.seampay;

import org.jboss.seam.annotations.Namespace;
这样,你就可以在 components.xml 中使用命名空间的方式了!现在,你可以这么写:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:pay="http://jboss.com/products/seam/examples/seampay"
            ... >

    <pay:payment-home new-instance="#{newPayment}"
                      created-message="Created a new payment to #{newPayment.payee}" />

    <pay:payment name="newPayment"
                 payee="Somebody"
                 account="#{selectedAccount}"
                 payment-date="#{currentDatetime}"
                 created-date="#{currentDatetime}" />
     ...
</components>
或者:

<components xmlns="http://jboss.com/products/seam/components"
            xmlns:pay="http://jboss.com/products/seam/examples/seampay"
            ... >

    <pay:payment-home>
        <pay:new-instance>"#{newPayment}"</pay:new-instance>
        <pay:created-message>Created a new payment to #{newPayment.payee}</pay:created-message>
    </pay:payment-home>

    <pay:payment name="newPayment">
        <pay:payee>Somebody"</pay:payee>
        <pay:account>#{selectedAccount}</pay:account>
        <pay:payment-date>#{currentDatetime}</pay:payment-date>
        <pay:created-date>#{currentDatetime}</pay:created-date>
     </pay:payment>
     ...
</components>
这些示例展示了命名空间元素的两种使用模式。 在第一个声明中,<pay:payment-home> 指向 paymentHome 组件。

package org.jboss.seam.example.seampay;
...
@Name("paymentHome")
public class PaymentController
    extends EntityHome<Payment>
{
    ...
}
元素的名称是连字符号(-)形式的组件名称。元素的属性是连字符号(-)形式的属性名称。

在第二个声明中,<pay:payment> 元素指向 org.jboss.seam.example.seampay 包中的 Payment 类。 在这个例子中,Payment 是一个被定义成Seam组件的实体。

package org.jboss.seam.example.seampay;
...
@Entity
public class Payment
    implements Serializable
{
    ...
}
如果我们需要用户自定义组件的验证和自动完成功能,我们就需要一个Schema。 目前Seam还无法提供为一组组件自动生成Schema的机制,所以你必需手工生成。标准Seam包的Schema定义可以当作示范。
分享到:
评论

相关推荐

    JBOSS SEAM组件中文手册

    **JBoss Seam组件中文手册** **一、Seam框架概述** Seam是一个开源的企业级Java框架,由JBoss公司开发,旨在简化Java EE应用程序的开发。它将多种技术如JavaServer Faces (JSF),Java Persistence API (JPA),EJB 3...

    JBoss Seam 工作原理、seam和hibernate的范例、RESTFul的seam、seam-gen起步、seam组件、配置组件、jsf,jboss、标签、PDF、注解等等

    Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................

    seam_in_action

    - **第5章:Seam组件描述符**:介绍如何使用 Seam 组件描述符来定义组件的行为和配置。 - **第6章:绝对控制反转**:详细介绍 Seam 的绝对控制反转机制,以及它如何优化组件间的依赖管理。 ### 三、Seam的特点与...

    JSF项目中seam的配置

    在JSF项目中配置Seam,可以充分利用其优势,如组件管理、对话管理、事件处理等。 首先,配置Seam的关键在于以下几个方面: 1. **阶段监听器配置**:在`faces-config.xml`中添加`SeamPhaseListener`。这是Seam启动...

    seam2 in tomcat lib

    4. **部署上下文**:Seam2通常假设在JNDI下可以找到其组件和服务,但在Tomcat中,你可能需要创建一个名为`META-INF/components.xml`的文件来声明和配置Seam组件。 5. **测试和调试**:在Tomcat中运行Seam应用可能...

    Seam-语境相关的组件

    这些组件可以通过声明式的方式进行配置,减少了XML配置文件的工作量,使得开发者可以更加专注于业务逻辑。 Seam还引入了事件驱动的编程模型,允许组件之间通过发布和订阅事件进行通信。这种模式增强了松耦合性,...

    seam 的eclipse工程例子3

    4. 编写Seam组件:Seam组件是应用程序的核心部分,它们可以是JSF页面上的UI组件,也可以是业务逻辑层的服务组件。通过使用`@Name`注解来定义组件名,`@In`和`@Out`注解来注入和暴露依赖。 5. 创建JSF页面:Seam与...

    Configuring Seam and packaging Seam applications

    这涉及到在web.xml文件中配置Seam Filter和Seam Listener,以便处理JSF请求生命周期中的事件,并确保Seam组件与JSF页面正确交互。 #### 1.1.2. 使用Facelets Facelets是JSF推荐的视图表示技术,提供了更简洁、可...

    jboss seam 学习资料,seam in action和官方手册

    9. **国际化与本地化**:学习如何配置Seam进行多语言支持。 10. **实用工具**:包括邮件服务、定时任务、PDF生成等功能的使用说明。 通过阅读这些材料,开发者可以全面了解和掌握JBoss Seam框架,提升其在企业级...

    seam+spring+hibernate+richfaces配置

    2. **配置Seam**:在seam.properties文件中指定Hibernate配置,如数据源、实体扫描路径等。 3. **配置Spring**:创建Spring的bean配置文件,定义需要的bean,如DataSource、SessionFactory、TransactionManager等,...

    Jboss Seam中文版

    #### 第四章:配置Seam组件 最后一章重点介绍了如何通过配置文件和注解等方式来定制Seam组件的行为。 1. **通过属性设置配置组件**:说明了如何使用属性来调整组件的默认行为。 2. **后续内容预告**:预览了接下来...

    Seam_Java框架.doc

    首先,Seam的核心设计理念在于减少不必要的分层,它将常见的Web层、业务层和持久层融合为两层:JSF(JavaServer Faces)视图层和Seam组件层。Seam组件分为Entity Bean和Session Bean两类。Entity Bean对应数据库表,...

    Seam2.0GA 中文开发指南

    `components.xml` 文件是Seam应用的核心配置文件之一,它定义了Seam组件的元数据信息,包括组件的名称、范围、拦截器等。 **1.2.1.5 Web部署描述文件:web.xml** `web.xml` 文件是Web应用的部署描述文件,它定义了...

    Seam框架文档简述

    #### 二、Seam框架的特点 ##### 1. 支持JSF和丰富的组件库 Seam支持JSF标准,这意味着开发者可以直接使用JSF提供的丰富UI组件。此外,Seam还扩展了JSF的功能,提供了更多定制化和高级的组件,以满足复杂应用的需求...

    jboss seam 2.01GA REF DOC

    - 此文件定义了 Seam 组件的配置。 - 包括组件的生命周期管理、依赖注入等设置。 - **1.2.1.5 Web 部署描述符:web.xml** - `web.xml` 文件配置了应用的基本信息,如 servlet 映射等。 - 定义了 JSF 和 Seam ...

    seam参考手册中文版

    #### 四、Seam组件配置 ##### 配置方式 - **通过属性设置**: 在组件类中直接定义属性值。 - **通过components.xml文件**: 更灵活地配置组件行为,无需修改源代码。 - **细粒度配置文件**: 为特定组件或组件组提供...

    Seam - 语境相关的组件 .pdf

    接着,通过注册示例详细展示了Seam的基础结构,包括实体Bean(如User)、无状态和有状态会话Bean、Seam组件部署描述文件(components.xml)、Web部署描述文件(web.xml)、JSF配置、EJB部署描述文件、持久化部署描述...

    jsf+seam+jpa实例

    2. **Seam组件创建**:创建Seam组件,这些组件通常对应于业务服务,负责业务逻辑的实现。Seam的依赖注入特性使得这些组件可以轻松地获取和操作JPA实体。 3. **JSF页面构建**:使用JSF组件库创建用户界面,这些组件...

    为Seam做好准备

    理解如何配置Seam项目以及依赖管理是非常重要的。 7. **开发环境**:使用Seam通常需要IDE支持,如NetBeans、Eclipse等,熟悉IDE的使用可以提高开发效率。同时,确保安装了JDK和对应的Java EE服务器,如Glassfish或...

Global site tag (gtag.js) - Google Analytics