- 浏览: 179659 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
u014133453:
引用引用引用引用引用
activiti 并发任务实例流程图的显示 -
wf213:
您好,我用mxgraph画好图之后存到数据库里面了,但是怎么在 ...
mxgraph 之 让流程图文件(xml格式)以图的方式显示在面板上 -
SYSGIS:
嗯,写的不错,每篇文章的后记写的也不错,哈哈
mxgraph之保存图片 -
goodone:
我想问问,怎么把mxgraph生成xml格式的流程生成图片文件 ...
mxgraph之保存图片 -
ncxujinjun:
楼主的内容很有帮助
mxgraph之保存图片
原文地址:http://skyuck.iteye.com/blog/458008
1.新建一个动态的web项目
2.在lib目录下加入以下jar包(由于用到fileupload的上传,所以还要加入fileupload的依赖库)
3.绘制流程图(在resources目录下建立一个leave.jpdl.xml文件)
4.编写流程发布及控制的类(先建包zzg然后新建类 LeaveServlet.java)
5.在webapp目录下创建一个index.jsp页面,用来发布流程、显示流程定义及流程实例
6.在webapp目录创建一个apply.jsp页面,用来填写请假单
7.在webapp目录下创建一个check.jsp文件,用来显示任务列表并添加三个操作
8.在webapp目录下创建一个view.jsp文件,用来显示请假内容
9.修改web.xml
10.把leave.jpdl.xml文件压缩成zip文件发布即可。
代码如下:
(注:本文唯一与原文不同之处就是更改了代码中的leave.jpdl.xml的第一个assignee 原文此处有错误)
leave.jpdl.xml
LeaveServlet.java
index.jsp
apply.jsp
check.jsp
view.jsp
修改web.xml
附件中是项目以及相关的lib
1.新建一个动态的web项目
2.在lib目录下加入以下jar包(由于用到fileupload的上传,所以还要加入fileupload的依赖库)
[*JBPM4_HOME/jbpm.jar
*JBPM4_HOME/lib/*.jar
*jakarta-taglibs-standard-1.1.2_HOME/lib/jstl.jar
*jakarta-taglibs-standard-1.1.2_HOME/lib/standard.jar
*commons-fileupload-1.2.1_HOME/lib/commons-fileupload-1.2.1.jar
]
3.绘制流程图(在resources目录下建立一个leave.jpdl.xml文件)
4.编写流程发布及控制的类(先建包zzg然后新建类 LeaveServlet.java)
5.在webapp目录下创建一个index.jsp页面,用来发布流程、显示流程定义及流程实例
6.在webapp目录创建一个apply.jsp页面,用来填写请假单
7.在webapp目录下创建一个check.jsp文件,用来显示任务列表并添加三个操作
8.在webapp目录下创建一个view.jsp文件,用来显示请假内容
9.修改web.xml
10.把leave.jpdl.xml文件压缩成zip文件发布即可。
代码如下:
(注:本文唯一与原文不同之处就是更改了代码中的leave.jpdl.xml的第一个assignee 原文此处有错误)
leave.jpdl.xml
<?xml version="1.0" encoding="UTF-8"?> <process name="leave" xmlns="http://jbpm.org/4.0/jpdl"> <start g="201,14,48,48" name="开始"> <transition g="-42,-10" name="请假" to="填写请假单"/> </start> <task assignee="zzg" g="178,87,92,52" name="填写请假单"> <transition g="-97,2" name="判断是不是经理" to="是不是经理"/> </task> <decision expr="#{manager}" g="204,158,48,48" name="是不是经理"> <transition g="-23,-11" name="否" to="经理审核"/> <transition g="14,-11" name="是" to="老板审批"/> </decision> <task assignee="Lingo" g="103,252,92,52" name="经理审核"> <transition g="150,450:10,-21" name="经理批准" to="结束"/> <transition g="-22,-22" name="请假天数>3" to="老板审批"/> <transition g="-61,-1" name="经理不批准" to="终止"/> <transition g="149,114:-55,82" name="经理驳回" to="填写请假单"/> </task> <task assignee="ForgetDavi" g="278,251,92,52" name="老板审批"> <transition g="326,450:-58,-24" name="老板批准" to="结束"/> <transition g="7,0" name="老板不批准" to="终止"/> <transition g="323,114:13,61" name="老板驳回" to="填写请假单"/> </task> <end g="219,429,48,48" name="结束" state="confirm"/> <end g="220,360,48,48" name="终止" state="dissent"/> </process>
LeaveServlet.java
package zzg; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.zip.ZipInputStream; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; import org.jbpm.api.Configuration; import org.jbpm.api.Execution; import org.jbpm.api.ExecutionService; import org.jbpm.api.ProcessDefinition; import org.jbpm.api.ProcessDefinitionQuery; import org.jbpm.api.ProcessEngine; import org.jbpm.api.ProcessInstance; import org.jbpm.api.RepositoryService; import org.jbpm.api.TaskService; import org.jbpm.api.task.Task; /** * Servlet implementation class LeaveServlet */ public class LeaveServlet extends HttpServlet { private static final long serialVersionUID = 1L; private ProcessEngine processEngine = null; private RepositoryService repositoryService = null; private ExecutionService executionService = null; private ProcessInstance processInstance = null; private TaskService taskService = null; private Task task = null; private Execution execution = null; private String url = null; private List list = null; private List<Task> taskList = null; /* 初始化ProcessEngine. */ public void init(ServletConfig config) throws ServletException { super.init(config); // 获取流程引擎 processEngine = new Configuration().buildProcessEngine(); repositoryService = processEngine.getRepositoryService(); executionService = processEngine.getExecutionService(); taskService = processEngine.getTaskService(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { process(request, response); } protected void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String zzg = request.getParameter("zzg"); if (zzg.equals("deploy")) { try { deploy(request, response); } catch (Exception e) { e.printStackTrace(); } list = getLatestProcessDefinition(request, response); request.setAttribute("process", list); request.getRequestDispatcher("/index.jsp").forward(request, response); } else if (zzg.equals("leave")) { url = leave(request, response); request.getRequestDispatcher(url).forward(request, response); } else if (zzg.equals("query")) { list = getProcessInstanceById(request, response); request.setAttribute("pi", list); request.getRequestDispatcher("/index.jsp").forward(request, response); } else if (zzg.equals("apply")) { apply(request, response); list = getProcessInstanceById(request, response); request.setAttribute("pi", list); request.getRequestDispatcher("/index.jsp").forward(request, response); } else if (zzg.equals("getTask")) { list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); } else if (zzg.equals("view")) { Map<String, Object> map = view(request, response); request.setAttribute("map", map); request.getRequestDispatcher("/view.jsp") .forward(request, response); } else if (zzg.equals("confirm")) { confirm(request, response); list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); } else if (zzg.equals("dissent")) { dissent(request, response); list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); } /* * try { Class clz = this.getClass(); Method method = * clz.getDeclaredMethod(action, HttpServletRequest.class, * HttpServletResponse.class); method.invoke(this, request, response); } * catch (Exception ex) { ex.printStackTrace(); } */ } protected void deploy(HttpServletRequest request, HttpServletResponse response) throws Exception, IOException { String temp = getServletContext().getRealPath("/temp"); String upload = getServletContext().getRealPath("/upload"); DiskFileUpload diskFileUpload = new DiskFileUpload(); diskFileUpload.setFileSizeMax(1 * 1024 * 1024); diskFileUpload.setSizeThreshold(4096); diskFileUpload.setRepositoryPath(temp); List fileItems = diskFileUpload.parseRequest(request); Iterator iter = fileItems.iterator(); if (iter.hasNext()) { FileItem item = (FileItem) iter.next(); if (!item.isFormField()) { String name = item.getName(); long size = item.getSize(); System.out.println("name: " + name + "&size:" + size); if (name != null && !name.equals("") && size > 0) { // Deploying a process部署流程 repositoryService.createDeployment() .addResourcesFromZipInputStream( new ZipInputStream(item.getInputStream())) .deploy(); } } } } protected String leave(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 根据流程定义的KEY值启动一个新的流程实例 processInstance = executionService.startProcessInstanceByKey("leave"); //判断流程定义的活动是否是“填写请假单”的活动 if (processInstance.isActive("填写请假单")) { url = "/apply.jsp"; } return url; } protected Map<String, Object> apply(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map<String, Object> variables = new HashMap<String, Object>(); String name = request.getParameter("applyName"); String time = request.getParameter("applyTime"); String leaveDay = request.getParameter("leaveDay"); String content = request.getParameter("content"); String position = request.getParameter("position"); variables.put("name", name); variables.put("time", time); variables.put("leaveDay", leaveDay); variables.put("content", content); variables.put("position", position); if (position.trim().equals("经理")) { //"manager"变量名与leave.jpdl.xml中decision里面的变量一致,同时设置的值也要保持一致 variables.put("manager", "是"); } else { variables.put("manager", "否"); } //获取任务列表,因为我们在填写请假单的时候是分配给“zzg”的,见leave.jpdl.xml taskList = taskService.findPersonalTasks("zzg"); //根据任务列表获取任务 task = taskList.get(0); //把设置好的变量放到任务服务里面并根据任务ID结束任务 taskService.setVariables(task.getId(), variables); taskService.completeTask(task.getId()); //判断任务活动是否到达老板审批活动 // execution = executionService.findExecutionById(task.getExecutionId()); // System.out.println("isActive: " // + execution.getProcessInstance().isActive("老板审批")); return variables; } /** * 获取任务列表 * * @param request * @param response * @return * @throws ServletException * @throws IOException */ protected List<Task> getTask(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = request.getParameter("name"); taskList = taskService.findPersonalTasks(name); return taskList; } /** * 查看任务 * * @param request * @param response * @return * @throws ServletException * @throws IOException */ protected Map<String, Object> view(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String taskId = request.getParameter("id"); Set<String> set = taskService.getVariableNames(taskId); Map<String, Object> map = taskService.getVariables(taskId, set); return map; } protected void confirm(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String taskId = request.getParameter("id"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if (execution.getProcessInstance().isActive("老板审批")) { taskService.completeTask(taskId, "老板批准"); } else if (execution.getProcessInstance().isActive("经理审核")) { String variable = (String) taskService.getVariable(taskId, "leaveDay"); if (Integer.valueOf(variable) > 3) { taskService.completeTask(taskId, "请假天数>3"); } else { taskService.completeTask(taskId, "经理批准"); } } } protected void dissent(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String taskId = request.getParameter("id"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if (execution.getProcessInstance().isActive("老板审批")) { taskService.completeTask(taskId, "老板不批准"); } else if (execution.getProcessInstance().isActive("经理审核")) { taskService.completeTask(taskId, "经理不批准"); } } /** * 获取最新版本的流程定义 * @param request * @param response * @return * @throws ServletException * @throws IOException */ protected List<ProcessDefinition> getLatestProcessDefinition( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List<ProcessDefinition> processDefinitions = repositoryService .createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list(); Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>(); for (ProcessDefinition pd : processDefinitions) { String key = pd.getKey(); ProcessDefinition definition = map.get(key); if ((definition == null) || (definition.getVersion() < pd.getVersion())) { map.put(key, pd); } } return new ArrayList(map.values()); } /** * 根据流程定义ID获取流程实例 * @param request * @param response * @return * @throws ServletException * @throws IOException */ protected List<ProcessInstance> getProcessInstanceById( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String pdId = request.getParameter("id"); return executionService.createProcessInstanceQuery() .processDefinitionId(pdId).list(); } }
index.jsp
<%@page contentType="text/html;charset=UTF-8" %> <%@page import="org.jbpm.api.*" %> <%@page import="java.util.*" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>jBPM4流程发布</title> </head> <body> <form action="leave?zzg=deploy" method="POST" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit" value="发布"> </form> <ul> <li><a href="leave?zzg=leave">请假</a></li> <li><a href="leave?zzg=getTask&name=Lingo" target="_blank">经理的任务列表</a></li> <li><a href="leave?zzg=getTask&name=ForgetDavi" target="_blank">老板的任务列表</a></li> </ul> <table width=480 border=1> <tr><td colspan="5">流程定义</td></tr> <tr> <td>ID</td> <td>Key</td> <td>名称</td> <td>版本</td> <td>操作</td> </tr> <c:forEach var="process" items="${process}"> <tr> <td>${process.id}</td> <td>${process.key}</td> <td>${process.name}</td> <td>${process.version}</td> <td><a href="leave?zzg=query&id=${process.id }">查看</a></td> </tr> </c:forEach> </table> <br> <br> <br> <table width=480 border=1> <tr><td colspan="5">流程实例</td></tr> <tr> <td>ID</td> <td>Key</td> <td>状态</td> </tr> <c:forEach var="pi" items="${pi}"> <tr> <td>${pi.id}</td> <td>${pi.key}</td> <td>${pi.state}</td> </tr> </c:forEach> </table> </body> </html>
apply.jsp
<%@page contentType="text/html;charset=UTF-8" %> <%@page import="org.jbpm.api.*" %> <%@page import="java.util.*" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>jBPM4流程发布</title> </head> <body> <form action="leave?zzg=deploy" method="POST" enctype="multipart/form-data"> <input type="file" name="upload"> <input type="submit" value="发布"> </form> <ul> <li><a href="leave?zzg=leave">请假</a></li> <li><a href="leave?zzg=getTask&name=Lingo" target="_blank">经理的任务列表</a></li> <li><a href="leave?zzg=getTask&name=ForgetDavi" target="_blank">老板的任务列表</a></li> </ul> <table width=480 border=1> <tr><td colspan="5">流程定义</td></tr> <tr> <td>ID</td> <td>Key</td> <td>名称</td> <td>版本</td> <td>操作</td> </tr> <c:forEach var="process" items="${process}"> <tr> <td>${process.id}</td> <td>${process.key}</td> <td>${process.name}</td> <td>${process.version}</td> <td><a href="leave?zzg=query&id=${process.id }">查看</a></td> </tr> </c:forEach> </table> <br> <br> <br> <table width=480 border=1> <tr><td colspan="5">流程实例</td></tr> <tr> <td>ID</td> <td>Key</td> <td>状态</td> </tr> <c:forEach var="pi" items="${pi}"> <tr> <td>${pi.id}</td> <td>${pi.key}</td> <td>${pi.state}</td> </tr> </c:forEach> </table> </body> </html>
check.jsp
<%@page contentType="text/html;charset=UTF-8" %> <%@page import="org.jbpm.api.*" %> <%@page import="java.util.*" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>请假审批</title> </head> <body> <table width=600 border=1> <tr><td colspan="8">任务列表</td></tr> <tr> <td>ID</td> <td>名称</td> <td>分配人</td> <td>创建时间</td> <td>持续时间</td> <td>优先级</td> <td>描述</td> <td>操作</td> </tr> <c:forEach var="task" items="${taskList}"> <tr> <td>${task.id}</td> <td>${task.name}</td> <td>${task.assignee}</td> <td>${task.createTime}</td> <td>${task.duedate}</td> <td>${task.priority}</td> <td>${task.description}</td> <td> <a href="leave?zzg=view&id=${task.id }" target="_blank">审核</a> <a href="leave?zzg=confirm&id=${task.id }&name=${task.assignee}">批准</a> <a href="leave?zzg=dissent&id=${task.id }&name=${task.assignee}">不批准</a> </td> </tr> </c:forEach> </table> </body> </html>
view.jsp
<%@page contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <title>审核</title> </head> <body> <table width="300" border=1> <tr> <td><label>申请人</label></td> <td>${map.name }</td> </tr> <tr> <td><label>职位</label></td> <td>${map.position }</td> </tr> <tr> <td><label>申请时间</label></td> <td>${map.time }</td> </tr> <tr> <td><label>请假天数</label></td> <td>${map.leaveDay }</td> </tr> <tr> <td><label>请假内容</label></td> <td>${map.content }</td> </tr> </table> </body> </html>
修改web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>LeaveJbpm</display-name> <servlet> <description> </description> <display-name>LeaveServlet</display-name> <servlet-name>LeaveServlet</servlet-name> <servlet-class> zzg.LeaveServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LeaveServlet</servlet-name> <url-pattern>/leave</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
附件中是项目以及相关的lib
- testjbpm.rar (1.6 MB)
- 下载次数: 41
评论
1 楼
lynnlysh
2011-01-21
若在运行中出现com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a...
的报错
则是因为jbpm.hibernate.cfg.xml中的数据库方言不对,按以下代码改
的报错
则是因为jbpm.hibernate.cfg.xml中的数据库方言不对,按以下代码改
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpmdb</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.hbm2ddl.auto">create-drop</property> <property name="hibernate.format_sql">true</property> <mapping resource="jbpm.repository.hbm.xml" /> <mapping resource="jbpm.execution.hbm.xml" /> <mapping resource="jbpm.history.hbm.xml" /> <mapping resource="jbpm.task.hbm.xml" /> <mapping resource="jbpm.identity.hbm.xml" /> </session-factory> </hibernate-configuration>
相关推荐
【jbpm4请假实例代码】是一个基于jbpm4工作流引擎的示例应用,它用于演示如何在实际项目中实现员工请假流程的自动化管理。jbpm4是一个开源的工作流管理系统,它提供了强大的业务流程建模、执行和管理功能,使得...
【jbpm 请假示例 简易 修改版】是一个基于jbpm工作流引擎的简单应用实例,旨在演示如何在企业级环境中实现一个请假流程。jbpm是一个开源的工作流管理系统,它提供了完整的业务流程自动化解决方案,包括流程设计、...
【JBPM4:一个初级了解的请假流程实例】 JBPM(Java Business Process Management)是一款开源的工作流管理系统,它提供了一套完整的解决方案,用于设计、执行和管理业务流程。JBPM4是JBPM的一个版本,专注于简化...
在这个实例中,我们关注的是一个基于Jbpm实现的员工请假流程。这个流程涵盖了从申请到审批的整个过程,展示了Jbpm在实际业务场景中的应用。 首先,`.classpath`和`.project`是Eclipse IDE的配置文件,它们定义了...
【jbpm4的员工请假例子原码】是一个基于jbpm4流程引擎的示例项目,展示了如何在企业中实现一个简单的员工请假流程。这个Web项目是完全开源的,可以通过Eclipse这样的集成开发环境来打开和运行,对于学习和理解jbpm4...
在这个"JBPM5请假实例,完整版"中,我们将深入探讨如何利用JBPM5来实现一个具体的请假流程,以及在这个过程中可能遇到的关键配置问题。 首先,我们要理解JBPM5的核心功能。JBPM5提供了一个强大的流程建模工具,它...
【jbpm4web请假例子】是一个基于JBPM4工作流引擎的示例应用,它演示了如何在Eclipse环境中开发和部署一个简单的请假流程。这个例子可以帮助开发者理解工作流管理系统的基本概念,以及如何将它们集成到实际的Web应用...
综上,"jbpm4.4简单请假流程"项目展示了如何利用jbpm4.4的特性设计和实现一个典型的业务流程,涵盖了流程定义、任务处理、决策逻辑以及系统集成等方面,为企业级流程管理提供了实用范例。通过对这个项目的理解和实践...
这个“jbpm4 完整的请假流程”是一个示例项目,旨在帮助初学者理解和实践jbpm4在处理业务流程,尤其是请假申请流程中的应用。在这个项目中,可能包含了流程定义、流程实例的创建与管理、任务分配与审批等一系列功能...
总结起来,"jbpm4.3 请假流程实例示例"是学习和理解jbpm4.3的一个很好的起点。通过分析"holiday.jpdl.xml"和"holiday.png",我们可以深入了解BPM的概念,掌握如何设计和实施业务流程,以及如何利用jbpm4.3提供的工具...
【jbpm中文文档和一个请假实例】 jbpm(Java Business Process Management)是一个开源的工作流管理系统,主要用于业务流程的建模、执行和管理。它提供了一种灵活的方式来定义和执行复杂的业务流程,支持工作流和...
这是一个jbpm员工请假实例PDF文档,里面写得很详细,有图有代码,有文字描述,非常不错!
JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上 JBPM的工程文件,大家可以到...
在这个“员工请假流程的实例”中,我们看到了如何使用Jbpm来实现一个实际的业务场景。这个流程涉及了员工请假的审批过程,涵盖了不同级别的审批权限和撤销申请的规则。 1. **流程概述** - 该流程设计了一个简单的...
本DEMO是一个基于JBPM(Java Business Process Management)的工作流管理系统,用于模拟员工请假审批的流程。它包含了完整的配置、源代码和测试用例,适用于JBPM 3.1版本。该DEMO的创建者为吴大愚,其目的是为了帮助...
JBPM4 是一个开源的工作流管理系统,用于处理业务流程自动化。它是Java平台上的一个轻量级、灵活的业务流程管理(BPM)框架,为组织提供了一种有效管理和控制业务流程的方法。对于初学者而言,深入理解JBPM4实例是...
jbpm与SSH(Spring、Struts、Hibernate)框架的结合,提供了强大的后端支持,实现了一个请假流程的应用实例。 SSH框架是Web开发中的经典组合,Spring提供依赖注入和事务管理,Struts负责MVC模式的实现,Hibernate则...
综上所述,"我写的一个jbpm实例"是一个全面展示jbpm功能和SSH框架集成的应用案例,涵盖了流程设计、部署、执行、监控等多个方面。通过学习这个实例,读者可以加深对jbpm的理解,为实际项目开发提供参考。