- 浏览: 122721 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
sunxiangfei91:
引用[*][url][/url]
Spring使用MimeMessageHelper -
lhb3015:
lz, Coder 这个类的代码呢??
Java RSA算法加密 -
b_lee:
顶顶顶 加两个字,再顶
Facelets是JSF更好的外衣 -
zhuqing08:
楼主 Coder 这个类的代码呢?
Java RSA算法加密 -
evajhhot:
貌似不行 有异常
BlazeDS 与Spring集成指南之一
如果你有大量的组件需要在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定义可以当作示范。
第一个选项允许你在一个文件中定义多个组件:
<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定义可以当作示范。
发表评论
-
Seam管理的事务
2010-01-28 15:22 1197EJB会话Bean有声明式事务 ... -
配置Seam组件之一
2010-01-16 20:29 978Seam所崇尚的哲学是XML配 ... -
Seam上下文
2009-12-25 15:23 1018Seam上下文是由框架创建 ... -
JSF和Spring的集成之二
2009-12-23 17:55 944使用框架 1 介绍 这个 ... -
JSF和Spring的集成之一
2009-12-19 20:45 767JSF和Spring集成的资料比较少,原理是获得彼此的上下文引 ... -
Seam配置和Seam应用程序打包之二
2009-11-28 09:15 1293将Seam与你的EJB容器集成 我们需要将 SeamInter ... -
Seam配置和Seam应用程序打包之一
2009-11-20 22:25 1139Seam基本配置 首先,让我们看看每当将Seam和JSF一起使 ... -
用Java Server Faces建立交互式WEB站点
2009-11-07 10:12 638步骤1:开发组件的Java ... -
集成JSF与BEEHIVE PAGE FLOW之二
2009-10-10 21:54 1034从后台bean访问当前页面 ... -
集成JSF与BEEHIVE PAGE FLOW之一
2009-10-07 23:13 996JSF对通过关联组件和事件来构建页面而说是非常棒的,但是,与所 ... -
借助Ajax自动保存JSF表单之二
2009-09-19 12:53 1215创建和发送 Ajax 请求 submitFormData() ... -
借助 Ajax 自动保存 JSF 表单之一
2009-09-13 11:00 1098在客户端获取表单数据 本节将给出一个 JSF 表单,其数据通 ... -
基于AJAX和JSF打造丰富的互联网组件之Weblets篇
2009-09-04 15:08 938为了在JSF开发中联合使用AJAX和Mozilla XUL技术 ... -
JSF 2.0的一个AJAX例子
2009-08-21 10:49 2419首先创建一个ManagedBean用来记录我们提交按钮的数量。 ... -
JSF2.0的页面模版化
2009-08-15 10:28 1732本篇介绍可以与Tapestry相媲美的页面模版化定义。 我 ... -
JSF2.0中自定义组件模型例子
2009-08-11 07:59 1333在本篇介绍中,我们开始接触JSF2.0纳为标准的最重要的特性之 ... -
Java Server Faces 2.0重要新功能以及相关改进简介
2009-08-01 10:00 1086JSF 2.0的最终规范也已经发布了有近一个月了,在近期试 ... -
JSF2: Ajax事件和错误
2009-07-09 09:13 1093JSF2的Ajax支持包含一个 ... -
Facelets是JSF更好的外衣
2009-06-16 15:53 1578是由 Sun 公司在 dev.java.net 上的一个开源项 ... -
JSF里自订验证器
2009-06-06 16:52 931您可以自订自己的验证器,所需要的是实作javax.faces. ...
相关推荐
**JBoss Seam组件中文手册** **一、Seam框架概述** Seam是一个开源的企业级Java框架,由JBoss公司开发,旨在简化Java EE应用程序的开发。它将多种技术如JavaServer Faces (JSF),Java Persistence API (JPA),EJB 3...
Seam - 语境相关的组件[满江红20071230]............................................................................................................................ 1 Java EE 框架...........................
- **第5章:Seam组件描述符**:介绍如何使用 Seam 组件描述符来定义组件的行为和配置。 - **第6章:绝对控制反转**:详细介绍 Seam 的绝对控制反转机制,以及它如何优化组件间的依赖管理。 ### 三、Seam的特点与...
在JSF项目中配置Seam,可以充分利用其优势,如组件管理、对话管理、事件处理等。 首先,配置Seam的关键在于以下几个方面: 1. **阶段监听器配置**:在`faces-config.xml`中添加`SeamPhaseListener`。这是Seam启动...
4. **部署上下文**:Seam2通常假设在JNDI下可以找到其组件和服务,但在Tomcat中,你可能需要创建一个名为`META-INF/components.xml`的文件来声明和配置Seam组件。 5. **测试和调试**:在Tomcat中运行Seam应用可能...
这些组件可以通过声明式的方式进行配置,减少了XML配置文件的工作量,使得开发者可以更加专注于业务逻辑。 Seam还引入了事件驱动的编程模型,允许组件之间通过发布和订阅事件进行通信。这种模式增强了松耦合性,...
4. 编写Seam组件:Seam组件是应用程序的核心部分,它们可以是JSF页面上的UI组件,也可以是业务逻辑层的服务组件。通过使用`@Name`注解来定义组件名,`@In`和`@Out`注解来注入和暴露依赖。 5. 创建JSF页面:Seam与...
这涉及到在web.xml文件中配置Seam Filter和Seam Listener,以便处理JSF请求生命周期中的事件,并确保Seam组件与JSF页面正确交互。 #### 1.1.2. 使用Facelets Facelets是JSF推荐的视图表示技术,提供了更简洁、可...
9. **国际化与本地化**:学习如何配置Seam进行多语言支持。 10. **实用工具**:包括邮件服务、定时任务、PDF生成等功能的使用说明。 通过阅读这些材料,开发者可以全面了解和掌握JBoss Seam框架,提升其在企业级...
2. **配置Seam**:在seam.properties文件中指定Hibernate配置,如数据源、实体扫描路径等。 3. **配置Spring**:创建Spring的bean配置文件,定义需要的bean,如DataSource、SessionFactory、TransactionManager等,...
#### 第四章:配置Seam组件 最后一章重点介绍了如何通过配置文件和注解等方式来定制Seam组件的行为。 1. **通过属性设置配置组件**:说明了如何使用属性来调整组件的默认行为。 2. **后续内容预告**:预览了接下来...
首先,Seam的核心设计理念在于减少不必要的分层,它将常见的Web层、业务层和持久层融合为两层:JSF(JavaServer Faces)视图层和Seam组件层。Seam组件分为Entity Bean和Session Bean两类。Entity Bean对应数据库表,...
#### 二、Seam框架的特点 ##### 1. 支持JSF和丰富的组件库 Seam支持JSF标准,这意味着开发者可以直接使用JSF提供的丰富UI组件。此外,Seam还扩展了JSF的功能,提供了更多定制化和高级的组件,以满足复杂应用的需求...
- 此文件定义了 Seam 组件的配置。 - 包括组件的生命周期管理、依赖注入等设置。 - **1.2.1.5 Web 部署描述符:web.xml** - `web.xml` 文件配置了应用的基本信息,如 servlet 映射等。 - 定义了 JSF 和 Seam ...
#### 四、Seam组件配置 ##### 配置方式 - **通过属性设置**: 在组件类中直接定义属性值。 - **通过components.xml文件**: 更灵活地配置组件行为,无需修改源代码。 - **细粒度配置文件**: 为特定组件或组件组提供...
接着,通过注册示例详细展示了Seam的基础结构,包括实体Bean(如User)、无状态和有状态会话Bean、Seam组件部署描述文件(components.xml)、Web部署描述文件(web.xml)、JSF配置、EJB部署描述文件、持久化部署描述...
2. **Seam组件创建**:创建Seam组件,这些组件通常对应于业务服务,负责业务逻辑的实现。Seam的依赖注入特性使得这些组件可以轻松地获取和操作JPA实体。 3. **JSF页面构建**:使用JSF组件库创建用户界面,这些组件...
理解如何配置Seam项目以及依赖管理是非常重要的。 7. **开发环境**:使用Seam通常需要IDE支持,如NetBeans、Eclipse等,熟悉IDE的使用可以提高开发效率。同时,确保安装了JDK和对应的Java EE服务器,如Glassfish或...