jBpm的文档不是很多,所以真正开始coding的时候就想起来“书到用时放恨少”这句话了。前面大概看了一下jBpm2自带的那个请求加薪的例子,感觉写的实在不是一个好例子。因为既然是一个样例,就应该写的清晰易懂,这样初学者看起来才能够迅速上手,结果就那个例子我就分析了几个小时才大概看清一个头绪。这里稍微总结一部分,主要是关于其中的表单定义的。
从用户的观点来看,很希望工作流管理系统能够提供表单的定制,最起码我感觉这个对于开发人员来说是很贴心的一项功能,当然相对与工作流引擎来说,这可能不是那么核心的一个问题。在jPdl中甚至没有包括对于应用的接口的参数或者表单参数的这种定义的能力,感觉XPDL在这方面要强大很多(不过似乎jBpm3要支持BPEL了,那时候肯定这方面的能力会得到加强)。由于jPdl中没有关于这些表单的参数定义,开发人员就要自己在其他的地方定义这些参数。在jBpm2的样例中,它是定义在forms.xml这个文件中的。
<form>
<file>forms/request.form</file>
<state-name>request a payraise</state-name>
<task-name>request a pay raise</task-name>
<variable name=”reason” />
<variable name=”amount.asked” format=”org.jbpm.web.formgen.format.DoubleFormat” />
</form>
<form>
<file>forms/evaluating.form</file>
<state-name>evaluating</state-name>
<task-name>evaluate a pay raise</task-name>
<variable name=”requester” />
<variable name=”reason” />
<variable name=”amount.asked” format=”org.jbpm.web.formgen.format.DoubleFormat” />
<variable name=”amount.granted” format=”org.jbpm.web.formgen.format.DoubleFormat” />
<submitbutton value=”Approve Pay Raise” transition-name=”approve” />
<submitbutton value=”Disapprove Pay Raise” transition-name=”disapprove” />
</form>
<form>
<file>forms/treat.form</file>
<state-name>treating collegues on cake and pie</state-name>
<task-name>treat collegues</task-name>
</form>
<form>
<file>forms/update.erp.form</file>
<state-name>updating erp asynchronously</state-name>
<task-name>update the erp system</task-name>
<variable name=”requester” />
<variable name=”amount.granted” format=”org.jbpm.web.formgen.format.DoubleFormat” />
</form>
</forms>
在这个表单定义文件中,定义了所有表单的信息,包括表单对应的html显示、表单在流程中的哪个状态使用、表单的action、以及表单中使用的参数。
这个表单定义文件的使用主要有以下几步:
(1)在HomeAction中,调用Form类的静态方法initialiseForms对可能用到的表单信息进行初始化,这其中包括了:1. 用户当前正在进行的这一工作流定义的表单 2.所有的最新版本的工作流定义需要的表单
(2)在initialiseForm方法中,读取forms.xml这一定义文件,并实例化新的Form对象,在Form类的构造函数中解析这一xml文件的各个元素,并调用initializeSubmitButtons方法将button和解析出的变迁建立map,调用initializeVariableFormats方法将变量与变量类型建立map。
(3)循环将该流程中所有的状态名与解析完成的form实例建立map,而后将该流程id与前面建立的map再建立map allForms(静态成员变量)
(4)在其他的Actionz中通过Form类的方法getForm访问allForms map以得到各个表单中的参数信息