设置流程定义文件:

<?xml version="1.0" encoding="UTF-8"?>

<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema"
expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="my-process">
<!--startEvent/userTask都可以配置的表单项-->
<!-- 1.activiti:formKey指定表单的key,也就是一个url,获取到这个值以后,
后端可以设置一些算法,和逻辑,解析出所定义的模板 -->
<startEvent id="start" activiti:formKey="/rest/process/form/start">
<!--扩展属性,设置表单内容-->
<extensionElements>
<activiti:formProperty id="message" name="信息" type="string" required="true"/>
</extensionElements>
</startEvent> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" /> <userTask id="someTask" name="Activiti is awesome!"
activiti:formKey="/rest/process/form/userTask">
<extensionElements>
<activiti:formProperty id="yesORno" name="审批" type="string" required="true"/>
</extensionElements>
</userTask>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" /> <endEvent id="end" /> </process> </definitions>

编写测试类:

public class FormServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(FormServiceTest.class); @Rule
public ActivitiRule activitiRule = new ActivitiRule(); @Test
@Deployment(resources = {"my-process-form.bpmn20.xml"})//部署定义文件
public void testFormService(){
FormService formService = activitiRule.getFormService();
//获取流程定义文件
ProcessDefinition processDefinition = activitiRule.getRepositoryService().createProcessDefinitionQuery().singleResult(); //用formService获取前面在流程定义文件里的内容
//获取startFormKey
String startFormKey = formService.getStartFormKey(processDefinition.getId());
LOGGER.info("startFormKey = {}",startFormKey);
//获取表单内容(区分start还是task表单),要先获取FromData,然后从中解析出表单的数量跟列表
StartFormData startFormData = formService.getStartFormData(processDefinition.getId());
//通过startFormData获取表单集合、列表
List<FormProperty> formProperties = startFormData.getFormProperties();
for (FormProperty formProperty : formProperties) {
LOGGER.info("formProperty = {}",ToStringBuilder.reflectionToString(formProperty,ToStringStyle.JSON_STYLE));
}
//获取task内容.这里用到的getTaskFormData()需要获取TaskID但是只有流程启
// 动后运行到Task才会有TaskID,所以在这里需要启动流程
//假装一个表单提交需要用到的内容
Map<String,String> properties = Maps.newHashMap();
properties.put("message","my test message");
//用提交表单的方式 启动流程
ProcessInstance processInstance = formService.submitStartFormData(processDefinition.getId(), properties);
//Task就会生成了,接着获取Task
Task task = activitiRule.getTaskService().createTaskQuery().singleResult();
//接着就可以获取Task表单了
TaskFormData taskFormData = formService.getTaskFormData(task.getId());
List<FormProperty> taskFormDataFormProperties = taskFormData.getFormProperties();
for (FormProperty property : taskFormDataFormProperties) {
LOGGER.info("property = {}",ToStringBuilder.reflectionToString(property,ToStringStyle.JSON_STYLE));
}
//让表单继续执行
// 这里Task里的yesORno设的是必填属性,所以必须给予其值
HashMap<String,String> properties1 = Maps.newHashMap();
properties1.put("yesORno","yes");
formService.submitTaskFormData(task.getId(),properties1);
//查询一下表单是否还存在
Task task1 = activitiRule.getTaskService().createTaskQuery().taskId(task.getId()).singleResult();
LOGGER.info("task1 = {}",task1); } }

测试结果如下:

ProcessEngine default created
startFormKey = /rest/process/form/start
formProperty = {"id":"message","name":"\u4FE1\u606F","type":"org.activiti.engine.impl.form.StringFormType@352c308","isRequired":true,"isReadable":true,"isWritable":true,"value":null}
property = {"id":"yesORno","name":"\u5BA1\u6279","type":"org.activiti.engine.impl.form.StringFormType@352c308","isRequired":true,"isReadable":true,"isWritable":true,"value":null}
task1 = null

Activiti6-FormService(学习笔记)重要的更多相关文章

  1. webx学习笔记

    Webx学习笔记周建旭 2014-08-01 Webx工作流程 图 3.2. Webx Framework如何响应请求 当Webx Framework接收到一个来自WEB的请求以后,实际上它主要做了两 ...

  2. activiti学习笔记一

    activiti学习笔记 在讲activiti之前我们必须先了解一下什么是工作流,什么是工作流引擎. 在我们的日常工作中,我们会碰到很多流程化的东西,什么是流程化呢,其实通俗来讲就是有一系列固定的步骤 ...

  3. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  6. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  7. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  8. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  9. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  10. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

随机推荐

  1. 五行Python代码教你用微信来控制电脑摄像头

    如果说强大的标准库奠定了Python发展的基石,丰富的第三方库则是python不断发展的保证.今天就来通过itchart库来实现通过微信对电脑的一些操作. 一.安装库 安装itchat itchat ...

  2. webpack初探 - (一)

    什么webpack webpack是一个模块打包器.webpack把模块连同它的依赖一起打包生成包含这些模块的静态资源. 安装 在使用webpack时,建议不要把webpack安装到全局,如果多个项目 ...

  3. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  4. cocos creator主程入门教程(五)—— 日志系统

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 这一篇介绍日志系统的设计.一般我们开发一个demo,只会简单的用cocos提供的cc.log打印下日志, ...

  5. Spring Boot 整合 rabbitmq

    一.消息中间件的应用场景 异步处理 场景:用户注册,信息写入数据库后,需要给用户发送注册成功的邮件,再发送注册成功的邮件. 1.同步调用:注册成功后,顺序执行发送邮件方法,发送短信方法,最后响应用户 ...

  6. 【土旦】 使用Vant 的Uploader 上传图片 重定义返回格式 使用FormData格式提交

    前言 开发一个图片上传功能 需求要用vant中的Uploader , 发现 Uploader组件官方封装返回的数据是加密的,不适合我这个项目(需要上传到本地ftp服务器), 看了一下官方 issue ...

  7. SSH实现登陆拦截器

    /** * 登录验证拦截器 * */ @SuppressWarnings("serial") public class LoginInteceptor implements Int ...

  8. 路由刷rom手册

    最近对家里面那5,6个路由器下手了. 路由列表:小米mini 2台. 优酷路由宝l1,tp wdr3320,tp wr840n,  友华wr1200js,小米路由r1n 步骤: 1. 想办法开启ssh ...

  9. 轻松学习UML之类图,状态图

    本文主要讲解UML图中的类图与状态图相关内容,如有不足之处,还请指正. 概述 统一建模语言(UML,UnifiedModelingLanguage)是面向对象软件的标准化建模语言,UML因其简单.统一 ...

  10. python-对requests请求简单的封装

    # coding:utf-8 import requests class send_request: def __init__(self,url,method,data=None): self.res ...