JBPM4---簡易的請假實例

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文件) 
 
Java代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process name="leave" xmlns="http://jbpm.org/4.0/jpdl">  
  4.    <start g="201,14,48,48" name="開始">  
  5.       <transition g="-42,-10" name="請假" to="填寫請假單"/>  
  6.    </start>  
  7.    <task assignee="Kayzhan" g="178,87,92,52" name="填寫請假單">  
  8.       <transition g="-97,2" name="判斷是不是經理" to="是不是經理"/>  
  9.    </task>  
  10.    <decision expr="#{manager}" g="204,158,48,48" name="是不是經理">  
  11.       <transition g="-23,-11" name="否" to="經理審覈"/>  
  12.       <transition g="14,-11" name="是" to="老闆審批"/>  
  13.    </decision>  
  14.    <task assignee="Lingo" g="103,252,92,52" name="經理審覈">  
  15.       <transition g="150,450:10,-21" name="經理批准" to="結束"/>  
  16.       <transition g="-22,-22" name="請假天數>3" to="老闆審批"/>  
  17.       <transition g="-61,-1" name="經理不批准" to="終止"/>  
  18.       <transition g="149,114:-55,82" name="經理駁回" to="填寫請假單"/>  
  19.    </task>  
  20.    <task assignee="ForgetDavi" g="278,251,92,52" name="老闆審批">  
  21.       <transition g="326,450:-58,-24" name="老闆批准" to="結束"/>  
  22.       <transition g="7,0" name="老闆不批准" to="終止"/>  
  23.       <transition g="323,114:13,61" name="老闆駁回" to="填寫請假單"/>  
  24.    </task>  
  25.    <end g="219,429,48,48" name="結束" state="confirm"/>  
  26.    <end g="220,360,48,48" name="終止" state="dissent"/>  
  27. </process>  


