Activiti提供了一种方便而且灵活的方式在业务流程中以手工方式添加表单
对表单的支持有2种方式:
通过表单属性对内置表单进行渲染
通过表单属性对外置表单进行渲染
表单属性业务流程相关联的所有信息:
包含自身的流程变量
通过流程变量的引用
Activiti支持存储复杂的Java对象作为流程变量:
序列化对象
Jpa实体对象
整个XML文档作为字符串
用户是在启动一个流程和完成用户任务时,与流程进行交互
表单需要某个UI技术渲染之后才能够与用户进行交互
为了能够使用不同UI技术变得容易,流程定义包含一个对流程变量中复杂的Java类型对象到一个properties的Map<String,String> 类型的转换逻辑
使用Activiti API的方法查看公开的属性信息.然后,任意UI技术都能够在这些属性上面构建一个表单.该属性专门为流程变量提供了一个视图. 表单所需要显示的属性可以返回值FormData中获取:
StartFormData FormService.getStartFormData(String processDefinitionId)或者
TaskFormdata FormService.getTaskFormData(String taskId)在默认情况下,内置的表单引擎遇到这些变量就像对待流程变量一样.如果任务表单属性和流程变量是一对一的关系,那么任务表单属性就不需要进行申明了:
<startEvent />当执行到开始事件时,所有的流程变量都是可用的,但是
formService.getStartFormData(String processDefinitionId).getFormProperties()会是一个空值,因为没有定义一个具体的映射
表单中所有被提交的属性都将会作为流程变量被存储在Activiti使用的数据库中. 这意味着在一个表单中新添加一个简单的input输入字段,也会作为一个新的变量被存储
属性来自于流程变量,但是不一定非要作为流程变量存储:
一个流程变量可能是JPA实体如类Address.在某种UI技术中使用的表单属性StreetName可能会关联到一个表达式 #{address.street}
用户提交的表单属性应该作为流程变量进行存储
使用UEL值表达式将其作为流程变量的一个嵌套属性进行存储
提交的表单属性默认的行为是作为流程变量进行存储,除非一个 formProperty 申明了其他的规则
类型转换也可以应用于表单数据和流程变量之间的处理:
<userTask> <extensionElements> <activiti:formProperty /> <activiti:formProperty type="long"/> <activiti:formProperty variable="SpeakerName" writable="false" /> <activiti:formProperty expression="#{address.street}" required="true" /> </extensionElements> </userTask>表单属性room将会被映射为String类型流程变量room
表单属性duration将会被映射为java.lang.Long类型流程变量duration
表单属性speaker将会被映射为流程变量SpeakerName:
writable="false" 只能够在TaskFormData对象中使用.如果属性speaker提交,将会抛出一个ActivitiException的异常
readable="false" 该属性就会在FormData进行排除,但是在提交后仍然会对其进行处理
表单属性street将会映射为Java Bean address的属性street作为String类型的流程变量:
当提交的表单属性并没有提供并且required="true" 时,那么就会抛出一个异常
表单数据也可以作为FormData的一部分提供类型元数据.该FormData可以从以下方法的返回值中获取:
StartFormData FormService.getStartFormData(String processDefinitionId) TaskFormdata FormService.getTaskFormData(String taskId)表单属性类型:
string: org.activiti.engine.impl.form.StringFormType
long: org.activiti.engine.impl.form.LongFormType
enum: org.activiti.engine.impl.form.EnumFormType
date: org.activiti.engine.impl.form.DateFormType
boolean: org.activiti.engine.impl.form.BooleanFormType
对于声明每一个表单属性,FormProperty信息可以通过以下方式获取:
List<FormProperty> formService.getStartFormData(String processDefinitionId).getFormProperties()