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

第5章 配置Seam组件

阅读更多

第5章 配置Seam组件

 

Seam中,极小化的基于XML配置的价值体系是非常强壮的。不过,为什么我们想使用XML配置一个Seam组件,有多种理由:从Java代码分离出特定部署信息,使可重用框架的创作成为可能,配置Seam的内建功能,等等。Seam提供两个基本的方法配置组件:用一个属性文件设置属性或者用web.xml进行配置;通过components.xml进行配置。

 

5.1.通过设置属性配置组件

 

能够通过servlet上下文参数,或通过在类路径的根目录下的一个文件:seam.properties,两个方法之一给Seam组件提供配置属性。

 

可配置的Seam组件必须暴露JavaBeans类属性setter方法给可配置属性。如果一个Seam组件名为com.jboss.myapp.settings有一个setter方法名为setLocale(),我们能够提供一个名为com.jboss.myapp.settings.locale的属性在seam.properties文件内,或者用一个servlet上下文参数,只要Seam实例化组件,它会设置locale属性的值。

 

同样的机制常用来配置Seam自已。例如,设置对话空闲时间,我们用web.xml  或者  seam.propertiesorg.jboss.seam.core.manager.conversationTimeout提供一个值(有一个名为org.jboss.seam.core.managerSeam组件带有一个名为setConversationTimeout()setter方法)。

 

5.2.通过components.xml配置组件

 
components.xml文件比属性设置更有威力。它让你:

 
*
配置已经自动安装的组件——包括内建组件和Seam部署扫描已获得的用@Name注释了的组件。

 
*
安装没有@Name注释的类作为Seam组件——对确定结构类型组件这是最有用的,它能以不同的名字多次被安装(例如,Seam管理持久化上下文)。

 
*
除安装有@Name注释的组件之外,缺省是不安装的,因为@Install注释标明组件不会被安装。

 
*
覆盖组件的范畴。

components.xml 文件可能会出现在三种不同的地方:

* 一个war 文件的WEB-INF目录。

* 一个jar包文件的META-INF 目录。

* 一个jar包文件中包含有@Name 注释的类的任一目录。

 
通常,当部署扫描发现参与在seam.properties文件或在META-INF/components.xml文件的文档中一个带有@Name注释类时,Seam组件被安装。(除非组件有一个@Install注释标明它在缺省时不安装。)components.xml文件让我们处理特殊情况,我们需要覆盖注释的地方。

例如,下面的components.xml文件安装jBPM

 
<components xmlns="http://jboss.com/products/seam/components"

            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

            xmlns:bpm="http://jboss.com/products/seam/bpm">

    <bpm:jbpm/>

</components>

 

这个例子做同样的事情:

 
 <components>

    <component class="org.jboss.seam.bpm.Jbpm"/>

</components>

 

这是一个安装,配置了两个不同的Seam管理持久化上下文:

 
<components xmlns="http://jboss.com/products/seam/components"

            xmlns:persistence="http://jboss.com/products/seam/persistence"

    <persistence:managed-persistence-context name="customerDatabase"

                       persistence-unit-jndi-name="java:/customerEntityManagerFactory"/>

       

    <persistence:managed-persistence-context name="accountingDatabase"

                       persistence-unit-jndi-name="java:/accountingEntityManagerFactory"/>           

</components>

 

这一个也是做一样的事:

 
 <components>

    <component name="customerDatabase"

              class="org.jboss.seam.persistence.ManagedPersistenceContext">

                <property  name="persistenceUnitJndiName">java:/customerEntityManagerFactory</

property>

    </component>

   

    <component name="accountingDatabase"

              class="org.jboss.seam.persistence.ManagedPersistenceContext">

        <property name="persistenceUnitJndiName">java:/accountingEntityManagerFactory</

property>

    </component>

</components>

 

这个例子创建了一个会话范围的Seam管理持久化上下文(在实践中,这是不被推荐的):

 
<components xmlns="http://jboss.com/products/seam/components"

            xmlns:persistence="http://jboss.com/products/seam/persistence"

  <persistence:managed-persistence-context name="productDatabase"

                                          scope="session"

                     persistence-unit-jndi-name="java:/productEntityManagerFactory"/>       

</components>

 

<components>

              <component name="productDatabase"

              scope="session"

              class="org.jboss.seam.persistence.ManagedPersistenceContext">

        <property name="persistenceUnitJndiName">java:/productEntityManagerFactory</property>

    </component>

</components>

 

对象持久上下文的这样的结构对象使用自动创建选项是普通的,节省了当你使用@In注释时明确指定create=true

 
<components xmlns="http://jboss.com/products/seam/components"

            xmlns:persistence="http://jboss.com/products/seam/persistence"

  <persistence:managed-persistence-context name="productDatabase"

                                    auto-create="true"

                     persistence-unit-jndi-name="java:/productEntityManagerFactory"/>       