4.編寫流程發佈及控制的類 
Java代碼  收藏代碼
  1. package zzg;  
  2.   
  3. import java.io.IOException;  
  4. import java.lang.reflect.Method;  
  5. import java.util.ArrayList;  
  6. import java.util.HashMap;  
  7. import java.util.Iterator;  
  8. import java.util.LinkedHashMap;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11. import java.util.Set;  
  12. import java.util.zip.ZipInputStream;  
  13.   
  14. import javax.servlet.ServletConfig;  
  15. import javax.servlet.ServletException;  
  16. import javax.servlet.http.HttpServlet;  
  17. import javax.servlet.http.HttpServletRequest;  
  18. import javax.servlet.http.HttpServletResponse;  
  19.   
  20. import org.apache.commons.fileupload.DiskFileUpload;  
  21. import org.apache.commons.fileupload.FileItem;  
  22. import org.jbpm.api.Configuration;  
  23. import org.jbpm.api.Execution;  
  24. import org.jbpm.api.ExecutionService;  
  25. import org.jbpm.api.ProcessDefinition;  
  26. import org.jbpm.api.ProcessDefinitionQuery;  
  27. import org.jbpm.api.ProcessEngine;  
  28. import org.jbpm.api.ProcessInstance;  
  29. import org.jbpm.api.RepositoryService;  
  30. import org.jbpm.api.TaskService;  
  31. import org.jbpm.api.task.Task;  
  32.   
  33. /** 
  34.  * Servlet implementation class LeaveServlet 
  35.  */  
  36. public class LeaveServlet extends HttpServlet {  
  37.     private static final long serialVersionUID = 1L;  
  38.     private ProcessEngine processEngine = null;  
  39.     private RepositoryService repositoryService = null;  
  40.     private ExecutionService executionService = null;  
  41.     private ProcessInstance processInstance = null;  
  42.     private TaskService taskService = null;  
  43.     private Task task = null;  
  44.     private Execution execution = null;  
  45.     private String url = null;  
  46.     private List list = null;  
  47.     private List<Task> taskList = null;  
  48.   
  49.     /* 初始化ProcessEngine. */  
  50.     public void init(ServletConfig config) throws ServletException {  
  51.         super.init(config);  
  52.         // 獲取流程引擎  
  53.         processEngine = new Configuration().buildProcessEngine();  
  54.         repositoryService = processEngine.getRepositoryService();  
  55.         executionService = processEngine.getExecutionService();  
  56.         taskService = processEngine.getTaskService();  
  57.     }  
  58.   
  59.     protected void doGet(HttpServletRequest request,  
  60.             HttpServletResponse response) throws ServletException, IOException {  
  61.         process(request, response);  
  62.     }  
  63.   
  64.     protected void doPost(HttpServletRequest request,  
  65.             HttpServletResponse response) throws ServletException, IOException {  
  66.         process(request, response);  
  67.     }  
  68.   
  69.     protected void process(HttpServletRequest request,  
  70.             HttpServletResponse response) throws ServletException, IOException {  
  71.         String zzg = request.getParameter("zzg");  
  72.   
  73.         if (zzg.equals("deploy")) {  
  74.             try {  
  75.                 deploy(request, response);  
  76.             } catch (Exception e) {  
  77.                 e.printStackTrace();  
  78.             }  
  79.             list = getLatestProcessDefinition(request, response);  
  80.             request.setAttribute("process", list);  
  81.             request.getRequestDispatcher("/index.jsp").forward(request,  
  82.                     response);  
  83.         } else if (zzg.equals("leave")) {  
  84.             url = leave(request, response);  
  85.             request.getRequestDispatcher(url).forward(request, response);  
  86.         } else if (zzg.equals("query")) {  
  87.             list = getProcessInstanceById(request, response);  
  88.             request.setAttribute("pi", list);  
  89.             request.getRequestDispatcher("/index.jsp").forward(request,  
  90.                     response);  
  91.         } else if (zzg.equals("apply")) {  
  92.             apply(request, response);  
  93.             list = getProcessInstanceById(request, response);  
  94.             request.setAttribute("pi", list);  
  95.             request.getRequestDispatcher("/index.jsp").forward(request,  
  96.                     response);  
  97.         } else if (zzg.equals("getTask")) {  
  98.             list = getTask(request, response);  
  99.             request.setAttribute("taskList", list);  
  100.             request.getRequestDispatcher("/check.jsp").forward(request,  
  101.                     response);  
  102.         } else if (zzg.equals("view")) {  
  103.             Map<String, Object> map = view(request, response);  
  104.             request.setAttribute("map", map);  
  105.             request.getRequestDispatcher("/view.jsp")  
  106.                     .forward(request, response);  
  107.         } else if (zzg.equals("confirm")) {  
  108.             confirm(request, response);  
  109.             list = getTask(request, response);  
  110.             request.setAttribute("taskList", list);  
  111.             request.getRequestDispatcher("/check.jsp").forward(request,  
  112.                     response);  
  113.         } else if (zzg.equals("dissent")) {  
  114.             dissent(request, response);  
  115.             list = getTask(request, response);  
  116.             request.setAttribute("taskList", list);  
  117.             request.getRequestDispatcher("/check.jsp").forward(request,  
  118.                     response);  
  119.         }  
  120.   
  121.         /* 
  122.          * try { Class clz = this.getClass(); Method method = 
  123.          * clz.getDeclaredMethod(action, HttpServletRequest.class, 
  124.          * HttpServletResponse.class); method.invoke(this, request, response); } 
  125.          * catch (Exception ex) { ex.printStackTrace(); } 
  126.          */  
  127.     }  
  128.   
  129.     protected void deploy(HttpServletRequest request,  
  130.             HttpServletResponse response) throws Exception, IOException {  
  131.         String temp = getServletContext().getRealPath("/temp");  
  132.         String upload = getServletContext().getRealPath("/upload");  
  133.         DiskFileUpload diskFileUpload = new DiskFileUpload();  
  134.         diskFileUpload.setFileSizeMax(1 * 1024 * 1024);  
  135.         diskFileUpload.setSizeThreshold(4096);  
  136.         diskFileUpload.setRepositoryPath(temp);  
  137.         List fileItems = diskFileUpload.parseRequest(request);  
  138.         Iterator iter = fileItems.iterator();  
  139.         if (iter.hasNext()) {  
  140.             FileItem item = (FileItem) iter.next();  
  141.             if (!item.isFormField()) {  
  142.                 String name = item.getName();  
  143.                 long size = item.getSize();  
  144.                 System.out.println("name: " + name + "&size:" + size);  
  145.                 if (name != null && !name.equals("") && size > 0) {  
  146.                     // Deploying a process部署流程  
  147.                     repositoryService.createDeployment()  
  148.                             .addResourcesFromZipInputStream(  
  149.                                     new ZipInputStream(item.getInputStream()))  
  150.                             .deploy();  
  151.                 }  
  152.             }  
  153.         }  
  154.     }  
  155.   
  156.     protected String leave(HttpServletRequest request,  
  157.             HttpServletResponse response) throws ServletException, IOException {  
  158.         // 根據流程定義的KEY值啓動一個新的流程實例  
  159.         processInstance = executionService.startProcessInstanceByKey("leave");  
  160.         //判斷流程定義的活動是否是“填寫請假單”的活動  
  161.         if (processInstance.isActive("填寫請假單")) {  
  162.             url = "/apply.jsp";  
  163.         }  
  164.         return url;  
  165.     }  
  166.   
  167.     protected Map<String, Object> apply(HttpServletRequest request,  
  168.             HttpServletResponse response) throws ServletException, IOException {  
  169.   
  170.         Map<String, Object> variables = new HashMap<String, Object>();  
  171.         String name = request.getParameter("applyName");  
  172.         String time = request.getParameter("applyTime");  
  173.         String leaveDay = request.getParameter("leaveDay");  
  174.         String content = request.getParameter("content");  
  175.         String position = request.getParameter("position");  
  176.   
  177.         variables.put("name", name);  
  178.         variables.put("time", time);  
  179.         variables.put("leaveDay", leaveDay);  
  180.         variables.put("content", content);  
  181.         variables.put("position", position);  
  182.         if (position.trim().equals("經理")) {  
  183.             //"manager"變量名與leave.jpdl.xml中decision裏面的變量一致,同時設置的值也要保持一致  
  184.             variables.put("manager""是");  
  185.         } else {  
  186.             variables.put("manager""否");  
  187.         }  
  188.         //獲取任務列表,因爲我們在填寫請假單的時候是分配給“zzg”的,見leave.jpdl.xml  
  189.         taskList = taskService.findPersonalTasks("zzg");  
  190.         //根據任務列表獲取任務  
  191.         task = taskList.get(0);  
  192.         //把設置好的變量放到任務服務裏面並根據任務ID結束任務  
  193.         taskService.setVariables(task.getId(), variables);  
  194.         taskService.completeTask(task.getId());  
  195.         //判斷任務活動是否到達老闆審批活動  
  196. //      execution = executionService.findExecutionById(task.getExecutionId());  
  197. //      System.out.println("isActive:  "  
  198. //              + execution.getProcessInstance().isActive("老闆審批"));  
  199.         return variables;  
  200.     }  
  201.   
  202.     /** 
  203.      * 獲取任務列表 
  204.      *  
  205.      * @param request 
  206.      * @param response 
  207.      * @return 
  208.      * @throws ServletException 
  209.      * @throws IOException 
  210.      */  
  211.     protected List<Task> getTask(HttpServletRequest request,  
  212.             HttpServletResponse response) throws ServletException, IOException {  
  213.         String name = request.getParameter("name");  
  214.         taskList = taskService.findPersonalTasks(name);  
  215.         return taskList;  
  216.     }  
  217.   
  218.     /** 
  219.      * 查看任務 
  220.      *  
  221.      * @param request 
  222.      * @param response 
  223.      * @return 
  224.      * @throws ServletException 
  225.      * @throws IOException 
  226.      */  
  227.     protected Map<String, Object> view(HttpServletRequest request,  
  228.             HttpServletResponse response) throws ServletException, IOException {  
  229.         String taskId = request.getParameter("id");  
  230.         Set<String> set = taskService.getVariableNames(taskId);  
  231.         Map<String, Object> map = taskService.getVariables(taskId, set);  
  232.   
  233.         return map;  
  234.     }  
  235.   
  236.     protected void confirm(HttpServletRequest request,  
  237.             HttpServletResponse response) throws ServletException, IOException {  
  238.         String taskId = request.getParameter("id");  
  239.         task = taskService.getTask(taskId);  
  240.         execution = executionService.findExecutionById(task.getExecutionId());  
  241.         if (execution.getProcessInstance().isActive("老闆審批")) {  
  242.             taskService.completeTask(taskId, "老闆批准");  
  243.         } else if (execution.getProcessInstance().isActive("經理審覈")) {  
  244.             String variable = (String) taskService.getVariable(taskId,  
  245.                     "leaveDay");  
  246.             if (Integer.valueOf(variable) > 3) {  
  247.                 taskService.completeTask(taskId, "請假天數>3");  
  248.             } else {  
  249.                 taskService.completeTask(taskId, "經理批准");  
  250.             }  
  251.         }  
  252.     }  
  253.   
  254.     protected void dissent(HttpServletRequest request,  
  255.             HttpServletResponse response) throws ServletException, IOException {  
  256.         String taskId = request.getParameter("id");  
  257.         task = taskService.getTask(taskId);  
  258.         execution = executionService.findExecutionById(task.getExecutionId());  
  259.         if (execution.getProcessInstance().isActive("老闆審批")) {  
  260.             taskService.completeTask(taskId, "老闆不批准");  
  261.         } else if (execution.getProcessInstance().isActive("經理審覈")) {  
  262.             taskService.completeTask(taskId, "經理不批准");  
  263.         }  
  264.     }  
  265.   
  266.     /** 
  267.      * 獲取最新版本的流程定義 
  268.      * @param request 
  269.      * @param response 
  270.      * @return 
  271.      * @throws ServletException 
  272.      * @throws IOException 
  273.      */  
  274.     protected List<ProcessDefinition> getLatestProcessDefinition(  
  275.             HttpServletRequest request, HttpServletResponse response)  
  276.             throws ServletException, IOException {  
  277.         List<ProcessDefinition> processDefinitions = repositoryService  
  278.                 .createProcessDefinitionQuery().orderAsc(  
  279.                         ProcessDefinitionQuery.PROPERTY_NAME).list();  
  280.         Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();  
  281.         for (ProcessDefinition pd : processDefinitions) {  
  282.             String key = pd.getKey();  
  283.             ProcessDefinition definition = map.get(key);  
  284.             if ((definition == null)  
  285.                     || (definition.getVersion() < pd.getVersion())) {  
  286.                 map.put(key, pd);  
  287.             }  
  288.         }  
  289.         return new ArrayList(map.values());  
  290.     }  
  291.   
  292.     /** 
  293.      * 根據流程定義ID獲取流程實例 
  294.      * @param request 
  295.      * @param response 
  296.      * @return 
  297.      * @throws ServletException 
  298.      * @throws IOException 
  299.      */  
  300.     protected List<ProcessInstance> getProcessInstanceById(  
  301.             HttpServletRequest request, HttpServletResponse response)  
  302.             throws ServletException, IOException {  
  303.         String pdId = request.getParameter("id");  
  304.         return executionService.createProcessInstanceQuery()  
  305.                 .processDefinitionId(pdId).list();  
  306.     }  
  307.   
  308. }  


