设置流程定义文件:

<?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. MyBatis-plus二级缓存使用

    MyBatis二级缓存使用 注意点: 在最新的3.x版本,实现二级缓存的配置也有了一些改变. 官方建议在service使用缓存,但是你也可以直接在mapper层缓存,这里的二级缓存就是直接在Mappe ...

  2. Virtual Box虚拟机Ubuntu系统安装及基本配置

    Linux简介 什么是 Linux? Linux:世界上不仅只有一个 Windows 操作系统,还有 Linux.mac.Unix 等操作系统.桌面操作系统下 Windows 是霸主,而 Linux ...

  3. JDK源码分析(11)之 BlockingQueue 相关

    本文将主要结合源码对 JDK 中的阻塞队列进行分析,并比较其各自的特点: 一.BlockingQueue 概述 说到阻塞队列想到的第一个应用场景可能就是生产者消费者模式了,如图所示: 根据上图所示,明 ...

  4. 从PRISM开始学WPF(五)MVVM(一)ViewModel-更新至Prism7.1

    0x5 MVVM [7.1updated]截止到目前,我们看到7.1的更新主要在三个地方 PrismApplication ,并且不再使用Bootstrapper 更新了unity,现在使用prism ...

  5. keil教程之新建软件工程

    前言 工欲善其事,必先利其器.要学好52单片机,就要会用keil写程序.不然,谈何学习单片机.下面介绍keil的使用. keil简介 Keil C51是美国Keil Software公司出品的51系列 ...

  6. QLineEdit拾遗:数据的过滤、验证和补全

    QLineEdit是使用频率最高的控件之一,当我们想获取用户输入时自然而然得会用到它. 通常我们会将QLineEdit的信号或其他控件的信号绑定至槽函数,然后获取并处理编辑器内的数据.你会觉得我们拿到 ...

  7. GitHub 可以免费创建私人仓库啦

    如果你不知道什么是 GitHub,也可以往下看,只不过可能感受不会那么深啦. 昨天,GitHub 博客发表了文章 其中比较重要的已经用蓝色线标注了. GitHub 支持开发者创建免费私人仓库,但是需要 ...

  8. web scraper 抓取分页数据和二级页面内容

    如果是刚接触 web scraper 的,可以看第一篇文章. web scraper 是一款免费的,适用于普通用户(不需要专业 IT 技术的)的爬虫工具,可以方便的通过鼠标和简单配置获取你所想要数据. ...

  9. css控制元素 水平垂直居中

    控制元素居中核心代码为 position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; css: /* 容器 */ .w ...

  10. 深挖 NPM 机制

    使用NPM安装的时候会经常出现包冲突(比如多个主模块的子模块版本不一致等),导致在开发过程中会遇到各种或大或小的问题.所有在这会介绍以下内容: NPM 主要安装方式 NPM 包信息查询 NPM 安装机 ...