转载

在JSP页面中显示JBPM流程图

要在JSP页面中显示JBPM流程图需要先下载jbpm-starters-kit-3.1.x工具包。在包中有.java文件,

/jbpm.3/src/java.webapp/org/jbpm/webapp/tag/ProcessImageTag.java与他的/WEB-INF/jbpm.tld,还有文件

/jbpm.3/src/java.webapp/org/jbpm/webapp/servlet/ ProcessImageServlet.java,在JBPM的例子里,这三个文件共同完成JBPM流程图的显示。

要使两个文件发生作用,必须得在web.xml里配置,配置方法:

  1. <!-- jBPM FileServlet -->   
  2. <servlet>   
  3.     <servlet-name>ProcessImageServlet</servlet-name>   
  4.     <servlet-class>org.jbpm.webapp.servlet.ProcessImageServlet</servlet-class>   
  5. </servlet>   
  6. <servlet-mapping>   
  7.     <servlet-name>ProcessImageServlet</servlet-name>   
  8.     <url-pattern>/processimage</url-pattern>   
  9. </servlet-mapping>   

在页面中使用:<jbpm:processimage task="${taskBean.taskInstanceId}"/> 就会把流程图显示在当前位置。

在实际环境中可能会出现的问题与必要的修改

问题一

如果你是用spring整合的jbpm,那么在两个类里的取JbpmContext方法会出错。

JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext(); //这个是会出问题的。

修改:

1.ProcessImageTag.java的private void initialize()方法里。

  1. WebApplicationContext wac = WebApplicationContextUtils.
    getRequiredWebApplicationContext(pageContext.getServletContext());   
  2.       JbpmTemplate jbpmTemplate = (JbpmTemplate) wac.getBean("jbpmTemplate");   
  3.       jbpmTemplate.execute(new JbpmCallback() {   
  4.           public Object doInJbpm(JbpmContext context) {   
  5.               if (taskInstanceId > 0) {   
  6.                   TaskInstance taskInstance = context.getTaskMgmtSession().loadTaskInstance(taskInstanceId);   
  7.                   currentToken = taskInstance.getToken();   
  8.               }   
  9.               else   
  10.               {   
  11.                   if (tokenInstanceId > 0)   
  12.                       currentToken = context.getGraphSession().loadToken(tokenInstanceId);   
  13.               }   
  14.               return null;   
  15.           }   
  16.       });   

  1. public
     class ProcessImageServlet extends HttpServlet {   
  2.     private static final long serialVersionUID = 1L;   
  3.     private ProcessDefinition processDefinition;   
  4.     private byte[] bytes;   
  5.  
  6.     protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) 
    throws ServletException, IOException {   
  7.         final long processDefinitionId = Long.parseLong( request.getParameter( "definitionId" ) );   
  8.  
  9.         WebApplicationContext wac = WebApplicationContextUtils.
    getRequiredWebApplicationContext(request.getSession().getServletContext());   
  10.         JbpmTemplate jbpmTemplate = (JbpmTemplate) wac.getBean("jbpmTemplate");   
  11.         jbpmTemplate.execute(new JbpmCallback() {   
  12.             public Object doInJbpm(JbpmContext context) {   
  13.                 processDefinition = context.getGraphSession().loadProcessDefinition(processDefinitionId);   
  14.                 bytes = processDefinition.getFileDefinition().getBytes("processimage.jpg");   
  15.                 return null;   
  16.             }   
  17.         });   
  18.  
  19.         OutputStream out = response.getOutputStream();   
  20.         out.write(bytes);   
  21.         out.flush();   
  22.     }   
  23. }   

问题二

如果你的流程是用中文字符,且数据库字符集为utf-8,再数据库中为正确的utf-8内容,也可能会乱码错误。 如:我的数据库里的gpd.xml

出错的类:ProcessImageTag.java

出错行:result[0] = Integer.valueOf(node.attribute("x").getValue());

如果此地为nullpoint错误,是因为上下文的Element root中的字符为乱码。

修改:

原代码:Element rootDiagramElement = DocumentHelper.parseText(new String(gpdBytes)).getRootElement();

修改后:Element rootDiagramElement = DocumentHelper.parseText(new String(gpdBytes, "utf-8")).getRootElement();

说明:有个地方要注意,<jbpm:processimage task="${taskBean.taskInstanceId}"/> 显示图片是以当前的路径为基础的。style="background-image:url(processimage?definitionId=1) ",也就是说当页面为:http://localhost/jbpm/workflow/showTaskInstance.jsp时,你所访问的流程图地址为:http://localhost/jbpm/workflow/processimage?definitionId=1,这个地址是错误的,实际地址为:http://localhost/jbpm/processimage?definitionId=1,要正确显示需修改ProcessImageTag.java

原代码:background-image:url(" + imageLink + ");

修改后:background-image:url(" + ((HttpServletRequest) pageContext.getRequest()).getContextPath() + "/" + imageLink + ");

至此成功显示JBPM流程图。

正文到此结束
Loading...