5.在webapp目錄下創建一個index.jsp頁面,用來發布流程、顯示流程定義及流程實例 
Java代碼  收藏代碼
  1. <%@page contentType="text/html;charset=UTF-8" %>  
  2. <%@page import="org.jbpm.api.*" %>  
  3. <%@page import="java.util.*" %>  
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  5.   
  6. <html>  
  7.     <head>  
  8.         <title>jBPM4流程發佈</title>  
  9.     </head>  
  10.     <body>  
  11.         <form action="leave?zzg=deploy" method="POST" enctype="multipart/form-data">  
  12.             <input type="file" name="upload">  
  13.             <input type="submit" value="發佈">  
  14.         </form>  
  15.         <ul>  
  16.             <li><a href="leave?zzg=leave">請假</a></li>  
  17.             <li><a href="leave?zzg=getTask&name=Lingo" target="_blank">經理的任務列表</a></li>  
  18.             <li><a href="leave?zzg=getTask&name=ForgetDavi" target="_blank">老闆的任務列表</a></li>  
  19.         </ul>  
  20.         <table width=480 border=1>  
  21.             <tr><td colspan="5">流程定義</td></tr>  
  22.             <tr>  
  23.                 <td>ID</td>  
  24.                 <td>Key</td>  
  25.                 <td>名稱</td>  
  26.                 <td>版本</td>  
  27.                 <td>操作</td>  
  28.             </tr>  
  29.             <c:forEach var="process" items="${process}">  
  30.             <tr>  
  31.                 <td>${process.id}</td>  
  32.                 <td>${process.key}</td>  
  33.                 <td>${process.name}</td>  
  34.                 <td>${process.version}</td>  
  35.                 <td><a href="leave?zzg=query&id=${process.id }">查看</a></td>  
  36.             </tr>  
  37.             </c:forEach>  
  38.         </table>  
  39.         <br>  
  40.         <br>  
  41.         <br>  
  42.         <table width=480 border=1>  
  43.             <tr><td colspan="5">流程實例</td></tr>  
  44.             <tr>  
  45.                 <td>ID</td>  
  46.                 <td>Key</td>  
  47.                 <td>狀態</td>  
  48.             </tr>  
  49.             <c:forEach var="pi" items="${pi}">  
  50.             <tr>  
  51.                 <td>${pi.id}</td>  
  52.                 <td>${pi.key}</td>  
  53.                 <td>${pi.state}</td>  
  54.             </tr>  
  55.             </c:forEach>  
  56.         </table>  
  57.     </body>  
  58. </html>  


