-----------------------------------------------------------------------------------------------------------
----------------
1 首先找到jbpm项目自带的 org.jbpm.webapp.servlet下的三个servlet: deployServlet,ProcessImageServlet, UploadServlet 和org.jbpm.webapp.servlet下的 processImageTag。
把这些东东copy到你的项目的src中 2 配置项目下的web.xml,代码如下:
----------------------------------------------------------------------------------------------------------- ----------------
<!-- jBPM -->
<servlet> <servlet-name>ProcessImageServlet</servlet-name> <servlet-class> org.jbpm.webapp.servlet.ProcessImageServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>ProcessImageServlet</servlet-name> <url-pattern>/processimage</url-pattern> </servlet-mapping> <servlet>
<servlet-name>DeployServlet</servlet-name> <servlet-class> org.jbpm.webapp.servlet.DeployServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>DeployServlet</servlet-name> <url-pattern>/deploy</url-pattern> </servlet-mapping> <servlet>
<servlet-name>UploadServlet</servlet-name> <servlet-class> org.jbpm.webapp.servlet.UploadServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/upload</url-pattern> </servlet-mapping> ----------------------------------------------------------------------------------------------------------- ----------------
3 把jbpm自带的标签定义 jbpm.tld copy到你的项目的/web-info 目录下
4 找到jbpm自带的deploy.html(把这个html放在项目的webroot根目录下,牵
涉到servlet的解析问题),这就是流程定义的部署页面。
5 流程定义文件的打包:在eclipse的process definition的设计界面下打开你设
计好的流程定义图,
利用designer的 “deployment”把三个文件(gpd.xml processdefiniton.xml. processimage.jpg)打包,
点击“save process archive locally”,选定“location”,点击“save without deplying”保存流程定义文件包
(当然你也可以利用desinger中的deployment server setting ,只要能把这三个 文件部署到你的数据库中即可)
6 利用deploy.html部署打包好的流程定义文件包 到数据库。可以查看
jbjpm_bytearray表中是否有数据,有的话则表明部署成功,
否则就是没有部署成功 7一定要把显示流程图的jsp页面(假设名字为show.jsp)放在webroot根目录
下(因为牵涉到servlet的解释问题),
在jsp页面中调用 即可显示出流程图及当前节点的位置。 8如果有nullpointexception,修改UploadServlet,代码如下:
JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
if(jbpmContext == null) { jbpmContext = JbpmConfiguration.getInstance().createJbpmContext(); } 8 运行试试吧,应该能够成功的。
----------------------------------------------------------------------------------------------------------- ----------------
UploadServlet .java改写 -----------------------------------------------------------------------------------------------------------
----------------
package org.jbpm.webapp.servlet;
import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import java.util.List; import java.util.zip.ZipInputStream; 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.apache.commons.fileupload.FileUpload; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.graph.def.ProcessDefinition; public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException { response.setContentType("text/html; charset=utf-8"); response.getWriter().println(handleRequest(request)); } public void printInput(HttpServletRequest request) throws IOException { InputStream inputStream = request.getInputStream(); StringBuffer buffer = new StringBuffer(); int read; while ((read = inputStream.read()) != -1) { buffer.append((char) read); } log.debug(buffer.toString()); } private String handleRequest(HttpServletRequest request) { if (!FileUpload.isMultipartContent(request)) { log.debug("Not a multipart request"); return "Not a multipart request"; } try { DiskFileUpload fileUpload = new DiskFileUpload(); List list = fileUpload.parseRequest(request); Iterator iterator = list.iterator(); if (!iterator.hasNext()) { log.debug("No process file in the request"); return "No process file in the request"; } FileItem fileItem = (FileItem) iterator.next(); if (fileItem.getContentType().indexOf( "application/x-zip-compressed") == -1) { log.debug("Not a process archive"); return "Not a process archive"; } return doDeployment(fileItem); } catch (FileUploadException e) { e.printStackTrace(); return "FileUploadException"; } } private String doDeployment(FileItem fileItem) { System.out.println("文件" + fileItem.getName()); try { ZipInputStream zipInputStream = new ZipInputStream(fileItem .getInputStream()); // JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext(); // 添加代码 if (jbpmContext == null) { JbpmConfiguration config = JbpmConfiguration.getInstance(); jbpmContext = config.createJbpmContext(); } // ProcessDefinition processDefinition = ProcessDefinition .parseParZipInputStream(zipInputStream); log.debug("创建Created a processdefinition : " + processDefinition.getName()); jbpmContext.deployProcessDefinition(processDefinition); zipInputStream.close(); jbpmContext.close(); return "上传 " + processDefinition.getName() + " 成功"; } catch (IOException e) { return "IOException"; } } private static Log log = LogFactory.getLog(UploadServlet.class); } ----------------------------------------------------------------------------------------------------------- ----------------
ProcessImageTag 改写 ----------------------------------------------------------------------------------------------------------- ----------------
/* * JBoss, Home of Professional Open Source * Copyright 2005, JBoss Inc., and individual contributors as indicated * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.. */ package org.jbpm.webapp.tag; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSupport; import org.dom4j.DocumentException; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.XPath; import org.dom4j.xpath.DefaultXPath; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.file.def.FileDefinition; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.Token; import org.jbpm.taskmgmt.exe.TaskInstance; public class ProcessImageTag extends TagSupport { private static final long serialVersionUID = 1L; private long taskInstanceId = -1; private long tokenInstanceId = -1; private byte[] gpdBytes = null; private byte[] imageBytes = null; private Token currentToken = null; private ProcessDefinition processDefinition = null; static String currentTokenColor = "red"; static String childTokenColor = "blue"; static String tokenNameColor = "blue"; public void release() { taskInstanceId = -1; gpdBytes = null; imageBytes = null; currentToken = null; } public int doEndTag() throws JspException { try { initialize(); retrieveByteArrays(); if (gpdBytes != null && imageBytes != null) { writeTable(); } } catch (IOException e) { e.printStackTrace(); throw new JspException("table couldn't be displayed", e); } catch (DocumentException e) { e.printStackTrace(); throw new JspException("table couldn't be displayed", e); } release(); return EVAL_PAGE; } private void retrieveByteArrays() { try { FileDefinition fileDefinition = processDefinition .getFileDefinition(); gpdBytes = fileDefinition.getBytes("gpd.xml"); imageBytes = fileDefinition.getBytes("processimage.jpg"); } catch (Exception e) { e.printStackTrace(); } } private void writeTable() throws IOException, DocumentException { int borderWidth = 4; Element rootDiagramElement = DocumentHelper.parseText( new String(gpdBytes)).getRootElement(); int[] boxConstraint; int[] imageDimension = extractImageDimension(rootDiagramElement); String imageLink = "processimage?definitionId=" + processDefinition.getId(); JspWriter jspOut = pageContext.getOut(); if (tokenInstanceId > 0) { List allTokens = new ArrayList(); walkTokens(currentToken, allTokens); jspOut .println("<div style='position:relative; background-image:url(" + imageLink + "); width: " + imageDimension[0] + "px; height: " + imageDimension[1] + "px;'>"); for (int i = 0; i < allTokens.size(); i++) { Token token = (Token) allTokens.get(i); // check how many tokens are on teh same level (= having the // same parent) int offset = i; if (i > 0) { while (offset > 0 && ((Token) allTokens.get(offset - 1)).getParent() .equals(token.getParent())) { offset--; } } boxConstraint = extractBoxConstraint(rootDiagramElement, token); // Adjust for borders // boxConstraint[2]-=borderWidth*2; // boxConstraint[3]-=borderWidth*2; jspOut.println("<div style='position:absolute; left: " + boxConstraint[0] + "px; top: " + boxConstraint[1] + "px; "); if (i == (allTokens.size() - 1)) { jspOut.println("border: " + currentTokenColor); } else { jspOut.println("border: " + childTokenColor); } jspOut.println(" " + borderWidth + "px groove; " + "width: " + boxConstraint[2] + "px; height: " + boxConstraint[3] + "px;'>"); if (token.getName() != null) { jspOut.println("<span style='color:" + tokenNameColor + ";font-style:italic;position:absolute;left:" + (boxConstraint[2] + 10) + "px;top:" + ((i - offset) * 20) + ";'> " + token.getName() + "</span>"); } jspOut.println("</div>"); } jspOut.println("</div>"); } else { boxConstraint = extractBoxConstraint(rootDiagramElement); jspOut.println("<table border=0 cellspacing=0 cellpadding=0 width=" + imageDimension[0] + " height=" + imageDimension[1] + ">"); jspOut.println(" <tr>"); jspOut.println(" <td width=" + imageDimension[0] + " height=" + imageDimension[1] + " style=\"background-image:url(" + imageLink + ")\" valign=top>"); jspOut .println(" <table border=0 cellspacing=0 cellpadding=0>"); jspOut.println(" <tr>"); jspOut.println(" <td width=" + (boxConstraint[0] - borderWidth) + " height=" + (boxConstraint[1] - borderWidth) + " style=\"background-color:transparent;\"></td>"); jspOut.println(" </tr>"); jspOut.println(" <tr>"); jspOut .println(" <td style=\"background- color:transparent;\"></td>");
jspOut .println(" <td style=\"border-color:" + currentTokenColor + "; border-width:" + borderWidth + "px; border-style:groove; background-color:transparent;\" width="
+ boxConstraint[2] + " height=" + (boxConstraint[3] + (2 * borderWidth)) + "> </td>"); jspOut.println(" </tr>"); jspOut.println(" </table>"); jspOut.println(" </td>"); jspOut.println(" </tr>"); jspOut.println("</table>"); } } private int[] extractBoxConstraint(Element root) { int[] result = new int[4]; String nodeName = currentToken.getNode().getName(); XPath xPath = new DefaultXPath("//node[@name='" + nodeName + "']"); Element node = (Element) xPath.selectSingleNode(root); result[0] = Integer.valueOf(node.attribute("x").getValue()).intValue(); result[1] = Integer.valueOf(node.attribute("y").getValue()).intValue(); result[2] = Integer.valueOf(node.attribute("width").getValue()) .intValue(); result[3] = Integer.valueOf(node.attribute("height").getValue()) .intValue(); return result; } private int[] extractBoxConstraint(Element root, Token token) { int[] result = new int[4]; String nodeName = token.getNode().getName(); XPath xPath = new DefaultXPath("//node[@name='" + nodeName + "']"); Element node = (Element) xPath.selectSingleNode(root); result[0] = Integer.valueOf(node.attribute("x").getValue()).intValue(); result[1] = Integer.valueOf(node.attribute("y").getValue()).intValue(); result[2] = Integer.valueOf(node.attribute("width").getValue()) .intValue(); result[3] = Integer.valueOf(node.attribute("height").getValue()) .intValue(); return result; } private int[] extractImageDimension(Element root) { int[] result = new int[2]; result[0] = Integer.valueOf(root.attribute("width").getValue()) .intValue(); result[1] = Integer.valueOf(root.attribute("height").getValue()) .intValue(); return result; } private void initialize() { JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext(); // 添加代码 if (jbpmContext == null) { JbpmConfiguration config = JbpmConfiguration.getInstance(); jbpmContext = config.createJbpmContext(); } // if (this.taskInstanceId > 0) { TaskInstance taskInstance = jbpmContext.getTaskMgmtSession() .loadTaskInstance(taskInstanceId); currentToken = taskInstance.getToken(); } else { if (this.tokenInstanceId > 0) currentToken = jbpmContext.getGraphSession().loadToken( this.tokenInstanceId); } processDefinition = currentToken.getProcessInstance() .getProcessDefinition(); } private void walkTokens(Token parent, List allTokens) { Map children = parent.getChildren(); if (children != null && children.size() > 0) { Collection childTokens = children.values(); for (Iterator iterator = childTokens.iterator(); iterator.hasNext();) { Token child = (Token) iterator.next(); walkTokens(child, allTokens); } } allTokens.add(parent); } public void setTask(long id) { this.taskInstanceId = id; } public void setToken(long id) { this.tokenInstanceId = id; } } ----------------------------------------------------------------------------------------------------------- ---------------
viewFlow.jsp
----------------------------------------------------------------------------------------------------------- ----------------
<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="/WEB-INF/jbpm.tld" prefix="jbpm" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName() +":"+request.getServerPort()+path+"/";
long tokenId = Long.parseLong(request.getParameter("tokenId")); %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html> <head> <base href="<%=basePath%>"> <title>My JSP 'viewFlow.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body>
<jbpm:processimageToken token="<%=tokenId%>"/> <br> </body> </html> |
|