`
weir2009
  • 浏览: 265854 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

activiti5整合网页流程设计器

阅读更多

我的框架是spring +spring data jpa+spring mvc+activiti5.16.2

activiti 的包我就不说了,不想找麻烦就都拿过来,我也没有做什么整理,拿过来用就行了,以后可以慢慢研究。

下面是配置文件,我假设你已经会使用activiti,怎么整合到spring应该没问题,在整合网页设计器时主要是配置web.xml文件:

<!-- Restlet adapter, used to expose modeler functionality through REST -->
    <servlet>
        <servlet-name>ExplorerRestletServlet</servlet-name>
        <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
        <init-param>
            <!-- Application class name -->
            <param-name>org.restlet.application</param-name>
            <param-value>org.activiti.explorer.rest.application.ExplorerRestApplication</param-value>
        </init-param>
    </servlet>

    <servlet>
        <servlet-name>RestletServlet</servlet-name>
        <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
        <init-param>
            <!-- Application class name -->
            <param-name>org.restlet.application</param-name>
            <param-value>org.activiti.rest.service.application.ActivitiRestServicesApplication</param-value>
        </init-param>
    </servlet>
	<!-- Catch all service requests -->
	<servlet-mapping>
		<servlet-name>ExplorerRestletServlet</servlet-name>
		<url-pattern>/service/*</url-pattern>
	</servlet-mapping>

    <servlet-mapping>
        <servlet-name>RestletServlet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

 activiti的网页设计器是使用rest技术,所以web.xml文件里面需要配置一下rest。

 

接下来就是要引入网页了:

首先将activiti-explorer.war 包 解压开来。

需要的文件有:



 将其拷贝到项目中

 

 

将其拷贝到:src/main/resource下面

如果你的不是这样的结构,你直接拷贝到src

最后还要整合一个java代码,也就是web.xml所引用的那个类:

package org.activiti.explorer.rest.application;

import org.activiti.rest.common.api.DefaultResource;
import org.activiti.rest.common.application.ActivitiRestApplication;
import org.activiti.rest.common.filter.JsonpFilter;
import org.activiti.rest.editor.application.ModelerServicesInit;
import org.restlet.Restlet;
import org.restlet.routing.Router;

public class ExplorerRestApplication extends ActivitiRestApplication {
  
  public ExplorerRestApplication() {
    super();
  }
  /**
   * Creates a root Restlet that will receive all incoming calls.
   */
  @Override
  public synchronized Restlet createInboundRoot() {
    Router router = new Router(getContext());
    router.attachDefault(DefaultResource.class);
    ModelerServicesInit.attachResources(router);
    JsonpFilter jsonpFilter = new JsonpFilter(getContext());
    jsonpFilter.setNext(router);
    return jsonpFilter;
  }

}

 需要注意的是包路径要写对。

这样做药之后项目可以运行起来了,但是还没发看到网页设计器,还缺少一个管理页面,暂且叫它流程模型控制器,需要一个controller类和几个页面

package com.weir.oa.activiti.web.workflow;

import java.io.ByteArrayInputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.weir.oa.util.DataGrid;
import com.weir.oa.util.Json;

import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.Model;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 流程模型控制器
 *
 * @author henryyan
 */
@Controller
@RequestMapping(value = "/model")
public class ModelController {

    protected Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    RepositoryService repositoryService;

    /**
     * 模型列表
     */
    @ResponseBody
    @RequestMapping("list")
    public DataGrid<Model> list() {
    	List<Model> list = repositoryService.createModelQuery().list();
    	DataGrid<Model> dg = new DataGrid<Model>((long)list.size(),list);
    	return dg;
    }

    /**
     * 创建模型
     */
    @RequestMapping("create")
    public void create(String name,String key, String description, HttpServletRequest request, HttpServletResponse response) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();
            ObjectNode editorNode = objectMapper.createObjectNode();
            editorNode.put("id", "canvas");
            editorNode.put("resourceId", "canvas");
            ObjectNode stencilSetNode = objectMapper.createObjectNode();
            stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");
            editorNode.put("stencilset", stencilSetNode);
            Model modelData = repositoryService.newModel();

            ObjectNode modelObjectNode = objectMapper.createObjectNode();
            modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, name);
            modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
            description = StringUtils.defaultString(description);
            modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);
            modelData.setMetaInfo(modelObjectNode.toString());
            modelData.setName(name);
            modelData.setKey(StringUtils.defaultString(key));

            //保存模型
            repositoryService.saveModel(modelData);
            repositoryService.addModelEditorSource(modelData.getId(), editorNode.toString().getBytes("utf-8"));
            
            response.sendRedirect(request.getContextPath() + "/service/editor?id=" + modelData.getId());
        } catch (Exception e) {
            logger.error("创建模型失败:", e);
        }
    }

    /**
     * 根据Model部署流程
     */
    @ResponseBody
    @RequestMapping("deploy")
    public Json deploy(String modelId) {
    	Json json = new Json();
        try {
            Model modelData = repositoryService.getModel(modelId);
            ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
            byte[] bpmnBytes = null;

            BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
            bpmnBytes = new BpmnXMLConverter().convertToXML(model);

            String processName = modelData.getName() + ".bpmn20.xml";
            Deployment deployment = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes)).deploy();
            json.setMsg("部署成功,部署ID=" + deployment.getId());
            json.setSuccess(true);
        } catch (Exception e) {
            logger.error("根据模型部署流程失败:modelId={}", modelId, e);
            json.setMsg("模型部署流程失败");
        }
        return json;
    }

    /**
     * 导出model的xml文件
     */
    @RequestMapping("export")
    public void export(String modelId, HttpServletResponse response) {
        try {
            Model modelData = repositoryService.getModel(modelId);
            BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
            JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
            BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);
            BpmnXMLConverter xmlConverter = new BpmnXMLConverter();
            byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);

            ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);
            IOUtils.copy(in, response.getOutputStream());
            String filename = bpmnModel.getMainProcess().getId() + ".bpmn20.xml";
            response.setHeader("Content-Disposition", "attachment; filename=" + filename);
            response.flushBuffer();
        } catch (Exception e) {
            logger.error("导出model的xml文件失败:modelId={}", modelId, e);
        }
    }

    @RequestMapping(value = "delete/{modelId}")
    public String delete(@PathVariable("modelId") String modelId) {
        repositoryService.deleteModel(modelId);
        return "redirect:/workflow/model/list";
    }

}

 网页(easyui实现):list 列表页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<jsp:include page="/pub.jsp"></jsp:include>
	<title>流程列表</title>
<script type="text/javascript">
var userDataGrid;
$(function() {
	userDataGrid = $('#user_datagrid').datagrid({
		url : '${pageContext.request.contextPath}/model/list.do',
		fit : true,
		fitColumns : true,
		border : false,
		pagination : true,
		idField : 'id',
		pagePosition : 'both',
		checkOnSelect:true,
		selectOnCheck:true,
		columns : [ [ {
			field : 'id',
			title : 'ID'
		}, {
			field : 'key',
			title : 'KEY',
			sortable : true
		}, {
			field : 'name',
			title : '名称',
			sortable : true
		}, {
			field : 'version',
			title : '版本'
		}, {
			field : 'createTime',
			title : '创建时间'
		}, {
			field : 'lastUpdateTime',
			title : '更新时间'
		}, {
			field : 'metaInfo',
			title : '元数据'
		}] ],
		toolbar : [ {
			text : '增加',
			iconCls : 'ext-icon-add',
			handler : function() {
				userAdd();
			}
		}],
		onRowContextMenu:function(e, rowIndex, rowData){
			e.preventDefault();
			$(this).datagrid('unselectAll');
			$(this).datagrid('selectRow',rowIndex);
			$('#user_menu').menu('show', {
				left : e.pageX,
				top : e.pageY
			});
		}
	});
	
	$('#user_edit_depid').combotree({
		url : '${pageContext.request.contextPath}/dep/tree.do',
		idField:'departmentId',
		textField:'departmentname',
		parentField : 'parentId',
		lines : true,
		panelHeight : 'auto',
		onClick: function(node){
			$("#user_edit_depid").combotree('setValue', node.departmentId);
		}
	});
});

function userAdd() {
	fromReset("admin_addUserForm");
	$('#admin_addUser').dialog('open');
}

function addUserForm(){
	$('#admin_addUserForm').submit();
}

function userEdit(){
	var rows = userDataGrid.datagrid('getChecked');
	if(rows.length==1){
		window.open("${pageContext.request.contextPath}/service/editor?id="+rows[0].id);
	}else{
		parent.$.messager.alert('提示','请选择一条记录进行修改');
	}
}
function exportModel(){
	var rows = userDataGrid.datagrid('getChecked');
	if(rows.length==1){
		window.open("${pageContext.request.contextPath}/model/export.do?modelId="+rows[0].id);
	}else{
		parent.$.messager.alert('提示','请选择一条记录进行修改');
	}
}

function deployModel(){
	var rows = userDataGrid.datagrid('getChecked');
	if(rows.length==1){
		$.post('${pageContext.request.contextPath}/model/deploy.do', {modelId:rows[0].id}, function(j) {
			parent.$.messager.progress({
				title : '提示',
				text : '数据处理中,请稍后....'
			});
			if (j.success) {
				parent.$.messager.progress('close');
				userDataGrid.datagrid('load');
			}
			userDataGrid.datagrid('uncheckAll');
			$.messager.show({
				title : '提示',
				msg : j.msg,
				timeout : 5000,
				showType : 'slide'
			});
		}, 'json');
	}else{
		parent.$.messager.alert('提示','请选择一条记录进行修改');
	}
}

function userDelete(){
	var rows = userDataGrid.datagrid('getChecked');
	var ids = [];
	if(rows.length>0){
		$.messager.confirm('确认','您确认想要删除记录吗?',function(r){
		    if (r){
		    	for(var i=0;i<rows.length;i++){
					ids.push(rows[i].id);
				}
				$.post('${pageContext.request.contextPath}/user/delete.do', {ids:ids.join(',')}, function(j) {
					if (j.success) {
						userDataGrid.datagrid('load');
						$('#admin_addUser').dialog('close');
					}
					userDataGrid.datagrid('uncheckAll');
					$.messager.show({
						title : '提示',
						msg : j.msg,
						timeout : 5000,
						showType : 'slide'
					});
				}, 'json');
		    }    
		});
	}else{
		$.messager.show({
			title : '提示',
			msg : '请勾选要删除的记录',
			timeout : 5000,
			showType : 'slide'
		});
	}
}
</script>
</head>

<body>
<div class="easyui-layout" data-options="fit:true,border:false">
	<div data-options="region:'center',border:false,title:'模型列表'" style="overflow: hidden;">
		<table id="user_datagrid"></table>
	</div>
</div>

<div id="user_menu" class="easyui-menu" style="width: 120px;display: none;">
<div onclick="userEdit()" iconCls="icon-edit">编辑</div>
<div onclick="deployModel()" iconCls="icon-edit">部署</div>
<div onclick="exportModel()" iconCls="icon-edit">导出</div>
<div onclick="userDelete()" iconCls="icon-remove">删除</div>
</div>

<div id="admin_addUser" class="easyui-dialog" data-options="closed:true,modal:true,title:'添加用户',buttons:[{
				text : '保存',
				iconCls : 'icon-save',
				handler : function() {
					addUserForm();
				}
			}]" style="width: 300px;height: 200px;">
	<form id="admin_addUserForm" action="${pageContext.request.contextPath}/model/create.do" target="_blank" method="post">
		<table>
			<tr>
				<th>名称</th>
				<td><input name="name" id="name"  class="easyui-validatebox" data-options="required:true,missingMessage:'名称必填'" /></td>
			</tr>
			<tr>
				<th>KEY</th>
				<td><input name="key"  id="key"  class="easyui-validatebox" data-options="required:true,missingMessage:'KEY必填'" /></td>
			</tr>
			<tr>
				<th>描述</th>
				<td><textarea id="description" name="description"></textarea></td>
			</tr>
		</table>
	</form>
</div>
</body>
</html>

 add 创建页面:

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>创建模型</title>
<meta name="content-type" content="text/html; charset=UTF-8">
<jsp:include page="/pub.jsp"></jsp:include>
<script type="text/javascript">
	var useradd_submitForm = function(dialog, user_datagrid, p) {
		if ($('user_addForm').form('validate')) {
			/* $.post('${pageContext.request.contextPath}/model/create.do', $("#user_addForm").serialize(), function(j) {
			}, 'json'); */
			var form = document.forms[0];
			form.action='${pageContext.request.contextPath}/model/create.do';
			form.submit();
		}
	};
</script>
</head>

<body>
	<form id="user_addForm"  action="" method="post">
		<input type="hidden" name="userId"/>
		<table style="width: 100%;">
			<tr>
				<th>名称</th>
				<td><input name="name" id="name"  class="easyui-validatebox" data-options="required:true,missingMessage:'名称必填'" /></td>
			</tr>
			<tr>
				<th>KEY</th>
				<td><input name="key"  id="key"  class="easyui-validatebox" data-options="required:true,missingMessage:'KEY必填'" /></td>
			</tr>
			<tr>
				<th>描述</th>
				<td><textarea id="description" name="description"></textarea></td>
			</tr>
		</table>
	</form>
</body>
</html>

 现在你就可以对模型通过activiti网页设计器进行增删改查,还有部署和导出操作了。

网页设计器的整合基本就需要这些,也不是特别麻烦。

 补充:

package com.weirblog.util;

import java.util.ArrayList;
import java.util.List;

public class DataGrid<T> {

	private Long total = 0L;
	private List<T> rows = new ArrayList<T>();

	public DataGrid() {
		super();
	}

	public DataGrid(Long total, List<T> rows) {
		super();
		this.total = total;
		this.rows = rows;
	}

	public Long getTotal() {
		return total;
	}

	public void setTotal(Long total) {
		this.total = total;
	}

	public List<T> getRows() {
		return rows;
	}

	public void setRows(List<T> rows) {
		this.rows = rows;
	}

}

 

作者博客:http://www.loveweir.com

  • 大小: 42.8 KB
  • 大小: 47 KB
8
4
分享到:
评论
12 楼 panamera 2016-08-12  
保存模型提示保存路径不存在,怎么把流程设计器的保存按钮和后台系统的控制器关联起来
11 楼 fly_to_the_winds 2016-06-05  
楼主能出一篇整合activiti5.20的博文么?我整合的时候出很多问题
10 楼 bmcsy 2016-05-18  
请问博主是否关注过5.20版本的rest部分?貌似变化很大呢
9 楼 weir2009 2015-11-04  
u012792794 写道
能提供一下源代码吗

源码没有不过现在 网上有免费的视频学习了,学习一下就会了。
8 楼 u012792794 2015-11-03  
能提供一下源代码吗
7 楼 cao2358 2015-10-15  
调试的时候,发现是repositoryServcice.getModel(“2701”)返回的是null,问题是我在act_re_model表中是存在数据的
6 楼 cao2358 2015-10-15  
WARNING: A response with a 200 (Ok) status should have an entity. Make sure that resource "http://localhost:8080/activiti0830/service/model/2701/json" returns one or sets the status to 204 (No content).
楼主看看这是什么问题呢? 我无论在resources文件夹下加上activiti.cfg.xml文件,并且配置processEngine的name属性为“test”。或者我将该文件删除掉,都会这样,然后进不去web在线编辑页面。
5 楼 tinybeats 2015-04-03  
nice,先mark
4 楼 yanyanwish 2014-12-25  
集成完毕后,填完名称、Key后创建没有反应,modelor页面出不来。 直接访问http://localhost:8080/MyPro/service/editor?id=27501可以进入流程编辑页面

后台提示:
信息: ExplorerRestletServlet: [Restlet] ServerServlet: component class is null
信息: ExplorerRestletServlet: [Restlet] Attaching application: org.activiti.explorer.rest.application.ExplorerRestApplication@b56efe to URI: /MyPro/service
3 楼 weir2009 2014-12-23  
yanyanwish 写道
请问这个com.weir.* 是哪个jar包?

import com.weir.oa.util.DataGrid;
import com.weir.oa.util.Json;


我只是提供实现思路,具体代码 要根据自己的项目来
2 楼 yanyanwish 2014-12-22  
请问这个com.weir.* 是哪个jar包?

import com.weir.oa.util.DataGrid;
import com.weir.oa.util.Json;
1 楼 hntuddn 2014-10-10  
很好,学习了

相关推荐

    Activiti工作流整合Web流程设计器整合

    Activiti工作流引擎是一款强大的开源工作流解决方案,它基于模型驱动的架构,旨在为企业...而提供的"Activiti整合流程设计器"压缩包文件很可能包含了示例代码、配置文件和教程资源,有助于进一步学习和实践这个主题。

    activiti5.22-web流程设计器整合demo

    《Activiti 5.22 Web 流程设计器整合实战详解》 在信息化管理中,流程自动化扮演着至关重要的角色,而Activiti作为一款开源的工作流引擎,深受开发者喜爱。本示例“activiti5.22-web流程设计器整合demo”提供了一个...

    Activiti在线流程设计器

    忙活了一个星期左右,查找各种资料,终于将Activiti的流程设计器分离出来,与SpringMVC,spring整合了起来,先把工程分享出来,等有时间了在慢慢讲解具体的整合步骤。工程下载之后直接可以运行,只需要改一下数据库...

    activiti-modeler工作流网页版设计器

    Activiti-Modeler是一款强大的工作流网页版设计器,专为简化和优化业务流程管理而设计。它基于流行的Activiti工作流引擎,提供了一个直观、易用的界面,使得开发者和业务分析师无需深入代码就能设计、修改和部署工作...

    Springboot2整合Activiti5设计器

    在本文中,我们将深入探讨如何将Spring Boot 2与Activiti 5流程设计器进行整合,以便在Java开发环境中实现高效的工作流管理。首先,我们需要理解这两个核心组件:Spring Boot和Activiti。 Spring Boot是Spring框架...

    Activiti框架与spring整合web网页端实现流程设计器

    终于将Activiti的流程设计器分离出来,与SpringMVC,spring整合了起来,先把工程分享出来,等有时间了在慢慢讲解具体的整合步骤。工程下载之后直接可以运行,只需要改一下数据库连接。访问...

    springboot2.0.3+activiti.5.22.0+oracle在线流程设计器(Activiti-Modeler )整合

    Activiti Modeler 是Activiti提供的一个流程设计器,允许用户通过Web界面创建、编辑和管理流程模型,无需编写代码,极大地提升了流程设计的效率和可维护性。 Oracle是世界上最广泛使用的数据库系统之一,尤其在企业...

    springboot2.1.1整合activiti5.22web流程设计器

    SpringBoot 2.1.1 整合 Activiti 5.22 Web 流程设计器是将企业级工作流引擎Activiti与流行的轻量级Java开发框架Spring Boot结合的实践。这一整合使得开发者能够轻松地在Web环境中设计、运行和管理业务流程。以下是...

    Activiti可视化流程设计器

    Activiti Designer则是与Activiti引擎配套的一款基于Eclipse的图形化流程设计工具,它允许开发者通过拖拽方式构建复杂的业务流程模型。 在深入探讨Activiti Designer之前,我们先了解一下BPMN 2.0。Business ...

    activiti5.19整合(包含设计器)

    这个压缩包“activiti5.19整合(包含设计器)”提供了 Activiti 5.19 版本与Spring 4 和 ExtJS 4.2.3 的集成示例,其中包含了流程设计器和流程管理模块,旨在帮助开发者更好地理解和应用 Activiti 在实际项目中的工作...

    spring整合activiti网页流程设计器所需要的静态资源

    `stencilset.json` 文件是Activiti流程设计器的核心配置,它定义了流程图中可用的各种形状(如开始事件、结束事件、用户任务等)以及它们的属性和行为。开发者可以通过修改这个JSON文件来定制自己的流程元素库,以...

    SpringBoot 集成 Activiti在线设计器(完整Demo)

    小编 做的这个项目有部分功能用到了 Activiti工作流,目前对工作流的掌握程度是基本会用,我之前写过一篇 Activiti 入门篇,当前这篇文章是属于Activiti 实战部分,如果你想知道Activiti 工作流是如何使用的话,那就...

    整合activiti-5.21.0流程设计器

    ### 整合activiti-5.21.0流程设计器 #### 一、整合activiti-5.21.0流程设计器 为了提高流程设计的便捷性和效率,本篇文章将介绍如何整合activiti-modeler 5.21.0版,并对其进行二次封装,从而降低开发难度。下面将...

    activiti整合流程自定义设计

    《Activiti整合流程自定义设计:SpringBoot+Activiti+Bootstrap+Angular实战解析》 在当今的信息化时代,业务流程管理(BPM)系统已成为企业不可或缺的一部分。Activiti,一个强大的开源工作流引擎,以其易用性和...

    activiti 流程设计器 示例

    代码为activiti 流程设计器示例,另: jeecg + activiti 流程设计器整合 链接:https://blog.csdn.net/anysun7/article/details/79970420

    activiti-modeler-5.18流程设计器整合springmvc+spring例子

    Activiti的流程设计器分离出来,与SpringMVC,spring整合了起来,先把工程分享出来,等有时间了在慢慢讲解具体的整合步骤。工程下载之后直接可以运行,只需要改一下数据库连接。访问...

    springboot 2.0.3+activiti 5.22 设计器整合

    特别的是,它还集成了网页设计器,让用户能够直观地设计和修改工作流,实现真正的"开箱即用"体验。 **SpringBoot 2.0.3** 是一个基于Spring框架的高度简化和自动配置的启动器,使得开发Spring应用程序变得更加便捷...

    bpmn.js 2.0流程编辑器 搭配 Activiti 7.0 进行工作流编辑器集成开发

    BPMN 无处不在,适合所有人 在浏览器中创建、嵌入和扩展 BPMN 图。单独使用它或将其集成到您的应用...3. 集成浏览器内流程引擎、令牌模拟、自定义元素、样式或建模规则。这取决于您,因为 bpmn-js 是一个开放的工具包。

    activiti整合drools案例

    综上所述,"activiti整合drools案例"是一个将业务流程管理与规则引擎相结合的实际应用,通过这种方式,我们可以构建出更加智能、适应性强的企业业务系统。学习并掌握这一整合技术,对于提升企业业务系统的灵活性和...

    STRUTS2+SPRING3+ACTIVITI5 整合 jar 包

    它提供了一套图形化的流程设计工具,可以方便地创建和修改流程定义。ACTIVITI5不仅支持基本的流程控制,还具备复杂的决策和事件处理能力。通过与SPRING的集成,ACTIVITI5可以轻松地嵌入到现有的Spring应用中,实现...

Global site tag (gtag.js) - Google Analytics