6.在webapp目錄創建一個apply.jsp頁面,用來填寫請假單 
Java代碼  收藏代碼
  1. <%@page contentType="text/html;charset=UTF-8" %>  
  2.   
  3. <html>  
  4.     <head>  
  5.         <title>填寫申請單</title>  
  6.     </head>  
  7.     <body>  
  8.         <form action="leave?zzg=apply" method="POST">  
  9.           <table width="300" border=1>  
  10.             <tr>  
  11.               <td><label>申請人</label></td>  
  12.               <td><input type="text" value="zzg" name="applyName"></td>  
  13.             </tr>  
  14.             <tr>  
  15.               <td><label>職位</label></td>  
  16.               <td><input type="text" value="經理" name="position"></td>  
  17.             </tr>  
  18.             <tr>  
  19.               <td><label>申請時間</label></td>  
  20.               <td><input type="text" value="2009-03-09" name="applyTime"></td>  
  21.             </tr>  
  22.             <tr>  
  23.               <td><label>請假天數</label></td>  
  24.               <td><input type="text" value="3" name="leaveDay"></td>  
  25.             </tr>  
  26.             <tr>  
  27.               <td><label>請假原因</label></td>  
  28.               <td><textarea name="content" rows=3 cols=200>病假</textarea></td>  
  29.             </tr>  
  30.             <tr>  
  31.               <td><input type="submit" value="申請"></td>  
  32.               <td><input type="reset" value="取消"></td>  
  33.             </tr>  
  34.           </table>  
  35.         </form>  
  36.     </body>  
  37. </html>  


