`
lynnlysh
  • 浏览: 176704 次
  • 性别: Icon_minigender_2
  • 来自: 天津
社区版块
存档分类
最新评论

转一个JBPM4 简易请假实例,加我的理解

阅读更多
原文地址:http://skyuck.iteye.com/blog/458008
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
分享到:
评论
1 楼 lynnlysh 2011-01-21  
若在运行中出现com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Cannot delete or update a...
的报错
则是因为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>

相关推荐

Global site tag (gtag.js) - Google Analytics