在操作层协调java服务简介
摘要
迄今为止,web应用程序开发的焦点在于将业务逻辑封装成服务。在这篇文章中,masayuki otoshi建议将业务流程也剥离出来,就像那些业务过程管理/工作流产品一样,应用基于xml的文档来描述业务。但是这里他深入到了更低的粒度-操作。这篇文章同时展示了可继承的xml如何容许开发人员应用面向对象的概念去有效的表示流程。
在开发web应用程序的过程中,我们经常看到业务流程和逻辑在action中一起被实现,比如jsf中的后台bean和struts中的action类。在现有框架的帮助下,比如ejb和spring,我们能把业务逻辑剥离出来,但是业务流程始终还是嵌入在具体操作中。
bpm(业务流程管理)标准,比如bpmn(业务流程建模符号)和bpel(业务流程执行语言),提供了一种分离业务流程的途径,那就是应用基于xml文档来描述这种分离。这种方法的另外一个好处可以在soa(面向服务架构)基础上设计应用程序。但是,这种方法使得在web应用程序不能很好地应用action.actoin的粒度对于bpm/工作流产品来讲太低了。他们通常专注于更高的业务范围,如b2b应用程序和企业级的应用整合,而且他们假定业务分析人员会按照图1所示的方法来描述流程。但是在更低的粒度上,比如action,流程再用的可能性更大。
图1. 粒度比较
在这篇文章中,对于比较小的业务需求范畴,我建议java开发人员使用j-sofa(java services orchestration for actions, action级java服务协调)。j-sofa是一种协调服务的框架,这里的服务对应于类中的一个方法,无论是pojo(简单洁净java对象)或者web服务。
由于粒度不同,j-sofa并不支持消息,状态管理,监控等等的同步。但是不用担心,目前的bpm/工作流产品都支持这些功能,我们可以直接应用这些产品。这篇文章所讲到的服务协调框架主要关注于提供业务流程的可用性,就像服务那样。
图2说明了剥离的业务流程可以被其他应用程序重复利用。
图 2. 可重用的业务流程及服务
版权声明:任何获得matrix授权的网站,转载时请务必保留以下作者信息和链接
作者:masayuki otoshi ;rainh95(作者的blog:http://blog.matrix.org.cn/page/rainh95)
原文:http://www.javaworld.com/javaworld/jw-04-2006/jw-0417-sofa.html?lsrc=jwrss
matrix:http://www.matrix.org.cn/resource/article/44/44500_business+services.html
关键字:business;services
jsf中的简单action
让我们来看看用jsf开发的web应用程序中的一些简单action的代码。我们的例子是一个简单的模型搜索程序:根据用户输入的模型id返回模型具体信息。
你可以从这个资源下载这个示例的源代码。
在搜索jsp页面上,有一个文本框和一个submit按钮,用户可以输入model id然后提交。这个jsp页面通过一个叫modelbean的后台bean调用showmodel()方法。如列表1所示:
列表 1. search.jsp中的inputtext及submit按钮
<h:inputtext id="modelid" value="#{modelbean.modelid}" />
<h:commandbutton type="submit" value="submit" action="#{modelbean.showmodel}" />public string showmodel() {
if (modelid > 0) {
modelservice modelservice = new modelservice();
beanutils.copyproperties(this, modelservice.create(modelid));
setfeatures(modelservice.getfeatures(modelid));
}
...
}<process>
<if test="${modelid > 0}">
<service name="modelservice" operation="create">
<return name="model" />
</service>
<service name="modelservice" operation="getfeatures">
<return name="features" />
</service>
</if>
</process>
public string showmodel() {
processinstance process = new processinstance("process.xml");
processcontext context = new processcontext();
context.put("modelid", modelid);
process.execute(context);
beanutils.copyproperties(this, context.get("model"));
setfeatures((list) context.get("features"));
...
}<process>
<subprocess path="page.xml" /> ---------- (1)
<subprocess path="model.xml" /> ---------- (2)
<service name="modelservice" operation="getfeatures" /> ----- (3)
</process>
<process>
<service id="header" name="commonservice" operation="getheader" />
<service id="footer" name="commonservice" operation="getfooter" />
<abstract id="contents" />
</process>
<process extends="page.xml">
<group id="contents">
<service name="modelservice" operation="create" />
<abstract id="pagecontents" />
</group>
</process>
<process extends="model.xml">
<service id="pagecontents" name="modelservice" operation="getfeatures" />
</process>
<process>
<service id="header" name="commonservice" operation="getheader" />
<service id="footer" name="commonservice" operation="getfooter" />
<group id="contents">
<service name="modelservice" operation="create" />
<service id="pagecontents" name="modelservice" operation="getfeatures" />
</group>
</process>
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器