7.在webapp目錄下創建一個check.jsp文件,用來顯示任務列表並添加三個操作 
Java代碼  收藏代碼
  1. <%@page contentType="text/html;charset=UTF-8" %>  
  2. <%@page import="org.jbpm.api.*" %>  
  3. <%@page import="java.util.*" %>  
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  5.   
  6. <html>  
  7.     <head>  
  8.         <title>請假審批</title>  
  9.     </head>  
  10.     <body>  
  11.         <table width=600 border=1>  
  12.             <tr><td colspan="8">任務列表</td></tr>  
  13.             <tr>  
  14.                 <td>ID</td>  
  15.                 <td>名稱</td>  
  16.                 <td>分配人</td>  
  17.                 <td>創建時間</td>  
  18.                 <td>持續時間</td>  
  19.                 <td>優先級</td>  
  20.                 <td>描述</td>  
  21.                 <td>操作</td>  
  22.             </tr>  
  23.             <c:forEach var="task" items="${taskList}">  
  24.             <tr>  
  25.                 <td>${task.id}</td>  
  26.                 <td>${task.name}</td>  
  27.                 <td>${task.assignee}</td>  
  28.                 <td>${task.createTime}</td>  
  29.                 <td>${task.duedate}</td>  
  30.                 <td>${task.priority}</td>  
  31.                 <td>${task.description}</td>  
  32.                 <td>  
  33.                     <a href="leave?zzg=view&id=${task.id }" target="_blank">審覈</a>  
  34.                     <a href="leave?zzg=confirm&id=${task.id }&name=${task.assignee}">批准</a>  
  35.                     <a href="leave?zzg=dissent&id=${task.id }&name=${task.assignee}">不批准</a>  
  36.                 </td>  
  37.             </tr>  
  38.             </c:forEach>  
  39.         </table>  
  40.     </body>  
  41. </html>  


