热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SpringMVC与Activiti网页流程设计器整合

1.官方例子研究Activiti给出的官方例子activiti-explorer中有一个网页版的流程设计器,看起来很不错的样子。考虑到以后的工作中,可能

1.官方例子研究

Activiti给出的官方例子activiti-explorer中有一个网页版的流程设计器,看起来很不错的样子。考虑到以后的工作中,可能会涉及到用户自己设计流程,这样的话,会要用到网页版的流程设计器,因此,想办法吧这个官网的网页设计器从activiti-explorer工程中分离出来,与SpringMvc集成在一起,这样以后就可以在自己的项目中直接设计流程,然后发布运行了,不需要在EclipseActiviti插件中先将流程设计好,再导入项目中这么麻烦了,而且后期的修改和维护更加的方便。我们先可以看一下activiti-explorer的例子中流程设计器的样子。

 

从官网上下载Activiti 5.18.0的压缩包,下载地址: http://www.activiti.org/download.html 

将压缩包解压到任一目录下。我们可以看到Activiti的目录结构

  encoding="UTF-8"?>

<beans xmlns&#61;"http://www.springframework.org/schema/beans"

xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation&#61;"http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id&#61;"processEngineConfiguration" class&#61;"org.activiti.spring.SpringProcessEngineConfiguration">

<property name&#61;"dataSource" ref&#61;"dataSource" />

<property name&#61;"transactionManager" ref&#61;"transactionManager" />

<property name&#61;"databaseSchemaUpdate" value&#61;"true" />

<property name&#61;"jobExecutorActivate" value&#61;"false" />

bean>

<bean id&#61;"objectMapper" class&#61;"com.fasterxml.jackson.databind.ObjectMapper"/>

 

<bean id&#61;"processEngine" class&#61;"org.activiti.spring.ProcessEngineFactoryBean">

<property name&#61;"processEngineConfiguration" ref&#61;"processEngineConfiguration" />

bean>

 

<bean id&#61;"repositoryService" factory-bean&#61;"processEngine"

factory-method&#61;"getRepositoryService" />

<bean id&#61;"runtimeService" factory-bean&#61;"processEngine"

factory-method&#61;"getRuntimeService" />

<bean id&#61;"taskService" factory-bean&#61;"processEngine"

factory-method&#61;"getTaskService" />

<bean id&#61;"historyService" factory-bean&#61;"processEngine"

factory-method&#61;"getHistoryService" />

<bean id&#61;"managementService" factory-bean&#61;"processEngine"

factory-method&#61;"getManagementService" />

<bean id&#61;"identityService" factory-bean&#61;"processEngine"

factory-method&#61;"getIdentityService" />

 

<bean id&#61;"transactionManager"

class&#61;"org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name&#61;"dataSource" ref&#61;"dataSource" />

bean>

beans>

 


3.3 修改web.xml文件

打开demoweb.xml文件&#xff0c;修改context-param为以下内容&#xff0c;对比上面的web.xml文件可知&#xff0c;此处只是添加了classpath:spring-activiti.xml这一项。

 

<context-param>

<param-name>contextConfigLocationparam-name> <param-value>classpath:spring.xml,classpath:spring-hibernate.xml,classpath:spring-activiti.xmlparam-value>

context-param>

 

 

此时activiti已经与springMVC&#43;Spring&#43;Hibernate集成在一起了&#xff0c;我们可以使用activiti提供的各种服务如repositoryService&#xff0c;runtimeService等。此处就不贴Junit的单元测试代码了&#xff0c;这里要写的话&#xff0c;又可以写成一个文档。


4.集成Activiti的在线流程设计器


4.1 复制文件。

下载activiti-webapp-explorer2的源代码&#xff0c;将activiti-explorer工程中的diagram-viewer&#xff0c;editor-appmodeler.html文件复制到demo工程的src/main/webapp目录下&#xff0c;将activiti-explorer工程中WEB-INF/classes文件加下的stencilset.json&#xff0c;ui.properties&#xff0c;ui.properties.alfresco复制到demo工程的src/main/resources目录下。

 

 

 

复制完成之后的demo工程目录如下。

 

 


4.2 复制Controller文件。

打开activiti5.18.0的源码&#xff0c;将modules/目录中找到org\activiti\rest\diagramorg\activiti\rest\editor这两个包&#xff0c;将他们整个复制到demo工程的src/main/java目录下。复制完成后目录结构如图。

 