</components>

 

<components>

              <component name="productDatabase"

        auto-create="true"

              class="org.jboss.seam.persistence.ManagedPersistenceContext">

        <property name="persistenceUnitJndiName">java:/productEntityManagerFactory</property>

    </component>

</components>

 

<factory>声明让你指定一个值或一个方法,在它第一次被引用时,其捆绑的表达式,求得上下文变量的初始化值。

 

<components>

        <factory  name="contact"  method="#{contactManager.loadContact}"

 scope="CONVERSATION"/>

</components>

 

你也能为一个Seam组件创建一个“别名”(第二个名字),像这样:

 

 <components>

    <factory name="user" value="#{actor}" scope="STATELESS"/>

</components>

 

你甚至能为一个普通使用的表达式创建一个“别名”:

 

 <components>

    <factory name="contact" value="#{contactManager.contact}" scope="STATELESS"/>

</components>

 

伴有auto-create="true"<factory>声明的使用尤其普遍:

 

<components>

    <factory name="session" value="#{entityManager.delegate}" scope="STATELESS" auto-

create="true"/>

</components>

 

有时候,在部署和测试两个期间,我们想重用有很小变化的components.xml文件。Seam让你在components.xml文件设置@wildcard@通配符,在部署期间,用你的Ant构建脚本或用在类路径中的名为components.properties文件提供的内容替换它。你会在Seam例子中看到这种方法的使用。

 

 

5.3. 细粒度配置文件

 

如果你有大量的组件,需要用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 >

    <property name="name">#{user.name}</property>

</component>

 

在第二个选项里,类名字被组件定义显示的那个文件暗示。

 

作为选择,你可能在com/helloworld/components.xml里为com.helloworld包内所有类设置配置。

 

5.4. 可配置属性类型

 

字符串属性,原始的或原始包裹类型可以象你希望那样被配置:

 

org.jboss.seam.core.manager.conversationTimeout 60000

 

<core:manager conversation-timeout="60000"/>

 

<component >

    <property name="conversationTimeout">60000</property>

</component>

 

数组,集和字符链表或者原始的类型也被支持:

 

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 >

    <property name="processDefinitions">

        <value>order.jpdl.xml</value>

        <value>return.jpdl.xml</value>

        <value>inventory.jpdl.xml</value>

    </property>

</component>

 

甚至,带有字符值键和字符或原始类的值的映射也被支持:

 

<component >

    <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(倒置控制)如JSFSpring提供的依赖注入方法。

 

<drools:managed-working-memory  name="policyPricingWorkingMemory"  rule-base="#{policyPricingRules}"/>

 

<component

          class="org.jboss.seam.drools.ManagedWorkingMemory">

    <property name="ruleBase">#{policyPricingRules}</property>

</component>

 

5.5. 使用 XML 命名空间

 

全部例子,存在两个声明组件的相竞争的方法:用和不用XML 命名空间。下面是显示了一个典型的没有使用命名空间的components.xml文件:

 

<?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.1.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.1.xsd

                 http://jboss.com/products/seam/components http://jboss.com/products/seam/

components-2.1.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计划定义能用来做为指导。

 

下面是Seam使用的命名空间:

* components — http://jboss.com/products/seam/components

* core — http://jboss.com/products/seam/core

* drools — http://jboss.com/products/seam/drools

* framework — http://jboss.com/products/seam/framework

* jms — http://jboss.com/products/seam/jms

* remoting — http://jboss.com/products/seam/remoting

* theme — http://jboss.com/products/seam/theme

* security — http://jboss.com/products/seam/security

* mail — http://jboss.com/products/seam/mail

* web — http://jboss.com/products/seam/web

* pdf — http://jboss.com/products/seam/pdf

* spring — http://jboss.com/products/seam/spring

分享到:
评论

