第六章 activiti流程 “动态表单实验室”

一、任务表单是什么?------流程的"体检表"

1. 表单的核心作用
  • 数据采集:在任务处理时收集业务数据(如请假天数、报销金额)。
  • 动态渲染:根据流程变量或用户角色展示不同字段。
  • 数据绑定:将表单输入自动映射到流程变量。
2. 表单类型对比
类型 存储方式 适用场景
动态表单 嵌入BPMN文件 简单字段,快速开发
外部表单 独立HTML/JSP文件 复杂UI,需要自定义样式

二、动态表单设计------BPMN中的"隐形问卷"

1. 在BPMN中定义表单属性

在用户任务节点中添加activiti:formProperty

xml 复制代码
<userTask id="leaveApply" name="请假申请">  
  <extensionElements>  
    <activiti:formProperty id="days" name="请假天数" type="long" required="true"/>  
    <activiti:formProperty id="reason" name="请假理由" type="string"/>  
  </extensionElements>  
</userTask>  

参数解析

  • type:支持string, long, date, boolean等类型。
  • required:是否必填。
2. 代码中获取表单数据
java 复制代码
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();  
List<FormProperty> formProperties = formService.getTaskFormData(task.getId()).getFormProperties();  

// 渲染到前端  
formProperties.forEach(prop -> {  
    System.out.println("字段名:" + prop.getName() + ", 类型:" + prop.getType());  
});  

三、外部表单开发------HTML的"自由舞台"

1. 创建独立HTML表单
html 复制代码
<form action="/complete-task" method="post">  
  <input type="hidden" name="taskId" value="${taskId}">  
  请假天数:<input type="number" name="days" required>  
  请假理由:<textarea name="reason"></textarea>  
  <button type="submit">提交</button>  
</form>  
2. 提交表单数据到引擎
java 复制代码
@PostMapping("/complete-task")  
public String completeTask(@RequestParam String taskId, @RequestParam Map<String, String> formData) {  
    formService.submitTaskFormData(taskId, formData);  
    return "redirect:/tasks";  
}  

关键点 :表单参数的name必须与流程变量名一致!


四、表单数据与流程变量的"量子纠缠"

1. 自动绑定规则
  • 表单字段名与流程变量名同名时自动绑定。
  • 例如:表单中的days字段 → 自动存入流程变量days
2. 手动绑定数据
java 复制代码
Map<String, Object> variables = new HashMap<>();  
variables.put("days", formData.get("days"));  
variables.put("reason", formData.get("reason"));  
taskService.complete(taskId, variables);  

五、表单渲染与验证------让输入"守规矩"

1. 动态渲染字段

根据用户角色隐藏/显示字段:

html 复制代码
<% if (user.isManager()) { %>  
  审批意见:<input type="text" name="comment">  
<% } %>  
2. 后端验证逻辑
java 复制代码
if (formData.get("days") == null || Integer.parseInt(formData.get("days")) <= 0) {  
    throw new ActivitiException("请假天数必须大于0!");  
}  

六、避坑指南------表单的"隐藏陷阱"

1. 表单未绑定变量

症状 :提交后流程变量为空。
检查项

  • 表单字段名是否与流程变量名一致。
  • 是否调用formService.submitTaskFormDatataskService.complete
2. 外部表单路径错误

症状 :访问表单404报错。
解法 :确保HTML文件放在src/main/resources/static目录下。


七、课后挑战------巩固你的"表单魔法"

  1. 选择题 :动态表单的字段类型date对应的Java类型是?

    A. java.util.Date

    B. String

    C. Long

  2. 实战题:设计一个报销表单,包含"金额(double)、发票附件(file)"字段,并实现后端提交验证。


相关推荐
寻月隐君5 分钟前
【Solana 开发实战】轻松搞定链上 IDL:从上传到获取全解析
后端·web3·github
程序员爱钓鱼15 分钟前
Go项目上线部署最佳实践:Docker容器化从入门到进阶
后端·google·go
汪子熙16 分钟前
Visual Studio Code 中排除指定文件夹搜索的最佳实践与实现原理
后端·面试
大P哥阿豪43 分钟前
Go defer(二):从汇编的角度理解延迟调用的实现
开发语言·汇编·后端·golang
风象南1 小时前
SpringBoot 与 HTMX:现代 Web 开发的高效组合
java·spring boot·后端
wstcl2 小时前
让你的asp.net网站在调试模式下也能在局域网通过ip访问
后端·tcp/ip·asp.net
ai小鬼头10 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
萧曵 丶10 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
老任与码11 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba
华子w90892585911 小时前
基于 SpringBoot+VueJS 的农产品研究报告管理系统设计与实现
vue.js·spring boot·后端