- 浏览: 79825 次
- 性别:
- 来自: 重庆
最新评论
-
禀圣含华:
怎么弄空格呢?___________然后我固定这些空格,怎么弄 ...
第18章. iText PDF 生成 -
super0555:
managed
第13章 Seam 应用程序框架 -
Javakeith:
代码呢?共享下代码呗!
第18章. iText PDF 生成 -
tonyshen277:
同感啊。还在做Win32下的开发,楼主所说的一个都不能少啊。
转自baidu wqqq 给软件开发初学者 -
kdboy:
的确,把人放在宇宙中去看,从上帝的眼中去看,人的确是非常渺小, ...
人生是什么
第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.properties为org.jboss.seam.core.manager.conversationTimeout提供一个值(有一个名为org.jboss.seam.core.manager的Seam组件带有一个名为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(倒置控制)如JSF或Spring提供的依赖注入方法。
<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
发表评论
-
第31章. Seam内建组件
2009-05-28 11:51 1459第31章. Seam内建组件 本章描述Seam内建组件 ... -
第30章. Seam注释
2009-05-26 20:21 1593第30章. Seam注释 在你编写一个Seam应用程 ... -
第31章. Seam内建组件
2009-05-26 20:21 1421第31章. Seam内建组件 本章描述Seam内建组件 ... -
第29章. 配置Seam和打包Seam应用程序
2009-05-26 20:19 1537第29章. 配置Seam和打包Seam应用程序 配置 ... -
第28章. Hibernate搜索
2009-05-26 20:17 151828.1. 介绍 如Apache Lucen ... -
第27章. Spring框架集成
2009-05-26 20:16 1392第27章. Spring框架集成 Spring集成 ... -
第26章. Seam和Google网页工具
2009-05-26 20:15 1214第26章. Seam和Google网页工具 ... -
第25章. 远程
2009-05-26 20:15 1268第25章. 远程 Seam 提供了一个从网页远程访 ... -
第24章. Web服务
2009-05-26 20:15 1675第24章. Web服务 Seam 集成了JBossWS, ... -
第23章. 缓存
2009-05-26 20:14 1413第23章. 缓存 在 ... -
第22章. 异步和消息
2009-05-26 20:12 2122第22章. 异步和消息 Seam 使异步执行来自网页请 ... -
第21章. Email
2009-05-26 20:11 1309现在Seam包含一个用于模板和发送邮件的可选组件。 Emai ... -
第 20章. RSS支持
2009-05-26 20:10 818第 20章. RSS支持 20.1. 安装 20.2. ... -
第19章. 微软的Excel 电子表格应用程序支持
2009-05-26 20:07 1821第19章. 微软的Excel 电子表格应用程序支持 S ... -
第18章. iText PDF 生成
2009-05-26 20:01 6471第18章. iText PDF 生成 18.1. 使用PDF ... -
第17章. Seam文本
2009-05-26 19:59 1022第17章. Seam文本 面向协作站点需要一种更有友好的 ... -
第16章. 国际化、本地化和主题
2009-05-26 19:57 1383第16章. 国际化、本地化和主题 Seam使构建国际化应用程 ... -
第15章 安全(2)
2009-05-26 19:56 930第15章 安全(2) 15.5. 错误消息 安全 ... -
第15章 安全(1)
2009-05-26 19:53 97715.1. 概述 Seam安全API为你基于Seam的 ... -
第14章 Seam 和 JBoss 规则
2009-05-26 19:50 1427第14章 Seam 和 JBoss 规则 Seam使从 ...
相关推荐
- **第5章:Seam组件描述符**:介绍如何使用 Seam 组件描述符来定义组件的行为和配置。 - **第6章:绝对控制反转**:详细介绍 Seam 的绝对控制反转机制,以及它如何优化组件间的依赖管理。 ### 三、Seam的特点与...
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
- **第5章:Seam组件描述符**(P179) - 介绍Seam组件描述符的作用及配置方法。 - 分析如何通过组件描述符来定制组件行为。 - **第6章:绝对控制反转**(P219) - 讨论Seam中依赖注入的特点。 - 分析如何利用...
#### 第四章:配置Seam组件 最后一章重点介绍了如何通过配置文件和注解等方式来定制Seam组件的行为。 1. **通过属性设置配置组件**:说明了如何使用属性来调整组件的默认行为。 2. **后续内容预告**:预览了接下来...
Seam in Action 是一本关于Seam框架的专业书籍,中文版的第一章主要介绍了Seam的核心理念和价值。Seam是一个革命性的Java EE应用框架,旨在通过整合现有的Java企业级技术,如EJB3、JSF、JPA和Hibernate,提供一个...
#### 第五部分:完整的 Seam 应用示例 本节通过一个酒店预订系统示例展示了如何使用 Seam 开发复杂的应用程序。 **1.6.1 简介** - **应用场景**:酒店预订系统是一个典型的电子商务应用。 - **功能需求**:包括...
- **第五章:工作空间(Workspaces)** - **并发对话**:探讨如何在同一个会话中同时处理多个对话,以实现更复杂的用户交互。 - **案例研究**:通过具体的案例来展示工作空间在实际项目中的应用。 #### 四、URL...
#### 五、Seam 组件配置 - **通过属性设置来配置组件**:可以通过配置文件或者注解的方式为组件指定各种属性值。 - **条件安装**:允许根据一定的条件动态地决定是否安装某个组件,这对于定制化需求非常有用。 - **...
Seam组件描述符用于描述组件的元数据,包括组件的类型、属性、事件处理等信息。这些描述符通常通过注解的形式添加到类上,使得Seam能够自动识别并配置组件。 **6. 绝对控制反转** 绝对控制反转是Seam的一个重要...
- **JSF和Seam的集成**:讲解如何在JSF页面中使用Seam组件,以及如何绑定JSF组件到业务逻辑。 - **持久性**:详细阐述Seam如何与JPA集成,以及如何进行数据访问和对象关系映射。 - **安全性**:描述Seam的安全特性和...
- **描述符的作用**:Seam 组件描述符是一种用于定义组件行为和特性的机制,它可以帮助开发者更高效地管理和配置组件。 - **注解支持**:Seam 组件描述符大量依赖于注解,使得组件的定义更加简洁直观。 5. **...
1. **配置seam-gen**:进入`jboss-seam-2.0.x`目录,运行`seam setup`命令。这会引导你进行一系列配置,包括指定Eclipse工作空间的位置、JBoss AS的安装路径、项目名称、是否需要集成Ajax库、以及工程的部署类型等。...
`sayHello`可能是通过一个Seam组件实现,当触发某个事件(例如页面加载或按钮点击)时,会显示问候语。 4. **文件名“复件 seam813”**:这可能是Seam项目的某个版本或者特定构建的备份文件。Seam的版本号通常包含...
- **组件部署描述符** (`components.xml`):配置了Seam组件及其依赖关系。 - **Web部署描述符** (`web.xml`):配置了Web应用的基本设置。 - **JSF配置** (`faces-config.xml`):配置了JSF组件及其生命周期管理。 - *...
Seam框架旨在简化企业级Java应用程序的开发过程,通过提供一系列高级功能,如上下文感知组件(Contextual Components)、会话管理(Conversations)、页面流(Page Flow)等,帮助开发者构建更为灵活、高效的应用...
5. **Seam与JSF的整合**:展示如何通过Seam实现JSF组件的扩展和增强,以及数据绑定和事件处理。 6. **Seam的其他特性**:如Infinispan缓存支持、FacesContext的扩展、国际化的处理等。 7. **实战例子**:提供具体的...
5. **Seam页面流:猜数字游戏示例** - **理解代码:** 分析了猜数字游戏的实现代码,包括页面流控制逻辑。 - **工作原理:** 详细解释了页面流的概念及其在游戏逻辑中的应用。 6. **完整的Seam应用:酒店预订示例...
- **定义**:为了使Seam组件能够利用bijection功能,需要将其注册到Seam容器中。 - **实现**:通过使用`@Name`等注解来注册组件,并定义其生命周期。 - **示例**: ```java @Name("exampleComponent") public ...
Seam是一个开源框架,它通过提供一系列高级功能,如会话管理、业务逻辑组件化、Ajax支持等,简化了基于Java EE的应用程序开发。Seam的核心特性包括:整合JSF、EJB、JPA等技术;支持富客户端交互(Ajax);提供了强大...
- **集成性**:JBoss Seam可以很好地与其他JBoss项目(如JBoss EAP、JBoss Portlet Bridge等)以及第三方技术集成。 - **国际化支持**:内置了国际化(i18n)和本地化(l10n)的支持,使得开发多语言应用变得更加...