轉一個JBPM4 簡易請假實例,加我的理解

原文地址:[url]http://skyuck.iteye.com/blog/458008[/url]
1.新建一個動態的web項目
2.在lib目錄下加入以下jar包(由於用到fileupload的上傳,所以還要加入fileupload的依賴庫)
[list]
[*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
]
[/list]
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
發佈了20 篇原創文章 · 獲贊 2 · 訪問量 9030
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章