天天看點

比較Activiti中三種不同的表單及其應用

這個恐怕是初次接觸工作流最多的話題之一了,當然這個不是針對Activiti來說的,每個工作流引擎都會支援多種方式的表單。目前大家讨論到的大概有三種。

動态表單

外置表單

普通表單

具體選擇哪種方式隻能讀者根據自己項目的實際需求結合現有技術或者架構、平台選擇!!!

這是程式員最喜歡的方式,同時也是客戶最讨厭的……因為表單完全沒有布局,所有的表單元素都是順序輸出顯示在頁面。

此方式需要在流程定義檔案(bpmn20.xml)中用activiti:formProperty屬性定義,可以在開始事件(Start Event)和Task上設定,而且支援變量自動替換,文法就是UEL。

1

2

3

4

5

6

7

8

9

10

<code>&lt;</code><code>startevent</code> <code>id</code><code>=</code><code>"startevent1"</code> <code>name</code><code>=</code><code>"Start"</code><code>&gt;</code>

<code>  </code><code>&lt;</code><code>extensionelements</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>activiti:formproperty</code> <code>id</code><code>=</code><code>"name"</code> <code>name</code><code>=</code><code>"Name"</code> <code>type</code><code>=</code><code>"string"</code><code>&gt;&lt;/</code><code>activiti:formproperty</code><code>&gt;</code>

<code>  </code><code>&lt;/</code><code>extensionelements</code><code>&gt;</code>

<code>&lt;/</code><code>startevent</code><code>&gt;</code>

<code>&lt;</code><code>usertask</code> <code>id</code><code>=</code><code>"usertask1"</code> <code>name</code><code>=</code><code>"First Step"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>activiti:formproperty</code> <code>id</code><code>=</code><code>"setInFirstStep"</code> <code>name</code><code>=</code><code>"SetInFirstStep"</code> <code>type</code><code>=</code><code>"date"</code><code>&gt;&lt;/</code><code>activiti:formproperty</code><code>&gt;</code>

<code>&lt;/</code><code>usertask</code><code>&gt;</code>

下面是一個簡單的動态表單的單元測試,讀者可以下載下傳運作以便更明确執行過程和判斷動态表單能不能在企業項目中使用。

<a href="http://www.kafeitu.me/files/2012/08/DymaticForm.bpmn">DymaticForm.bpmn</a>

<a href="http://www.kafeitu.me/files/2012/08/ProcessTestDymaticForm.java">ProcessTestDymaticForm.java</a>

下載下傳之後複制到eclipse工程裡,更改裡面的路徑配置使用JUnit測試即可。

當流程需要一些特殊處理時可以借助Listener或者Delegate方式實作。

這種方式常用于基于工作流平台開發的方式,代碼寫的很少,開發人員隻要把表單内容寫好儲存到.form檔案中即可,然後配置每個節點需要的表單名稱(form key),實際運作時通過引擎提供的API讀取Task對應的form内容輸出到頁面。

此種方式對于在經常添加新流程的需求比較适用,可以快速釋出新流程,把流程設計出來之後再設計表單之後兩者關聯就可以使用了。例如公司内部各種簡單的審批流程,沒有業務邏輯處理,僅僅是多級審批是否通過等等情況

Activiti Explorer就是使用的這種方式,表單資訊都配置在流程定義檔案中。

代碼片段:

<code>&lt;</code><code>process</code> <code>id</code><code>=</code><code>"FormKey"</code> <code>name</code><code>=</code><code>"FormKey"</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>startevent</code> <code>id</code><code>=</code><code>"startevent1"</code> <code>name</code><code>=</code><code>"Start"</code> <code>activiti:formkey</code><code>=</code><code>"diagrams/form/start.form"</code><code>&gt;&lt;/</code><code>startevent</code><code>&gt;</code>

<code>    </code><code>…</code>

<code>&lt;/</code><code>process</code><code>&gt;</code>

同樣也提供了單元測試:

<a href="http://www.kafeitu.me/files/2012/08/FormKey.bpmn20.xml">FormKey.bpmn20.xml</a>

<a href="http://www.kafeitu.me/files/2012/08/start.form">start.form</a>

<a href="http://www.kafeitu.me/files/2012/08/first-step.form">first-step.form</a>

<a href="http://www.kafeitu.me/files/2012/08/ProcessTestFormKey.java">ProcessTestFormKey.java</a>

這個是最靈活的一種方式,常用于業務比較複雜的系統中,或者業務比較固定不變的需求中,例如ERP系統。

普通表單的特點是把表單的内容存放在一個頁面(jsp、jsf、html等)檔案中,存放方式也有兩種(一體式、分離式):

1.一體式:把整個流程涉及到的表單放在一個檔案然後根據處理的任務名稱比對顯示,kft-activiti-demo的普通表單模式就是一體式的做法,把表單内容封裝在一個div裡面,div的ID以節點的名稱命名,點選“辦理”按鈕時用對話框的方式把div的内容顯示給使用者。

2.分離式:對于非Ajax應用來說比較常用,每個任務對應一個頁面檔案,點選辦理的時候根據任務的ID動态指定表單頁面。

和以上兩種方式比較有兩點差別:

表單:和第二種外置表單類似,但是表單的顯示、表單字段值填充均由開發人員寫代碼實作。

資料表:資料表單獨設計而不是和前兩種一樣把資料以key、value形式儲存在引擎表中。

動态表單:引擎已經自動綁定在一起了,不需要額外配置。

外置表單:和業務關聯是可選的,提供的例子中是沒有和業務關聯的,如果需要關聯隻需要在送出StartForm的時候設定businessKey即可。

繼續閱讀