問題闡述
通常每一個“用戶任務”都會對應一個表單,以供用戶錄入信息。尤其是在“流程定義”擁有多個版本的情形下,明確的指定表單顯得極其重要。
一份新版本的“流程定義”通常對表單有以下幾點影響:
- 新增了環節(用戶任務),這時緊跟着新增一個表單即可,以及腳本、樣式、Web API;
- 刪除了環節(用戶任務),這時可以不用管,為顧及舊版本的流程定義,其對應的表單還需要保留,並不能刪除;
- 修改了環節(用戶任務),比如在 A 環節新增了兩個字段,同時在 B 環節減少了兩個字段,這時就要為 A、B 兩個環節各自重新創建表單、重新創建腳本、樣式、以及重新創建Web API,因為表單變了,那么業務也就變了,SQL(表)也都跟着變了。
表單關聯方案
為了讓特定環節(用戶任務)方便的找到屬於自己的表單,可以使用 Form Key 進行關聯:
那么在辦理該用戶任務時,就可以讀取出該表單的名字:
TaskFormData formData = formService.getTaskFormData(taskId);
String formKey = formData.getFormKey();
或者針對啟動流程階段,可以這樣讀取表單名:
formService.getStartFormData(String processDefinitionId).getFormKey();
客戶端渲染
- 如果表單頁面是一個獨立的主頁面,那可以直接跳轉過去:
var url = formKey + "?id=" +objId + "&taskId=" +taskId;
window.location.href = url;
- 如果表單頁面是一個分部視圖(仍然可以是 .jsp),則基於 JSP EL 表達式將 formkey 填充到占位符 {0} 即可:
<jsp:include page="../../shared/Partial/{0}.jsp" flush="true"/>
腳本和樣式的加入與此同理。
在 JSP 中,當路徑是一個變量時,做法參考如下:
<% String add = "/includes/" + id + "/abc.html"; %>
<jsp:include page="<%= add %>"></jsp:include>