这个恐怕是初次接触工作流最多的话题之一了,当然这个不是针对Activiti来说的,每个工作流引擎都会支持多种方式的表单。目前大家讨论到的大概有三种。
具体选择哪种方式只能读者根据自己项目的实际需求结合现有技术或者架构、平台选择!!!
这是程序员最喜欢的方式,同时也是客户最讨厌的……因为表单完全没有布局,所有的表单元素都是顺序输出显示在页面。
此方式需要在流程定义文件(bpmn20.xml)中用activiti:formProperty属性定义,可以在开始事件(Start Event)和Task上设置,而且支持变量自动替换,语法就是UEL。
1
2
3
4
5
6
7
8
9
10
|
<
startevent
id
=
"startevent1"
name
=
"Start"
>
<
extensionelements
>
<
activiti:formproperty
id
=
"name"
name
=
"Name"
type
=
"string"
></
activiti:formproperty
>
</
extensionelements
>
</
startevent
>
<
usertask
id
=
"usertask1"
name
=
"First Step"
>
<
extensionelements
>
<
activiti:formproperty
id
=
"setInFirstStep"
name
=
"SetInFirstStep"
type
=
"date"
></
activiti:formproperty
>
</
extensionelements
>
</
usertask
>
|
下面是一个简单的动态表单的单元测试,读者可以下载运行以便更明确执行过程和判断动态表单能不能在企业项目中使用。
下载之后复制到eclipse工程里,更改里面的路径配置使用JUnit测试即可。
当流程需要一些特殊处理时可以借助Listener或者Delegate方式实现。
注意:表单的内容都是以key和value的形式数据保存在引擎表中!!!
这种方式常用于基于工作流平台开发的方式,代码写的很少,开发人员只要把表单内容写好保存到.form文件中即可,然后配置每个节点需要的表单名称(form key),实际运行时通过引擎提供的API读取Task对应的form内容输出到页面。
此种方式对于在经常添加新流程的需求比较适用,可以快速发布新流程,把流程设计出来之后再设计表单之后两者关联就可以使用了。例如公司内部各种简单的审批流程,没有业务逻辑处理,仅仅是多级审批是否通过等等情况
当流程需要一些特殊处理时可以借助Listener或者Delegate方式实现。
Activiti Explorer就是使用的这种方式,表单信息都配置在流程定义文件中。
代码片段:
1
2
3
4
|
<
process
id
=
"FormKey"
name
=
"FormKey"
>
<
startevent
id
=
"startevent1"
name
=
"Start"
activiti:formkey
=
"diagrams/form/start.form"
></
startevent
>
…
</
process
>
|
同样也提供了单元测试:
注意:表单的内容都是以key和value的形式数据保存在引擎表中!!!
这个是最灵活的一种方式,常用于业务比较复杂的系统中,或者业务比较固定不变的需求中,例如ERP系统。
普通表单的特点是把表单的内容存放在一个页面(jsp、jsf、html等)文件中,存放方式也有两种(一体式、分离式):
1.一体式:把整个流程涉及到的表单放在一个文件然后根据处理的任务名称匹配显示,kft-activiti-demo的普通表单模式就是一体式的做法,把表单内容封装在一个div里面,div的ID以节点的名称命名,点击“办理”按钮时用对话框的方式把div的内容显示给用户。
2.分离式:对于非Ajax应用来说比较常用,每个任务对应一个页面文件,点击办理的时候根据任务的ID动态指定表单页面。
本博客发布的Activiti入门Demo中有演示:Activiti快速入门项目-kft-activiti-demo
和以上两种方式比较有两点区别:
技术只是辅助工具,只能决定这件事能不能做,如何选择要看应用场合,希望简单的比较能提供一点思路。
这是我使用Activiti以来对几种表单的划分,仅供参考,抛砖引玉,如果有异议请留言或者直接联系我一起探讨!