相关推荐

    seam_in_action

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

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

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

    Manning Seam in Action 2008

    - **第5章:Seam组件描述符**(P179) - 介绍Seam组件描述符的作用及配置方法。 - 分析如何通过组件描述符来定制组件行为。 - **第6章:绝对控制反转**(P219) - 讨论Seam中依赖注入的特点。 - 分析如何利用...

    Jboss Seam中文版

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

    seam in action中文第一章

    Seam in Action 是一本关于Seam框架的专业书籍,中文版的第一章主要介绍了Seam的核心理念和价值。Seam是一个革命性的Java EE应用框架,旨在通过整合现有的Java企业级技术,如EJB3、JSF、JPA和Hibernate,提供一个...

    jboss seam 2.01GA REF DOC

    #### 第五部分:完整的 Seam 应用示例 本节通过一个酒店预订系统示例展示了如何使用 Seam 开发复杂的应用程序。 **1.6.1 简介** - **应用场景**:酒店预订系统是一个典型的电子商务应用。 - **功能需求**:包括...

    JBoss Seam: Simplicity and Power Beyond Java EE

    - **第五章:工作空间(Workspaces)** - **并发对话**:探讨如何在同一个会话中同时处理多个对话,以实现更复杂的用户交互。 - **案例研究**:通过具体的案例来展示工作空间在实际项目中的应用。 #### 四、URL...

    jboss seam 中文文档

    #### 五、Seam 组件配置 - **通过属性设置来配置组件**:可以通过配置文件或者注解的方式为组件指定各种属性值。 - **条件安装**:允许根据一定的条件动态地决定是否安装某个组件,这对于定制化需求非常有用。 - **...

    seam in action

    Seam组件描述符用于描述组件的元数据,包括组件的类型、属性、事件处理等信息。这些描述符通常通过注解的形式添加到类上,使得Seam能够自动识别并配置组件。 **6. 绝对控制反转** 绝对控制反转是Seam的一个重要...

    seam2.0 中文文档

    - **JSF和Seam的集成**:讲解如何在JSF页面中使用Seam组件,以及如何绑定JSF组件到业务逻辑。 - **持久性**:详细阐述Seam如何与JPA集成,以及如何进行数据访问和对象关系映射。 - **安全性**:描述Seam的安全特性和...

    Seam in Action - MEAP - 2008

    - **描述符的作用**:Seam 组件描述符是一种用于定义组件行为和特性的机制,它可以帮助开发者更高效地管理和配置组件。 - **注解支持**:Seam 组件描述符大量依赖于注解,使得组件的定义更加简洁直观。 5. **...

    JBoss Seam工程的创建

    1. **配置seam-gen**:进入`jboss-seam-2.0.x`目录,运行`seam setup`命令。这会引导你进行一系列配置,包括指定Eclipse工作空间的位置、JBoss AS的安装路径、项目名称、是否需要集成Ajax库、以及工程的部署类型等。...

    自己做的seam例子

    `sayHello`可能是通过一个Seam组件实现,当触发某个事件(例如页面加载或按钮点击)时,会显示问候语。 4. **文件名“复件 seam813”**:这可能是Seam项目的某个版本或者特定构建的备份文件。Seam的版本号通常包含...

    seam_reference.pdf

    - **组件部署描述符** (`components.xml`):配置了Seam组件及其依赖关系。 - **Web部署描述符** (`web.xml`):配置了Web应用的基本设置。 - **JSF配置** (`faces-config.xml`):配置了JSF组件及其生命周期管理。 - *...

    seam_reference英文文档,讲解Seam更详细

    Seam框架旨在简化企业级Java应用程序的开发过程,通过提供一系列高级功能,如上下文感知组件(Contextual Components)、会话管理(Conversations)、页面流(Page Flow)等,帮助开发者构建更为灵活、高效的应用...

    seam经典教程含例子

    5. **Seam与JSF的整合**:展示如何通过Seam实现JSF组件的扩展和增强,以及数据绑定和事件处理。 6. **Seam的其他特性**:如Infinispan缓存支持、FacesContext的扩展、国际化的处理等。 7. **实战例子**:提供具体的...

    Jboss seam2.1版本开发参考文档

    5. **Seam页面流:猜数字游戏示例** - **理解代码:** 分析了猜数字游戏的实现代码,包括页面流控制逻辑。 - **工作原理:** 详细解释了页面流的概念及其在游戏逻辑中的应用。 6. **完整的Seam应用:酒店预订示例...

    基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》摘要

    - **定义**:为了使Seam组件能够利用bijection功能,需要将其注册到Seam容器中。 - **实现**:通过使用`@Name`等注解来注册组件,并定义其生命周期。 - **示例**: ```java @Name("exampleComponent") public ...

    Seam_2.0_Reference_zh_CNpdf

    Seam是一个开源框架,它通过提供一系列高级功能,如会话管理、业务逻辑组件化、Ajax支持等,简化了基于Java EE的应用程序开发。Seam的核心特性包括:整合JSF、EJB、JPA等技术;支持富客户端交互(Ajax);提供了强大...

    Beginning.JBoss.Seam.Feb.2007

    - **集成性**:JBoss Seam可以很好地与其他JBoss项目(如JBoss EAP、JBoss Portlet Bridge等)以及第三方技术集成。 - **国际化支持**:内置了国际化(i18n)和本地化(l10n)的支持,使得开发多语言应用变得更加...

Global site tag (gtag.js) - Google Analytics