備注:此文檔是在2016年整理,沒(méi)在網(wǎng)上發(fā)布,一直在是本地word中記錄,現(xiàn)在遷移到線上。并且文章中是基于xml等文件配置的構(gòu)建項(xiàng)目,所以感覺(jué)很繁瑣。目前可以用springboot替代,并且activiti與springboot整合也是非常簡(jiǎn)單的。
1.maven項(xiàng)目的簡(jiǎn)單介紹
(1).首先在eclipse中創(chuàng)建一個(gè)maven項(xiàng)目,創(chuàng)建完maven項(xiàng)目之后,最重要的一條就是文件同步,文件同步需要在eclipse中添加一個(gè)文件同步插件叫filesync 。不要和build path中的source目錄搞混。(想想這樣應(yīng)該可以達(dá)到熱部署的效果)

2.開(kāi)始activiti流程設(shè)計(jì)器和rest api接口的搭建
(1).首先引入需要的jar包,此項(xiàng)目用maven管理,所以編寫pom.xml文件,pom.xml文件內(nèi)容如下
<project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
??<modelVersion>4.0.0</modelVersion>
??<groupId>com.tzxx</groupId>
??<artifactId>activiti-web-modeler</artifactId>
??<packaging>war</packaging>
??<version>0.0.1-SNAPSHOT</version>
??<name>activiti-web-modeler Maven?Webapp</name>
??<url>http://maven.apache.org</url>
??<properties>
?? <!-- main version setting -->
<spring.version>4.1.9.RELEASE</spring.version>
<druid.version>1.0.18</druid.version>
<activiti.version>5.21.0</activiti.version>
<!-- tools version setting -->
<slf4j.version>1.7.7</slf4j.version>
<jackson.version>2.2.3</jackson.version>
<!-- jdbc?driver setting -->
<mysql.driver.version>5.1.30</mysql.driver.version>
<!-- environment setting -->
<jdk.version>1.8</jdk.version>
??</properties>
??<dependencies>
? <!-- SPRING begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- PERSISTENCE begin -->
<!-- connection pool -->
<dependency>
?????<groupId>com.alibaba</groupId>
?????<artifactId>druid</artifactId>
?????<version>${druid.version}</version>
</dependency>
<!-- jdbc?driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
<scope>runtime</scope>
</dependency>
<!-- PERSISTENCE end -->
<!-- WEB begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<!-- WEB end -->
<!-- Activiti?-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
<exclusions>
??????? <exclusion>
??????? <artifactId>commons-dbcp</artifactId>
??????? <groupId>commons-dbcp</groupId>
??????? </exclusion>
??????? </exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-explorer</artifactId>
<version>${activiti.version}</version>
<exclusions>
<exclusion>
<artifactId>vaadin</artifactId>
<groupId>com.vaadin</groupId>
</exclusion>
<exclusion>
<artifactId>dcharts-widget</artifactId>
<groupId>org.vaadin.addons</groupId>
</exclusion>
<exclusion>
<artifactId>activiti-simple-workflow</artifactId>
<groupId>org.activiti</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
???????????<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
????<groupId>org.activiti</groupId>
????<artifactId>activiti-rest</artifactId>
????<version>${activiti.version}</version>
</dependency>
<dependency>
???? <groupId>org.activiti</groupId>
???? <artifactId>activiti-json-converter</artifactId>
???? <version>${activiti.version}</version>
???? <exclusions>
???? <exclusion>
???? <artifactId>commons-collections</artifactId>
???? <groupId>commons-collections</groupId>
???? </exclusion>
???? </exclusions>
????</dependency>
<!-- activiti?end -->
<!-- LOGGING begin -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- LOGGING end -->
<!-- jackson?json?-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jaxb-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
????<dependency>
??????<groupId>junit</groupId>
??????<artifactId>junit</artifactId>
??????<version>4.11</version>
??????<scope>test</scope>
????</dependency>
??</dependencies>
??<build>
????<finalName>activiti-web-modeler</finalName>
??</build>
</project>
(2).pom文件編寫好之后,開(kāi)始搭建Spring環(huán)境和springmvc的環(huán)境,因?yàn)閍ctiviti的項(xiàng)目時(shí)基于這兩框架開(kāi)發(fā)的所以在此也用這兩框架作為基礎(chǔ)來(lái)管理bean。首先創(chuàng)建Spring的配置文件beans.xml,其中的內(nèi)包括基礎(chǔ)bean的配置和數(shù)據(jù)庫(kù)連接池的配置等,我在整合的過(guò)程中將activiti的配置文件信息也直接寫到了bean.xml文件中了,其中的信息包括初始化activiti數(shù)據(jù)庫(kù)屬性配置,事務(wù)的配置等等一系列。以下圖片強(qiáng)調(diào)幾個(gè)需要注意的問(wèn)題,(在搭建過(guò)程遇到的問(wèn)題)。


