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

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVqaW5neXVhbjY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

不允许为:${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

【应用篇】Activiti外置表单实例demo(四)的更多相关文章

  1. 2017.2.28 activiti实战--第六章--任务表单(二)外置表单

    学习资料:<Activiti实战> 第六章 任务表单(二)外置表单 6.3 外置表单 考虑到动态表单的缺点(见上节),外置表单使用的更多. 外置表单的特点: 页面的原样显示 字段值的自动填 ...

  2. 工作流Activiti框架中表单的使用!详细解析内置表单和外置表单的渲染

    Activiti中的表单 Activiti提供了一种方便而且灵活的方式在业务流程中以手工方式添加表单 对表单的支持有2种方式: 通过表单属性对内置表单进行渲染 通过表单属性对外置表单进行渲染 表单属性 ...

  3. @valid表单验证demo

    springMVC 表单验证demo  视图层使用的是jsp

  4. PHP 表单验证 - 完成表单实例

    ------------------------------------------------------------------------------------------- 本节展示如何在用 ...

  5. PHP 表单 - 5(完整表单实例)

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

  6. HTML表单实例

    HTML表单 表单用于搜集不同类型的用户输入,表单由不同类型的标签组成,实现一个特定功能的表单区域(比如:注册), 首先应该用<form>标签来定义表单区域整体,在此标签中再使用不同的表单 ...

  7. SpringBoot非官方教程 | 第二十篇: 处理表单提交

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot-form/ 本文出自方志朋的博客 这篇文件主要介 ...

  8. SpringBoot非官方教程 | 第十九篇: 验证表单信息

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot19/ 本文出自方志朋的博客 这篇文篇主要简述如何 ...

  9. ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第四篇:传递表单数据

    摘要      本文将完成我们“MVC公告发布系统”的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言      通过前几篇文章,我们已经能比较自如的使用ASP.NET ...

随机推荐

  1. Manacher【SP7586】NUMOFPAL - Number of Palindromes

    Description 求一个串中包含几个回文串. Input 输入一个字符串\(S\) Output 包含的回文串的个数. 看到题解里面有人人写回文自动机. 有必要那么麻烦嘛 emmm 我们直接跑\ ...

  2. 找礼物(find)(模拟)

    找礼物(find) 时间限制: 1 Sec  内存限制: 64 MB提交: 57  解决: 4[提交][状态][讨论版] 题目描述 新 年到了,你的好友和你(共K个人)的周围满是礼物,你让你的好友先拿 ...

  3. create table select from

    CREATE TABLE new_table AS SELECT * FROM old_table

  4. [Codeforces 8D] Two Friends

    Brief Introduction: 有两人a.b,他们都在A点,a经过B点到C点,而b直接到C点.a走过的距离不超过la,b走过距离不超过lb,询问他们可能经过最长的公共距离. Algorithm ...

  5. 【最小路径覆盖】【二分图】【最大流】【Dinic】bzoj2150 部落战争

    裸的最小路径覆盖. 把每个点拆点,变成二分图. 对于可以连边的点对(i,j):i->j'(1); 对于任意一点i,若i点为'.':S->i(1),i'->T(1); 答案为所有'.' ...

  6. STL之vector4

    描述 将一个n行m列矩阵元素输入存储后并输出. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { vector< vector<int> > ...

  7. Python学习实践 | speech智能语音模块

    最近的生活.学习节奏很是容易被打断,终于,在今天,既实习结束之后,夏令营也结束了. 前几天,一个人在复习地很累的时候,又重新将Python捡了起来,看了挺多的知识点. 真是太有意(wu)思(liao) ...

  8. 使用apt-cache search搜索想要的软件包

    环境: Ubuntu14.10 我在编译u-boot代码的时候遇到了如下问题: LD test/dm/built-in.o CC examples/standalone/stubs.o LD exam ...

  9. Vue组件开发实例(详细注释)

    Vue组件开发实例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  10. Webpack安装和配置

    一.安装和配置webpack 1.全局安装webpack 这样就安装好了webpack,可以再全局通过webpack -v来查看是否安装成功. 2.先创建项目目录结构,根目录是mywebpack.进入 ...