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="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代码packagezzg; importjava.io.IOException; ng.reflect.Method; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.Iterator; importjava.util.LinkedHashMap; importjava.util.List; importjava.util.Map; importjava.util.Set; importjava.util.zip.ZipInputStream;importjavax.servlet.ServletConfig; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse;mons.fileupload.DiskFileUpload; mons.fileupload.FileItem; importorg.jbpm.api.Configuration; importorg.jbpm.api.Execution; importorg.jbpm.api.ExecutionService; importorg.jbpm.api.ProcessDefinition; importorg.jbpm.api.ProcessDefinitionQuery; importorg.jbpm.api.ProcessEngine; importorg.jbpm.api.ProcessInstance; importorg.jbpm.api.RepositoryService; importorg.jbpm.api.TaskService; importorg.jbpm.api.task.Task; /*** Servlet implementation class LeaveServlet*/publicclassLeaveServletextendsHttpServlet { privatestaticfinallongserialVersionUID = 1L; privateProcessEngine processEngine =null; privateRepositoryService repositoryService =null; privateExecutionService executionService =null; privateProcessInstance processInstance =null; privateTaskService taskService =null; privateTask task =null; privateExecution execution =null; privateString url =null; privateList list =null; privateList<Task> taskList =null; /* 初始化ProcessEngine. */publicvoidinit(ServletConfig config)throwsServletException { super.init(config); // 获取流程引擎processEngine =newConfiguration().buildProcessEngine(); repositoryService = processEngine.getRepositoryService(); executionService = processEngine.getExecutionService(); taskService = processEngine.getTaskService(); } protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { process(request, response); } protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { process(request, response); } protectedvoidprocess(HttpServletRequest request, HttpServletResponse response)throwsServletException, 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); }elseif(zzg.equals("leave")) { url = leave(request, response); request.getRequestDispatcher(url).forward(request, response); }elseif(zzg.equals("query")) { list = getProcessInstanceById(request, response); request.setAttribute("pi", list); request.getRequestDispatcher("/index.jsp").forward(request, response); }elseif(zzg.equals("apply")) { apply(request, response); list = getProcessInstanceById(request, response); request.setAttribute("pi", list); request.getRequestDispatcher("/index.jsp").forward(request, response); }elseif(zzg.equals("getTask")) { list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); }elseif(zzg.equals("view")) { Map<String, Object> map = view(request, response); request.setAttribute("map", map); request.getRequestDispatcher("/view.jsp") .forward(request, response); }elseif(zzg.equals("confirm")) { confirm(request, response); list = getTask(request, response); request.setAttribute("taskList", list); request.getRequestDispatcher("/check.jsp").forward(request, response); }elseif(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(); } */} protectedvoiddeploy(HttpServletRequest request, HttpServletResponse response)throwsException, IOException { String temp = getServletContext().getRealPath("/temp"); String upload = getServletContext().getRealPath("/upload"); DiskFileUpload diskFileUpload =newDiskFileUpload(); 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(); longsize = item.getSize(); System.out.println("name: "+ name +"&size:"+ size); if(name !=null&& !name.equals("") && size >0) { // Deploying a process部署流程repositoryService.createDeployment() .addResourcesFromZipInputStream( newZipInputStream(item.getInputStream())) .deploy(); } } } } protectedString leave(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { // 根据流程定义的KEY值启动一个新的流程实例processInstance = executionService.startProcessInstanceByKey("leave"); //判断流程定义的活动是否是“填写请假单”的活动if(processInstance.isActive("填写请假单")) { url ="/apply.jsp"; } returnurl; } protectedMap<String, Object> apply(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { Map<String, Object> variables =newHashMap<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.xmltaskList = taskService.findPersonalTasks("zzg"); //根据任务列表获取任务task = taskList.get(0); //把设置好的变量放到任务服务里面并根据任务ID结束任务taskService.setVariables(task.getId(), variables); pleteTask(task.getId()); //判断任务活动是否到达老板审批活动//execution = executionService.findExecutionById(task.getExecutionId());//System.out.println("isActive:"//+ execution.getProcessInstance().isActive("老板审批"));returnvariables; } /** * 获取任务列表 * * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedList<Task> getTask(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String name = request.getParameter("name"); taskList = taskService.findPersonalTasks(name); returntaskList; } /** * 查看任务 * * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedMap<String, Object> view(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String taskId = request.getParameter("id"); Set<String> set = taskService.getVariableNames(taskId); Map<String, Object> map = taskService.getVariables(taskId, set); returnmap; } protectedvoidconfirm(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String taskId = request.getParameter("id"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if(execution.getProcessInstance().isActive("老板审批")) { pleteTask(taskId,"老板批准"); }elseif(execution.getProcessInstance().isActive("经理审核")) { String variable = (String) taskService.getVariable(taskId, "leaveDay"); if(Integer.valueOf(variable) >3) { pleteTask(taskId,"请假天数>3"); }else{ pleteTask(taskId,"经理批准"); } } } protectedvoiddissent(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException { String taskId = request.getParameter("id"); task = taskService.getTask(taskId); execution = executionService.findExecutionById(task.getExecutionId()); if(execution.getProcessInstance().isActive("老板审批")) { pleteTask(taskId,"老板不批准"); }elseif(execution.getProcessInstance().isActive("经理审核")) { pleteTask(taskId,"经理不批准"); } } /** * 获取最新版本的流程定义 * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedList<ProcessDefinition> getLatestProcessDefinition( HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { List<ProcessDefinition> processDefinitions = repositoryService .createProcessDefinitionQuery().orderAsc( ProcessDefinitionQuery.PROPERTY_NAME).list(); Map<String, ProcessDefinition> map =newLinkedHashMap<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); } } returnnewArrayList(map.values()); } /** * 根据流程定义ID获取流程实例 * @param request * @param response * @return * @throws ServletException * @throws IOException */protectedList<ProcessInstance> getProcessInstanceById( HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { String pdId = request.getParameter("id"); returnexecutionService.createProcessInstanceQuery() .processDefinitionId(pdId).list(); } }
5.在webapp目录下创建一个index.jsp页面,用来发布流程、显示流程定义及流程实例 Java代码
<contentType="text/html;charset=UTF-8" %> <import="org.jbpm.api.*" %> <import="java.util.*" %> <%@ taglib prefix="c" uri="><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> 6.在webapp目录创建一个apply.jsp页面,用来填写请假单 Java代码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文件,用来显示任务列表并添加三个操作 Java代码<contentType="text/html;charset=UTF-8" %> <import="org.jbpm.api.*" %> <import="java.util.*" %> <%@ taglib prefix="c" uri="><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> 8.在webapp目录下创建一个view.jsp文件,用来显示请假内容 Java代码
<contentType="text/html;charset=UTF-8" %> <%@ taglib prefix="c" uri="><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> 8.修改web.xml Java代码<?xml version="1.0"encoding="UTF-8"?> <web-app id="WebApp_ID"version="2.4"xmlns="xml/ns/j2ee"xmlns:xsi="2001/XMLSchema-instance"xsi:schemaLocation="xml/ns/j2ee 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>
9.把leave.jpdl.xml文件压缩成zip文件发布即可。
(责任编辑:admin) |