android序列化表单,工作流引擎之Activiti中的表单及应用详解

本文详细介绍了如何在Activiti中利用表单属性实现灵活的业务流程交互,包括内置和外置表单的渲染、变量映射、类型转换及API操作。通过实例演示了如何配置表单属性、类型声明和提交流程,以及如何在不同UI技术下使用表单模板。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activiti中的表单

Activiti提供了一种方便而且灵活的方式在业务流程中以手工方式添加表单

对表单的支持有2种方式:

通过表单属性对内置表单进行渲染

通过表单属性对外置表单进行渲染

表单属性

业务流程相关联的所有信息:

包含自身的流程变量

通过流程变量的引用

Activiti支持存储复杂的Java对象作为流程变量:

序列化对象

Jpa实体对象

整个XML文档作为字符串

用户是在启动一个流程和完成用户任务时,与流程进行交互

表单需要某个UI技术渲染之后才能够与用户进行交互

为了能够使用不同UI技术变得容易,流程定义包含一个对流程变量中复杂的Java类型对象到一个properties的Map 类型的转换逻辑

使用Activiti API的方法查看公开的属性信息.然后,任意UI技术都能够在这些属性上面构建一个表单.该属性专门为流程变量提供了一个视图. 表单所需要显示的属性可以返回值FormData中获取:

StartFormData FormService.getStartFormData(String processDefinitionId)

或者

TaskFormdata FormService.getTaskFormData(String taskId)

在默认情况下,内置的表单引擎遇到这些变量就像对待流程变量一样.如果任务表单属性和流程变量是一对一的关系,那么任务表单属性就不需要进行申明了:

当执行到开始事件时,所有的流程变量都是可用的,但是

formService.getStartFormData(String processDefinitionId).getFormProperties()

会是一个空值,因为没有定义一个具体的映射

表单中所有被提交的属性都将会作为流程变量被存储在Activiti使用的数据库中. 这意味着在一个表单中新添加一个简单的input输入字段,也会作为一个新的变量被存储

属性来自于流程变量,但是不一定非要作为流程变量存储:

一个流程变量可能是JPA实体如类Address.在某种UI技术中使用的表单属性StreetName可能会关联到一个表达式 #{address.street}

用户提交的表单属性应该作为流程变量进行存储

使用UEL值表达式将其作为流程变量的一个嵌套属性进行存储

提交的表单属性默认的行为是作为流程变量进行存储,除非一个 formProperty 申明了其他的规则

类型转换也可以应用于表单数据和流程变量之间的处理:

表单属性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 formService.getStartFormData(String processDefinitionId).getFormProperties()

或者

List formService.getTaskFormData(String taskId).getFormProperties()

public interface FormProperty {

/**

the key used to submit the property in {@link FormService#submitStartFormData(String, java.util.Map)}

* or {@link FormService#submitTaskFormData(String, java.util.Map)} */

String getId();

/** the display label */

String getName();

/** one of the types defined in this interface like e.g. {@link #TYPE_STRING} */

FormType getType();

/** optional value that should be used to display in this property */

String getValue();

/** is this property read to be displayed in the form and made accessible with the methods

* {@link FormService#getStartFormData(String)} and {@link FormService#getTaskFormData(String)}. */

boolean isReadable();

/** is this property expected when a user submits the form? */

boolean isWritable();

/** is this property a required input field */

boolean isRequired();

}

示例:

name="Speaker"

variable="SpeakerName"

type="string" />

type="date"

datePattern="dd-MMM-yyyy" />

所有的表单属性的信息都是可以通过API进行访问的:

formProperty.getType().getName(): 获取类型的名称

formProperty.getType().getInformation("datePattern"): 获取日期的匹配方式

formProperty.getType().getInformation("values"): 可以获取到枚举值

Activiti控制台支持表单属性并且可以根据表单定义对表单进行渲染:

当使用Activiti控制台时,会被渲染成流程的启动表单

外置表单的渲染

Activiti中的API允许执行Activiti流程引擎之外的方式渲染任务表单,可以用自定义方式对任务表单进行渲染

所有需要渲染的表单属性进行装配的服务方法有两种:

StartFormData FormService.getStartFormData(String processDefinitionId)

TaskFormdata FormService.getTaskFormData(String taskId)

表单属性提交的两种方式:

ProcessInstance FormService.submitStartFormData(String processDefinitionId, Map properties)

void FormService.submitStartFormData(String taskId, Map properties)

可以将任何表单模版资源放进要部署的业务文档之中(如果想要按照流程的版本进行存储).将会在部署中作为一种可用的资源

获取部署表单模版的方式有两种:

String ProcessDefinition.getDeploymentId()

InputStream RepositoryService.getResourceAsStream(String deploymentId, String resourceName)

这样就可以获取表单模版定义文件,就可以在应用中渲染或者显示表单

也可以使用该功能获取任务表单之外的其他的部署资源用于其他的目的

属性

String FormService.getStartFormData(String processDefinitionId).getFormKey()

String FormService.getTaskFormData(String taskId).getFormKey()

可以使用这个存储部署的模版中的全名(例如org/activiti/example/form/my-custom-form.xml) 但是这并不是必须的:

可以在表单属性中存储一个通用的key,然后运用一种算法或者换转去得到你实际使用的模版

当需要通过不同UI技术渲染不同的表单会更加方便:

使用正常屏幕大小的web应用程序的表单

移动手机小屏幕的表单

IM表单

email表单模版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值