使用Activiti的时候,发现外外置表单需要将.form文件和流程一起打包部署。
实际应用时,感觉好麻烦。不能将流程和表单完全分离开,现将配置formkey 为JSP文件的做法分享,参考如下:
一、定义java Test FormEngine:
package me.kafeitu.activiti.chapter6.form;二、Controller 中的方法如下:
import org.activiti.engine.ActivitiException;
import org.activiti.engine.delegate.VariableScope;
import org.activiti.engine.form.FormData;
import org.activiti.engine.form.StartFormData;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.form.FormEngine;
import org.activiti.engine.impl.persistence.entity.ResourceEntity;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.impl.scripting.ScriptingEngines;
import java.io.UnsupportedEncodingException;
public class TestFormEngine implements FormEngine {
private static final String NOT_FOUND_FORM_CONTENT_FLAG = "____NOT_FOUND_FORM___";
public TestFormEngine() {
System.out.print("TestFormEngine init...............");
}
public String getName() {
return "juel";
}
public Object renderStartForm(StartFormData startForm) {
System.out.print("renderStartForm...............");
if(startForm.getFormKey() == null) {
return null;
} else {
String formTemplateString = this.getFormTemplateString(startForm, startForm.getFormKey());
System.out.print("formTemplateString..............."+formTemplateString);
if(NOT_FOUND_FORM_CONTENT_FLAG.equals(formTemplateString)){
return startForm.getFormKey();
}
ScriptingEngines scriptingEngines = Context.getProcessEngineConfiguration().getScriptingEngines();
return scriptingEngines.evaluate(formTemplateString, "juel", (VariableScope)null);
}
}
public Object renderTaskForm(TaskFormData taskForm) {
if(taskForm.getFormKey() == null) {
return null;
} else {
String formTemplateString = this.getFormTemplateString(taskForm, taskForm.getFormKey());
if(NOT_FOUND_FORM_CONTENT_FLAG.equals(formTemplateString)){
return taskForm.getFormKey();
}
ScriptingEngines scriptingEngines = Context.getProcessEngineConfiguration().getScriptingEngines();
TaskEntity task = (TaskEntity)taskForm.getTask();
return scriptingEngines.evaluate(formTemplateString, "juel", task.getExecution());
}
}
protected String getFormTemplateString(FormData formInstance, String formKey) {
String deploymentId = formInstance.getDeploymentId();
ResourceEntity resourceStream = Context.getCommandContext().getResourceEntityManager().findResourceByDeploymentIdAndResourceName(deploymentId, formKey);
if(resourceStream == null) {
// throw new ActivitiObjectNotFoundException("Form with formKey \'" + formKey + "\' does not exist", String.class);
return NOT_FOUND_FORM_CONTENT_FLAG;
} else {
byte[] resourceBytes = resourceStream.getBytes();
String encoding = "UTF-8";
String formTemplateString = "";
try {
formTemplateString = new String(resourceBytes, encoding);
return formTemplateString;
} catch (UnsupportedEncodingException var9) {
throw new ActivitiException("Unsupported encoding of :" + encoding, var9);
}
}
}
}
/**三、JSP中的配置如下:
* 读取启动流程的表单字段
*/
@RequestMapping(value = "getform/start/{processDefinitionId}")
public ModelAndView readStartForm(@PathVariable("processDefinitionId") String processDefinitionId) throws Exception {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();
boolean hasStartFormKey = processDefinition.hasStartFormKey();
// 根据是否有formkey属性判断使用哪个展示层
String viewName = "chapter6/start-process-form";
ModelAndView mav = new ModelAndView(viewName);
// 判断是否有formkey属性
if (hasStartFormKey) {
Object renderedStartForm = formService.getRenderedStartForm(processDefinitionId);
//Object renderedStartForm = formService.getRenderedStartForm(processDefinition.getId(), "juel");
mav.addObject("startFormData", renderedStartForm);
mav.addObject("processDefinition", processDefinition);
} else { // 动态表单字段
StartFormData startFormData = formService.getStartFormData(processDefinitionId);
mav.addObject("startFormData", startFormData);
}
mav.addObject("hasStartFormKey", hasStartFormKey);
mav.addObject("processDefinitionId", processDefinitionId);
return mav;
}
<c:if test="${hasStartFormKey}">
<c:if test="${fn:endsWith(startFormData, '.jsp')}">
<c:import url="${startFormData}" ></c:import>
</c:if>
<c:if test="${!fn:endsWith(startFormData, '.jsp')}">
${startFormData}
</c:if>
</c:if>
四、在流程定义中可以formKey:
<startEvent id="startevent1" name="Start" activiti:initiator="applyUserId" activiti:formKey="chapter6/leave-formkey/leave-start.form"></startEvent>
五、activiti.cfg.xml 中的配置如下:
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration"> <property name="jdbcUrl" value="jdbc:h2:file:~/activiti-in-action-chapter6;AUTO_SERVER=TRUE" /> <property name="jdbcDriver" value="org.h2.Driver" /> <property name="jdbcUsername" value="sa" /> <property name="jdbcPassword" value="" /> <property name="databaseSchemaUpdate" value="true" /> <property name="jobExecutorActivate" value="false" /> <!-- 自定义表单引擎 --> <property name="customFormEngines"> <list> <bean class="me.kafeitu.activiti.chapter6.form.TestFormEngine" /> </list> </property> </bean>
相关推荐
在本项目"activiti自定义表单demo"中,我们主要关注的是如何使用SpringBoot集成Activiti工作流引擎,实现自定义表单和流程。这个Demo提供了完整的代码示例,帮助开发者理解并应用到实际项目中。以下是相关知识点的...
activiti外置表单demo实现 运行方式: 1,修改连接的数据库 2,初始化用户,初始化脚本在src/resources目录下 3,访问地址http://localhost:8080/activitiDemo 4,登录后,需要部署流程才可以使用,流程文件在...
activiti三种表单的demo实现 运行方式: 1,修改连接的数据库 2,sql文件在resources\sql下 3,访问地址http://localhost:8080/activiti-demo/main/index
Activiti作为一款开源的工作流引擎,提供了多种表单类型的支持,包括动态表单(即内置表单)和外置表单等。本文将详细介绍这些表单类型的特点以及如何使用它们。 #### 二、内置表单(动态表单) 内置表单是...
总的来说,"表自定义表单+工作流.zip"项目提供了一个基于SpringBoot和Activiti的低代码开发平台,实现了自定义表单设计和工作流管理的集成。这不仅为企业带来了灵活的流程定义和执行能力,还降低了开发成本,提升了...
本文将深入探讨如何在Activiti 6.0版本中实现流程图片的自定义颜色功能,以增强流程图的可读性和美观性。 首先,我们要理解流程图在Activiti中的作用。流程图是流程模型的可视化表示,它帮助用户理解并跟踪业务流程...
《Activiti整合流程自定义设计:SpringBoot+Activiti+Bootstrap+Angular实战解析》 在当今的信息化时代,业务流程管理(BPM)系统已成为企业不可或缺的一部分。Activiti,一个强大的开源工作流引擎,以其易用性和...
在"activiti6.0 自定义流程路径颜色和任务颜色"这个主题中,我们主要关注如何根据业务需求定制流程图的显示效果,特别是流程路径和任务节点的颜色。 首先,流程图的颜色定制对于理解和跟踪流程状态至关重要。默认...
在 Activiti 中,这通常与一个服务任务关联,通过表单收集请假信息,如请假人、请假天数、原因等。 - **动态表单**:为了方便用户提交请假申请,可以创建动态表单,允许员工输入请假数据,并将其与流程实例关联。 ...
《Spring-Activiti在Ruoyi框架中的应用与二次开发》 在当今的企业级应用开发中,工作流管理系统已经成为不可或缺的一部分。Spring-Activiti作为一款强大的工作流引擎,结合Spring Boot框架,为开发者提供了便捷、...
1. **设计流程定义**:在流程定义中,你需要为用户任务指定一个表单键(formKey)。这个键用于关联特定的表单。在Activiti的工作流设计器中,你可以直接编辑XML定义,或者使用图形化界面添加用户任务,并设置表单键...
针对煤矿机械制造企业,实现对产品生产全面管理为目的,设计使用Activiti工作流结合外置表单技术,通过在管理系统中部署测试,得出该方法可有效监控生产进度,保证信息及时而通畅传递。构建的过程模型,具有高兼容、...
我花了半天时间把网上零散的资源整理成了一张excel表单,activiti 24张表及其每个字段都做了比较详细的介绍,看上去一目了然
拖拽式表单设计器java版,排版可随意定制,提供丰富的表单控件,根据Ueditor改造,表单设计完成之后,可直接进行工作流的扭转,工作流纯源码,可以随意定制二次改造,微信搜索 开源码农 ,更多资源免费下载
7. **集成与部署**: 将自定义表单和相关服务代码集成到Activiti引擎中,并部署到生产环境,确保整个流程可以正常运行。 8. **测试与优化**: 进行详尽的测试,包括单元测试、集成测试和用户验收测试,确保流程的稳定...
Activiti 是一个开源的工作流和业务自动化引擎,广泛应用于企业级流程管理中。这个压缩包“activiti-选择代理人候选人候选组.rar”显然是为了解决在Activiti流程设计中的一个特定问题,即如何更加便捷地选择流程参与...
#Activiti Anypoint 连接器此连接器可用于连接 Activiti 版本。 5.17.0 并使用可用的 REST API 要使用这个连接器,需要安装和配置一个 Activiti 服务器实例Activiti REST 模块。 有关 Activiti 的安装和所需的设置,...
Activiti工作流样例-流程执行-外部表单时序图