`

JBPM4 例子

    博客分类:
  • Jbpm
阅读更多

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代码 复制代码

 

<?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="Kayzhan" 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>

 4.编写流程发布及控制的类

Java代码 复制代码

 

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

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代码 复制代码
<%@page contentType="text/html;charset=UTF-8" %>

<html>
	<head>
		<title>填写申请单</title>
	</head>
	<body>
		<form action="leave?zzg=apply" method="POST">
		  <table width="300" border=1>
			<tr>
			  <td><label>申请人</label></td>
			  <td><input type="text" value="zzg" name="applyName"></td>
			</tr>
			<tr>
			  <td><label>职位</label></td>
			  <td><input type="text" value="经理" name="position"></td>
			</tr>
			<tr>
			  <td><label>申请时间</label></td>
			  <td><input type="text" value="2009-03-09" name="applyTime"></td>
			</tr>
			<tr>
			  <td><label>请假天数</label></td>
			  <td><input type="text" value="3" name="leaveDay"></td>
			</tr>
			<tr>
			  <td><label>请假原因</label></td>
			  <td><textarea name="content" rows=3 cols=200>病假</textarea></td>
			</tr>
			<tr>
			  <td><input type="submit" value="申请"></td>
			  <td><input type="reset" value="取消"></td>
			</tr>
		  </table>
		</form>
	</body>
</html>

 7.在webapp目录下创建一个check.jsp文件,用来显示任务列表并添加三个操作

  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文件,用来显示请假内容

    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> 

 

9.修改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>  

10.把leave.jpdl.xml文件压缩成zip文件发布即可。

分享到:
评论
3 楼 Ellen_wen 2011-02-11  
cfg
2 楼 haiyangyiba 2011-01-19  
LZ要是能把可以运行的例子给以附件的形式传上来最好了。
1 楼 dlhzt 2010-07-23  
例子既然是从建立java动态web工程说起,那就应该详细点都说到。
目前这个例子按照你的顺序来,根本跑不起来,
最起码1、jbpm.cfg.xml这块怎么配置。否则报错找不到这个文件
          2 “把leave.jpdl.xml文件压缩成zip文件发布即可”这句话也太含糊了,
本来以为是个好的起步例子!

相关推荐

Global site tag (gtag.js) - Google Analytics