ACTIVITI 自定义外置表单 formkey JSP

本文介绍了如何在Activiti中实现外置表单的自定义,通过设置formkey为JSP文件,使得流程与表单能够完全分离,简化部署过程。分享了具体的配置步骤和实践心得。
摘要由CSDN通过智能技术生成

使用Activiti的时候,发现外外置表单需要将.form文件和流程一起打包部署。

实际应用时,感觉好麻烦。不能将流程和表单完全分离开,现将配置formkey 为JSP文件的做法分享,参考如下:

一、定义java Test FormEngine:
package me.kafeitu.activiti.chapter6.form;
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);
}
}
}
}
二、Controller 中的方法如下:
/**
* 读取启动流程的表单字段
*/
@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;
}
三、JSP中的配置如下:
 
<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>
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值