在这里我想说的外置表单。是说我们将我们自己的jsp(.form,.html)等页面上传到工作流的数据库中,当任务运行到当前结点时。给我们像前台发送绑定好的表单。

此处是给表单绑定表单的过程

不允许为:${deptLeaderPass =='false'}

以下我们看相应的页面内容:

start.form简单的html页面:

<table border="1"><tr><td>请假类型:</td><td><select id="leaveType" name="fp_leaveType"><option>公休</option><option>病假</option><option>调休</option><option>事假</option><option>婚假</option></select></td></tr><tr><td>開始时间:</td><td><input type="text" id="startTime" name="fp_startTime" class="datetime required" /></td></tr><tr><td>结束时间:</td><td><input type="text" id="endTime" name="fp_endTime" class="datetime required" /></td></tr><tr><td>请假原因:</td><td><textarea id="reason" name="fp_reason"></textarea></td></tr>
</table>

dept-leader-audit.form页面:

<table class='view-info'><tr><td width="100" class="label">申请人:</td><td name="userId">${applyUserId}</td></tr><tr><td class="label">假种:</td><td name="leaveType">${leaveType}</td></tr><tr><td class="label">请假<font color="red">開始</font>时间:</td><td name="startTime">${startTime}</td></tr><tr><td class="label">请假<font color="red">结束</font>时间:</td><td name="endTime">${endTime}</td></tr><tr><td class="label">请假事由:</td><td name="reason">${reason}</td></tr><tr><td class="label">是否允许申请:</td><td><select id="deptLeaderPass" name="fp_deptLeaderPass"><option value="true">允许</option><option value="false">驳回</option></select></td></tr><tr id="leaderBackReasonTr"><td class="label">驳回理由:</td><td><textarea id="leaderBackReason" name="fp_leaderBackReason"></textarea></td></tr>
</table>

hr-audit.form也相似均是非常easy的HTML页面。

相应的核心工作流实现代码:

/** 启动流程 启动流程,仅仅考虑首次登录。

首次登录:启动工作流。而且更新/{processDefinitionId} @RequestMapping(value = "get-form/start/{processDefinitionId}") */ @RequestMapping(value = "/start/{processDefinitionId}") public String start(@PathVariable("processDefinitionId") String processDefinitionId,HttpServletRequest request) throws Exception { try { // 定义map用于往工作流数据库中传值。 Map<String, String> formProperties = new HashMap<String, String>(); //启动流程-何静媛-2015年5月24日--processDefinitionId, ProcessInstance processInstance = formService .submitStartFormData(processDefinitionId, formProperties); // 返回到显示用户信息的controller logger.debug("start a processinstance: {}", processInstance); return "redirect:/workflow/auto/get-form/task/"+ processInstance.getId(); } catch (Exception e) { throw e; } finally { identityService.setAuthenticatedUserId(null); } } /** * 读取Task的表单 * @RequestMapping(value = "get-form/task/{processDefinitionkey}") * @PathVariable("processDefinitionkey") String processDefinitionkey */ @RequestMapping(value = "/get-form/task/{processInstanceId}") @ResponseBody public ModelAndView findTaskForm( @PathVariable("processInstanceId") String processInstanceId, HttpServletRequest request) throws Exception { ModelAndView mav = new ModelAndView("leave/apply"); // 获取当前登陆人信息。 /* User user = UserUtil.getUserFromSession(request.getSession()); */ TaskQuery taskQuery = taskService.createTaskQuery() .processInstanceId(processInstanceId).orderByProcessInstanceId().desc(); List<Task> tasks = taskQuery.list(); if (tasks.size()==0) { ModelAndView mav2 = new ModelAndView("leave/finish"); return mav2; } Task task = tasks.get(0); Object renderedTaskForm = formService.getRenderedTaskForm(task.getId()); System.out.println(renderedTaskForm.toString()); mav.addObject("renderedTaskForm", renderedTaskForm.toString());//整个页面,參数已经赋值(整个页面是什么时候赋上值的?) mav.addObject("taskId", task.getId()); mav.addObject("processInstanceId", processInstanceId); return mav; } /** * 办理任务,提交task的并保存form */ @RequestMapping(value = "task/complete/{taskId}/{processInstanceId}") @SuppressWarnings("unchecked") public String completeTask(@PathVariable("taskId") String taskId,@PathVariable("processInstanceId") String processInstanceId, RedirectAttributes redirectAttributes, HttpServletRequest request) { Map<String, String> formProperties = new HashMap<String, String>(); // 从request中读取參数然后转换 Map<String, String[]> parameterMap = request.getParameterMap(); Set<Entry<String, String[]>> entrySet = parameterMap.entrySet(); for (Entry<String, String[]> entry : entrySet) { String key = entry.getKey(); /* * 參数结构:fq_reason,用_切割 fp的意思是form paremeter 最后一个是属性名称 */ if (StringUtils.defaultString(key).startsWith("fp_")) { String[] paramSplit = key.split("_"); formProperties.put(paramSplit[1], entry.getValue()[0]); } } logger.debug("start form parameters: {}", formProperties); try { formService.submitTaskFormData(taskId, formProperties); } finally { identityService.setAuthenticatedUserId(null); } redirectAttributes.addFlashAttribute("message", "任务完毕:taskId=" + taskId); return "redirect:/workflow/auto/get-form/task/"+processInstanceId; }

那么相应的提交表单的方式怎么实现的呢?

Apply.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>申请信息</title>
</head>
<body>
<form name="form1" id="form1" action="${pageContext.request.contextPath}/workflow/auto/task/complete/${taskId}/${processInstanceId}"><div style="margin: 0 auto;">${renderedTaskForm}</div> <input type="hidden" name="taskId"value="${taskId}"><input type="hidden" name="processInstanceId"value="${processInstanceId}"><div><table style="margin: auto" width="600"><tr>         <td align="right" ><input type="submit"  value="下一步" /></td></tr></table> </div> </form>
</body>
</html>

我们让全部的表单(在没有完毕任务时。均返回到apply.jsp页面中。能够让每一个页面均加入上下一步的button)由于对于完毕来说,全部的任务均相应以上的方法实现。

总结:使用这样的外置表单的方式相比我们静态表单的方式有什么差别呢?

1。外置表单的方式不须要我们建立不论什么实体,全部的数据均存放到工作流的数据库,不论什么业务来了均能够使用,当然工作流也支持保存到工作流库中的数据的全部查询操作,直接调用相应的api就可以。

2,须要我们画简单的html页面,对于提交表单等的操作能够使用js单独来操作,假设加入到jsp或html页面中。工作流表单在运行时是不识别的。会报错误

附录:demo说明

1,改动连接的数据库

2。初始化用户,初始化脚本在src/resources文件夹下

3。訪问地址http://localhost:8080/activitiDemo

4,登录后,须要部署流程才干够使用。流程文件在diagrams文件夹下。打成压缩包上传就可以。

activiti外置表单demo

转载于:https://www.cnblogs.com/llguanli/p/6801233.html

【应用篇】Activiti外置表单实例demo(四)相关推荐

  1. Activiti,自定义表单,外置表单,工作流,微服务,子系统

    百度,csdn找了半个月,没有一篇文章将 Activiti 外置表单 讲透彻的,无奈,自己亲手写了一套, 祭出这套大杀器,开放给广大网友. 点击极速体验 账号密码:admin admin123 系统功 ...

  2. 工作流模式每个工作流引擎都会支持多种方式的表单。目前大家讨论到的大概有三种。 动态表单 外置表单 普通表单

    工作流模式 抢占 会签 委托代办 催办 自由流 回退 取回 指派 前加签 后加签 改派 驳回 终止 挂起 激活 基本控制流模式 顺序流(Sequence) 并行分叉(Parallel Split) 同 ...

  3. 表单实例(判断两次密码是否一致)

    表单实例(判断两次密码是否一致) 一.实例描述: 本例是一个综合性的练习,除了们正在学习的JS知识外,还用到了HTML的表格,表单等相关知识. 二.截图 三.代码 1 <!DOCTYPE htm ...

  4. “偷懒”的表单验证Demo

    我们在做开发时,经常要做表单验证,比如验证文本框必须填内容时,而文本框又很多时,传统的做法是逐个判断: if (form1.name.value == "") { alert(&q ...

  5. 菜鸟教程 php表单验证码,PHP完整表单实例 | 菜鸟教程

    PHP 完整表单实例 本章节将介绍如何让用户在点击"提交(submit)"按钮提交数据前保证所有字段正确输入. PHP - 在表单中确保输入值 在用户点击提交按钮后,为确保字段值是 ...

  6. 金蝶云星空与钉钉对接集成供应商查询打通新增表单实例

    金蝶云星空与钉钉对接集成供应商查询打通新增表单实例 对接系统金蝶云星空 金蝶K/3Cloud(金蝶云星空)是移动互联网时代的新型ERP,是基于WEB2.0与云技术的新时代企业管理服务平台.金蝶K/3C ...

  7. 初学HTML代码笔记终极篇3之表单 列表

    一.代码部分 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF- ...

  8. html5表单实例元素,HTML5新表单元素的图文实例-

    这一篇介绍html5新增的表单元素和表单属性. 首先先说一个html5中表单新增的一个功能,在我们之前的html中,表单元素必须放在form元素所包含的里面,在html5中,可以把他们写在页面上的任何 ...

  9. html ajax提交表单实例,Ajax提交表单并接收json实例代码

    需求: 实现点击按钮后,数据以表单形式提交至服务器,并接收来自服务器的返回数据.过程中页面不刷新. html代码 xingming: nianling: ajax提交 js代码 function my ...

最新文章

  1. 一款实用可行的支付系统,专供互联网企业使用,赶紧收藏了!
  2. 零样本性能超越GPT-3!谷歌提出1370亿参数自回归语言模型
  3. Redis与Jedis排序
  4. python高阶函数教学_Python 简明教程 --- 16,Python 高阶函数
  5. 第一章:React入门
  6. paping使用来测试联通网站由于tcp协议导致的无法通信问题超时问题
  7. JQuery 快速入门一篇通
  8. nodejs连接postgresql_PostgreSQL 使用 node-postgres 在 node.js 中的应用
  9. matlab线性回归s和2,数据回归分析和拟合的matlab实现2.doc
  10. sql server 函数--rand() 生成整数的随机数
  11. python机器学习-乳腺癌细胞挖掘
  12. 使用Python实现excel项目清单自动生成word文档
  13. 画 ArcFace 中的 margin 曲线
  14. 国产开源「文本-视频生成」模型!免费在线体验,一键实现视频生成自由
  15. Java设计原则之单一职责原则、开闭原则、里氏代换原则
  16. oracle小表走索引为什么慢,走了索引为啥还像蜗牛一样?
  17. 简单的web工程接收消息text--微信企业号
  18. DIT和DIF实现快速傅里叶变换的FFT
  19. IDEA EasyCode(代码神器)
  20. 90后黑客攻击某购物平台 “一元购”买走800万金饰

热门文章

  1. 什么是LinkedList?什么时候使用它呢?Java LinkedList结构、用法及源码解析
  2. 2022-2028年中国硅酸钙板行业市场研究及前瞻分析报告
  3. 中信银行总行信息科技部笔试面试以及最后拿offer经历
  4. 最强 NLP 预训练模型库 PyTorch-Transformers 正式开源:支持 6 个预训练框架,27 个预训练模型...
  5. 如何将算子添加到Relay
  6. CPU架构的llvm后端
  7. Laravel7中Redis队列的使用
  8. React router 的 Route 中 component 和 render 属性理解
  9. AttributeError: ‘NoneType‘ object has no attribute ‘group‘
  10. Python 用while 实现循环 到特定条件退出循环(input 输入错误之后重新输入)