4.3修改spring-mvc.xml文件

修改spring-mvc.xml文件&#xff0c;在其中加入以下内容&#xff0c;使spring在扫描controller类的时候&#xff0c;也扫描这些包里面的类。

 

<context:component-scan base-package&#61;"org.activiti.rest.editor" />

<context:component-scan base-package&#61;"org.activiti.rest.diagram" />

 


4.4修改web.xml文件

打开demo工程的web.xml文件&#xff0c;向其中添加以下内容&#xff0c;让spring也管理起来带/service/的链接。

 

<servlet-mapping>

     <servlet-name>springmvcservlet-name>

     <url-pattern>/service/*url-pattern>

servlet-mapping>

 


4.5 细节修改

打开editor-app/app-cfg.js, 将其中的“activiti-explorer”修改为“demo”。当然&#xff0c;具体项目中这里可能会经常变化&#xff0c;我们可以写一个js函数来自动获取工程的名字&#xff0c;这样以后将设计器集成到其他工程的时候&#xff0c;就不需要修改这里的内容了。做完这些操作之后&#xff0c;已经将activiti的页面流程设计器集成到了demo项目中了&#xff0c;下面我们编写一些代码做个测试

 


5.测试Activiti页面流程设计器

demo工程的src\main\java\org\activiti\rest\editor目录下新建一个java文件&#xff0c;命名为ModuleController,向其中加入以下内容。

 

import java.io.IOException;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.activiti.editor.constants.ModelDataJsonConstants;

import org.activiti.engine.ManagementService;

import org.activiti.engine.RepositoryService;

import org.activiti.engine.RuntimeService;

import org.activiti.engine.TaskService;

import org.activiti.engine.repository.Model;

import org.activiti.engine.repository.ProcessDefinition;

import org.activiti.engine.runtime.ProcessInstance;

import org.activiti.engine.task.Task;

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.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.servlet.ModelAndView;

import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.databind.node.ObjectNode;

 

&#64;Controller

&#64;RequestMapping("/model")

public class ModuleController {

 

private Logger logger &#61; LoggerFactory.getLogger(ModuleController.class);

 

&#64;Autowired

private RepositoryService repositoryService;

&#64;Autowired

private RuntimeService runtimeService;

&#64;Autowired

private TaskService taskService;

&#64;Autowired

private ManagementService managementService;

 

&#64;RequestMapping(value &#61; "create")

public void create(&#64;RequestParam("name") String name&#64;RequestParam("key") String key,

&#64;RequestParam("description") String description, HttpServletRequest request, HttpServletResponse response) {

try {

ObjectMapper objectMapper &#61; new ObjectMapper();

ObjectNode editorNode &#61; objectMapper.createObjectNode();

editorNode.put("id""canvas");

editorNode.put("resourceId""canvas");

ObjectNode stencilSetNode &#61; objectMapper.createObjectNode();

stencilSetNode.put("namespace""http://b3mn.org/stencilset/bpmn2.0#");

editorNode.put("stencilset"stencilSetNode);

Model modelData &#61; repositoryService.newModel();

 

ObjectNode modelObjectNode &#61; objectMapper.createObjectNode();

modelObjectNode.put(ModelDataJsonConstants.MODEL_NAMEname);

modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);

description &#61; StringUtils.defaultString(description);

modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTIONdescription);

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() &#43; "/modeler.html?modelId&#61;" &#43; modelData.getId());

catch (Exception e) {

logger.error("创建模型失败&#xff1a;"e);

}

}

}

 

然后将工程部署到tomcat下&#xff0c;启动tomcat。访问链接 http://localhost:8080/demo/model/create?name&#61;test&key&#61;test&description&#61;testModel ,就可以看到系统自动创建了一个流程&#xff0c;浏览器自动跳转到设计器页面。我们就可以在设计器页面进行流程的设计了,你可以查看数据库&#xff0c;里面已经添加了相应的数据记录。

 


推荐阅读
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • HTML学习02 图像标签的使用和属性
    本文介绍了HTML中图像标签的使用和属性,包括定义图像、定义图像地图、使用源属性和替换文本属性。同时提供了相关实例和注意事项,帮助读者更好地理解和应用图像标签。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
author-avatar
6324upup
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有