心得:想要做一件事,首先得清楚这件事的本质。
最开始学习activiti,我与大家都一样,徘徊在如何与业务系统对接,如何整合modeler实现在线编辑。当我花了1周时间高强度学习后,我发现,一开始想得太多了。
最初阶段,我应该先让activiti跑起来,然后与业务系统对接,弄清楚activiti的各种实现原理后,最后来整合modeler才是最好的方式。因为这个时候你已经明白了modeler与工作流引擎之间的关系,你知道应该怎么做,你的方向在哪里。
这可能就是为什么网上的教程,每一个都是直接从测试类开始,只告诉大家如何进行流程流程,而不是一上来就告诉大家怎么整合与使用modeler的因为吧。
下面,就开始整合modeler,如果过程中有不对的或者有疑问的地方,欢迎指导与探讨。
所以,我的教程也是基于你已经有一个能够运行activiti的项目基础上。
1、什么是modeler
modeler是activiti的一个在线编辑流程插件,通俗的说,它就是一个页面,不过这个页面包含了很多的控制以实现我们的目的。
2、在线编辑原理
很多人一开始可能会被“流程在线编辑”这几个字误导,认为modeler编辑的是流程,其实不然,编辑器编辑的只是一个Model。Model部署后才是流程(procdef),已经部署的流程(procdef)也可以转换为Model,Model与流程(procdef)是分别独立的,删掉Model流程还在,删掉流程Model还在。
3、整合modeler需要的资源
a.样式(官方发布的activiti-explorer.war包中获取):diagram-viewer文件夹、editor-app文件夹
b.页面控件(官方发布的activiti-explorer.war包中获取):stencilset.json
c.modeler.html(官方发布的activiti-explorer.war包中获取)
d.流程定义列表(如果先做项目后整合,那么这个列表应该是已经有的)(如果没有,下载咖啡兔的demo,然后拷贝process-list)建议大家参照着自己写一个页面
e.模型列表(下载咖啡兔的demo,拷贝model-list)建议大家参照着自己写一个页面
f.jar包(下载咖啡兔的demo,参照咖啡兔的jar包,不是所有的都用得上,最好的方式就是先导入基础包,然后运行,运行报错差什么包就加什么包)
4、整合步骤
a.将diagram-viewer文件夹与editor-app文件夹拷贝至项目webapp下,保证项目编译后在根目录
b.将stencilset.json文件拷贝至resources目录下,保证项目编译后在根目录
c.将modeler.html文件拷贝至WEB-INF目录下
d.将process-list文件与model-list文件拷贝至WEB-INF目录指定的页面路劲下
e.导入jar包
f.扫描activiti源生controller(只要controller)
g.编写controller(一个用来操控流程,一个用来操控模型)(操控流程的controller用自己写的,操控模型的controller参考咖啡兔的ModelController)
1)流程controller(代码太多,这里就不贴出来了,参考咖啡兔的ActivitiController,我只列出整合modeler需要用到的方法)
a)获取流程定义列表(用于流程定义列表页面展示所有已经部署的流程定义)
b)流程定义转换Model(用于没有模型的流程转换模型)
2)模型controller(参考咖啡兔的ModelController,其实直接全部拷贝就可以了)
h.扫描自身controller(该controller的作用就是将请求重定向到modeller页面,页面的所有控件会由js自行加载)
i.将modeler.html独立出来,因为spring mvc 一般都是直接过滤的所有路径(在静态资源控制的地方添加)不然访问会报错,提示没有这个方法
5、检验
a.项目启动,跳转到流程定义列表,能够看到所有的流程定义表示成功。
b.点击任意流程定义后面的转换Model控件,后台不抱错并且页面到了模型列表页,有一条数据,表示成功。
d.点击编辑按钮(咖啡兔是直接在页面超链接跳转到modeler.html,我是在模型controller写了一个方法来跳转,实现效果一致),成功打开modeler.html表示成功。
c.模型列表的其他功能自己去挨个实验,这里不多做说明。
6、原理:先要获取到所有的流程定义,然后将流程定义转换为Model(模型),将模型ID传给modeler页面并跳转到modeler页面。modeler页面会自动解析之前所列出的样式资源与控件资源,一旦进行逻辑操作就调用第4.f 步骤扫描的controller。