8.在webapp目錄下創建一個view.jsp文件,用來顯示請假內容 
Java代碼  收藏代碼
  1. <%@page contentType="text/html;charset=UTF-8" %>  
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  3.   
  4. <html>  
  5.     <head>  
  6.         <title>審覈</title>  
  7.     </head>  
  8.     <body>  
  9.           <table width="300" border=1>  
  10.             <tr>  
  11.               <td><label>申請人</label></td>  
  12.               <td>${map.name }</td>  
  13.             </tr>  
  14.             <tr>  
  15.               <td><label>職位</label></td>  
  16.               <td>${map.position }</td>  
  17.             </tr>  
  18.             <tr>  
  19.               <td><label>申請時間</label></td>  
  20.               <td>${map.time }</td>  
  21.             </tr>  
  22.             <tr>  
  23.               <td><label>請假天數</label></td>  
  24.               <td>${map.leaveDay }</td>  
  25.             </tr>  
  26.             <tr>  
  27.               <td><label>請假內容</label></td>  
  28.               <td>${map.content }</td>  
  29.             </tr>  
  30.           </table>  
  31.     </body>  
  32. </html>  


8.修改web.xml 
Java代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <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">  
  3.     <display-name>LeaveJbpm</display-name>  
  4.     <servlet>  
  5.         <description>  
  6.         </description>  
  7.         <display-name>LeaveServlet</display-name>  
  8.         <servlet-name>LeaveServlet</servlet-name>  
  9.         <servlet-class>  
  10.         zzg.LeaveServlet</servlet-class>  
  11.     </servlet>  
  12.     <servlet-mapping>  
  13.         <servlet-name>LeaveServlet</servlet-name>  
  14.         <url-pattern>/leave</url-pattern>  
  15.     </servlet-mapping>  
  16.     <welcome-file-list>  
  17.         <welcome-file>index.jsp</welcome-file>  
  18.     </welcome-file-list>  
  19. </web-app>  


9.把leave.jpdl.xml文件壓縮成zip文件發佈即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章