具體的bean.xml的內(nèi)容如下(其中連接池用的是alibaba的)
<?xml?version="1.0"?encoding="UTF-8"?>
<beans?xmlns="http://www.springframework.org/schema/beans"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"?xmlns:jdbc="http://www.springframework.org/schema/jdbc"??
xmlns:jee="http://www.springframework.org/schema/jee"?xmlns:tx="http://www.springframework.org/schema/tx"
????xmlns:util="http://www.springframework.org/schema/util"?xmlns:task="http://www.springframework.org/schema/task"?xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"
default-lazy-init="true">
<description>Spring Configuration</description>
<context:property-placeholder?ignore-unresolvable="true"?location="classpath:activiti.properties"?/>
<bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property?name="dataSource"?ref="dataSource"?/>
</bean>
<tx:annotation-driven?transaction-manager="transactionManager"?proxy-target-class="true"/>
<bean?id="dataSource"?class="com.alibaba.druid.pool.DruidDataSource"?init-method="init"?destroy-method="close">?
????<property?name="driverClassName"?value="${jdbc.driver}"?/>
<property?name="url"?value="${jdbc.url}"?/>
<property?name="username"?value="${jdbc.username}"?/>
<property?name="password"?value="${jdbc.password}"?/>
<property?name="initialSize"?value="${jdbc.pool.init}"?/>
<property?name="minIdle"?value="${jdbc.pool.minIdle}"?/>?
<property?name="maxActive"?value="${jdbc.pool.maxActive}"?/>
<property?name="maxWait"?value="60000"?/>
<property?name="timeBetweenEvictionRunsMillis"?value="60000"?/>
<property?name="minEvictableIdleTimeMillis"?value="300000"?/>
<property?name="testWhileIdle"?value="true"?/>
<property?name="testOnBorrow"?value="false"?/>
<property?name="testOnReturn"?value="false"?/>
</bean>
<context:component-scan?base-package="org.activiti.conf,org.activiti.rest.editor,org.activiti.rest.service">
????????<context:exclude-filter?type="annotation"?expression="org.springframework.stereotype.Controller"/>
????</context:component-scan>
????<bean?id="restResponseFactory"?class="org.activiti.rest.service.api.RestResponseFactory"></bean>
<!-- json處理-->?
<bean?id="objectMapper"?class="com.fasterxml.jackson.databind.ObjectMapper"?/>
????<bean?id="uuidGenerator"?class="org.activiti.engine.impl.persistence.StrongUuidGenerator"?/>
<!-- Activiti?begin -->
<bean?id="processEngineConfiguration"?class="org.activiti.spring.SpringProcessEngineConfiguration">
<property?name="dataSource"?ref="dataSource"?/>
<property?name="transactionManager"?ref="transactionManager"?/>
<property?name="databaseSchemaUpdate"?value="true"?/>
<property?name="jobExecutorActivate"?value="true"?/>
<property?name="history"?value="full"?/>
<property?name="activityFontName"?value="${activiti.diagram.activityFontName}"/>
<property?name="labelFontName"?value="${activiti.diagram.labelFontName}"/>
<property?name="annotationFontName"?value="${activiti.diagram.annotationFontName}"/>
</bean>
<bean?id="processEngine"?class="org.activiti.spring.ProcessEngineFactoryBean">
<property?name="processEngineConfiguration"?ref="processEngineConfiguration"?/>
</bean>
<bean?id="repositoryService"?factory-bean="processEngine"?factory-method="getRepositoryService"?/>
<bean?id="runtimeService"?factory-bean="processEngine"?factory-method="getRuntimeService"?/>
<bean?id="formService"?factory-bean="processEngine"?factory-method="getFormService"?/>
<bean?id="identityService"?factory-bean="processEngine"?factory-method="getIdentityService"?/>
<bean?id="taskService"?factory-bean="processEngine"?factory-method="getTaskService"?/>
<bean?id="historyService"?factory-bean="processEngine"?factory-method="getHistoryService"?/>
<bean?id="managementService"?factory-bean="processEngine"?factory-method="getManagementService"?/>
<bean?id="contentTypeResolver"?class="org.activiti.rest.common.application.DefaultContentTypeResolver"?/>
</beans>
(3).spring mvc.xml的配置文件內(nèi)容(只是簡(jiǎn)單的內(nèi)容,其他的屬性配置根據(jù)需要配)
<?xml?version="1.0"?encoding="UTF-8"?>
<beans?xmlns="http://www.springframework.org/schema/beans"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"?xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
????<description>Spring MVC Configuration</description>
????<context:component-scan?base-package="org.activiti.rest.editor,org.activiti.rest.diagram">
????????<context:include-filter?type="annotation"?expression="org.springframework.stereotype.Controller"?/>
????</context:component-scan>
????<context:component-scan?base-package="org.tzxx.controller">
????</context:component-scan>
????<bean?id="objectMapper"?class="com.fasterxml.jackson.databind.ObjectMapper"/>
????<mvc:annotation-driven?/>
????<bean?class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property?name="prefix"?value="/WEB-INF/jsp/"?/>
<property?name="suffix"?value=".jsp"?/>
</bean>
</beans>
(4).spring-rest.xml文件的配置內(nèi)容
<?xml?version="1.0"?encoding="UTF-8"?>
<beans?xmlns="http://www.springframework.org/schema/beans"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"?xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
????<description>Spring MVC Configuration</description>
????<context:component-scan?base-package="org.activiti.rest">
????????<context:include-filter?type="annotation"?expression="org.springframework.stereotype.Controller"?/>
????</context:component-scan>
????<bean?id="objectMapper"?class="com.fasterxml.jackson.databind.ObjectMapper"/>
????<mvc:annotation-driven?/>
</beans>
注意:以上配置文件的內(nèi)容主要掃描包的配置
(5).properties文件的配置信息
#oracle database settings
#jdbc.type=oracle
#jdbc.driver=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
#jdbc.username=jeesite
#jdbc.password=123456
#mysql?database setting
jdbc.type=mysql
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/activiti_modeler?useUnicode=true&characterEncoding=utf-8
jdbc.username=root
jdbc.password=123
#pool settings
jdbc.pool.init=1
jdbc.pool.minIdle=3
jdbc.pool.maxActive=20
#============================#
#===== System settings ======#
#============================#
#\u5de5\u4f5c\u6d41\u8bbe\u7f6e
activiti.isSynActivitiIndetity=false
activiti.export.diagram.path=c:/activiti_diagram
#activiti?font (windows font: \u5b8b\u4f53 ?linux?font: simsun)
activiti.diagram.activityFontName=\u5b8b\u4f53
activiti.diagram.labelFontName=\u5b8b\u4f53
#5.21.0 \u65b0\u589e\u53c2\u6570 ,2016.06.23 \u8f66\u6811\u708e add
activiti.diagram.annotationFontName=\u5b8b\u4f53
#activiti\u5916\u90e8\u8868\u5355\u6839\u5730\u5740\u914d\u7f6e
activiti.form.server.url=
(6).上面的配置文件寫好之后,配置web.xml文件來(lái)實(shí)例化上下文信息
<!DOCTYPE?web-app?PUBLIC
?"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
?"http://java.sun.com/dtd/web-app_2_3.dtd"?>
<web-app>
??<display-name>Archetype Created Web Application</display-name>
??<context-param>
????<param-name>contextConfigLocation</param-name>
????<param-value>classpath:beans.xml</param-value>
??</context-param>
????<listener>
???????<listener-class>
??????org.springframework.web.context.ContextLoaderListener
???</listener-class>
???</listener>
???<listener>
???????<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
???</listener>
????<filter>
????????<filter-name>encodingFilter</filter-name>
????????<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
????????<init-param>
????????????<param-name>encoding</param-name>
????????????<param-value>UTF-8</param-value>
????????</init-param>
????????<init-param>
????????????<param-name>forceEncoding</param-name>
????????????<param-value>true</param-value>
????????</init-param>
????</filter>
????<filter-mapping>
????????<filter-name>encodingFilter</filter-name>
????????<url-pattern>/*</url-pattern>
????</filter-mapping>
??<!-- springmvc的servlet?-->
??<servlet>
????<servlet-name>ModelRestServlet</servlet-name>
????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
????<init-param>
????????<param-name>contextConfigLocation</param-name>
????????<param-value>classpath:spring-mvc.xml</param-value>
????</init-param>
????<load-on-startup>1</load-on-startup>
??</servlet>
??<servlet-mapping>
????<servlet-name>ModelRestServlet</servlet-name>
????<url-pattern>/service/*</url-pattern>
??</servlet-mapping>
??<servlet>
????<servlet-name>RestServlet</servlet-name>
????<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
????<init-param>
????????<param-name>contextConfigLocation</param-name>
????????<param-value>classpath:spring-rest.xml</param-value>
????</init-param>
????<load-on-startup>1</load-on-startup>
??</servlet>
??<servlet-mapping>
????<servlet-name>RestServlet</servlet-name>
????<url-pattern>/rest/*</url-pattern>
??</servlet-mapping>
</web-app>
(7).下載activiti5.21版本的源碼包(5.17之前的版本源碼中的目錄結(jié)構(gòu)和之后有點(diǎn)不一樣),解壓之后,找到modules目錄,進(jìn)去之后找activiti-webapp-explorer2在這個(gè)文件夾中找如下文件

將上面紅框中的文件拷貝到自己項(xiàng)目的webapp目錄下。
再繼續(xù)找?src/main/resources/stencilset.json將這個(gè)json文件拷貝到resources文件夾下,其定義了bpmn的相關(guān)構(gòu)成組件的信息。
(8).準(zhǔn)備基礎(chǔ)服務(wù)類
復(fù)制文件(https://github.com/henryyan/kft-activiti-demo/tree/master/src/main/java/org/activiti/explorer)里面的java文件到自己項(xiàng)目中。
(9).添加Rest安全認(rèn)證組件SecurityConfiguration類
package org.tzxx.conf;
import org.activiti.rest.security.BasicAuthenticationProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.servlet.configuration.EnableWebMvcSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
@Configuration
@EnableWebSecurity
@EnableWebMvcSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
????@Bean
????public AuthenticationProvider authenticationProvider() {
????????return new BasicAuthenticationProvider();
????}
????@Override
????protected void configure(HttpSecurity http) throws Exception {
????????http.authenticationProvider(authenticationProvider())
????????????.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
????????????.csrf().disable()
????????????.authorizeRequests()
????????????.anyRequest().authenticated()
????????????.and()
????????????.httpBasic();
????}
}
(10).寫一個(gè)簡(jiǎn)單的ModelController來(lái)實(shí)現(xiàn)頁(yè)面之間的跳轉(zhuǎn)
import java.io.ByteArrayInputStream;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
*流程模型控制器
?*
?*/
@Controller
@RequestMapping(value = "/workflow/model")
public class ModelController {
??protected Logger logger = LoggerFactory.getLogger(getClass());
??@Autowired
??RepositoryService repositoryService;
??/**
*模型列表
???*/
??@RequestMapping(value = "list")
??public ModelAndView modelList() {
????ModelAndView mav = new ModelAndView("workflow/model-list");
????List<Model> list = repositoryService.createModelQuery().list();
????mav.addObject("list", list);
????return mav;
??}
??/**
*模型列表
???*/
??@RequestMapping(value = "index")
??public String index() {
????return "createModel";
??}
??/**
*創(chuàng)建模型
???*/
??@RequestMapping(value = "create")
??public void create(@RequestParam("name") String name, @RequestParam("key") String key, @RequestParam("description") 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() + "/modeler.html?modelId=" + modelData.getId());
????} catch (Exception e) {
logger.error("創(chuàng)建模型失?。?, e);
????}
??}
??/**
*根據(jù)Model部署流程
???*/
??@RequestMapping(value = "deploy/{modelId}")
??public String deploy(@PathVariable("modelId") String modelId, RedirectAttributes redirectAttributes) {
????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();
redirectAttributes.addFlashAttribute("message", "部署成功,部署ID=" + deployment.getId());
????} catch (Exception e) {
logger.error("根據(jù)模型部署流程失敗:modelId={}", modelId, e);
????}
????return "redirect:/workflow/model/list";
??}
??/**
*導(dǎo)出model的xml文件
???*/
??@RequestMapping(value = "export/{modelId}")
??public void export(@PathVariable("modelId") 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("導(dǎo)出model的xml文件失?。簃odelId={}", modelId, e);
????}
??}
}
以上步驟基本的activiti的web流程設(shè)計(jì)器和rest接口搭建基礎(chǔ)工作就已經(jīng)完畢。下面效果圖:



3.流程設(shè)計(jì)器的漢化
1.先將zh-CN.json放入editor-app\i18n下

2.把editor-app\app.js中的’en’改成’zh-CN’

3.替換stencilset.json

4.如果你已訪問(wèn)過(guò)原先的英文項(xiàng)目,請(qǐng)清除緩存信息
參考學(xué)習(xí)博客地址:
1.https://yq.aliyun.com/articles/11821