在 DVD 商店的以下示例中,我们将添加对定单进行验证的业务流程。 该业务流程自动接受所有 100 美元以下的定单,并将大金额的定单交给管理员处理。 验证通过时,还需要一个添加发货数量的步骤。 为完成这个流程,编写如下 JPDL:
<process-definition name="OrderManagement">
<start-state>
<transition to="decide"/>
</start-state>
<decision name="decide"
expression="#{orderApproval.howLargeIsOrder}">
<transition name="large order"
to="approval"/>
<transition name="small order"
to="process"/>
</decision>
<task-node name="approval">
<task name="approve">
<assignment
pooled-actors="reviewers" />
</task>
<transition name="approve"
to="process"/>
<transition name="reject"
to="complete"/>
</task-node>
<task-node name="process">
<task name="ship">
<assignment pooled-actors=
"#{shipperAssignment.pooledActors}"/>
</task>
<transition name="shipped"
to="complete">
<action expression=
"#{afterShipping.log}"/>
</transition>
</task-node>
<end-state name="complete"/>
</process-definition>
在这个简单但是强大的示例中,结合使用 jBPM 和 Seam 可以使你在 jPDL 中直接输入 JSF 语句。 #{orderApproval.howLargeIsOrder}
在 "orderApproval"
Seam 组件上调用 howLargeIsOrder
方法,而这正是它在 JSF 页面中工作的方式。 以下是该 Seam 组件的源代码:
package com.jboss.dvd.seam;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
@Name("orderApproval")
public class OrderApprovalDecision {
@In float amount;
public String getHowLargeIsOrder()
{
return amount > 100 ?
"large order" : "small order";
}
}
没有特别之处,我们只是注入了有态上下文中的金额(amount),和一个字符串,就可以返回采取何种操作。 还注意到在页面流程定义中,从 "process"
到 "complete"
的过渡激活了一个对 Seam 组件"afterShipping"
的 "log"
方法的调用。
移植性和简单性
Seam 完成依赖于 JDK 5.0 标注来声明组件以及它们如何根据特定上下文进行关联--没有 XML 的深奥。 Seam 可以用于任何 JSF 形式,并且可以运行于任何 JEE 5.0 容器。 对于较小的容器,Seam 甚至可以在 Tomcat 或者测试单元中使用。 对于尚未准备好使用 EJB 3.0 的开发者,Seam 还支持 POJO 和 Hibernate 持久性类作为组件。
添加少量的配置文件,此 DVD 商店示例即可在 Tomcat 中工作,在 Seam 发行版本中就有这样一个例子。
资源
- 有关 JBoss Seam 的更多信息,请访问 project website。
- 在 Seam 发行版本 中,可以找到这篇文章中的 DVD 商店示例。
- 查看 Seam 示例应用程序之酒店预订
- JBoss EJB3
- JBoss jBPM
- JBoss Eclipse IDE 捆绑了 jBPM 页面流程和工作流程可视设计器。
Thomas Heute 是 JBoss Seam 项目的带头人
返回 ONJava.com。