在JSP页面中显示JBPM流程图

开发 后端
本文向您介绍在JSP页面中显示JBPM流程图,作者通过对Web.xml的配置和一些代码实现了这个功能。

要在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流程图。

 

【编辑推荐】

  1. jBPM 4.0配置浅析
  2. jBPM4的架构
  3. 浅谈jBPM下MySQL的配置
  4. 简单介绍jBPM与SSH的完整实例
  5. 使用JBPM工作流引擎测试的一个例子
责任编辑:佚名 来源: JavaEye
相关推荐

2009-03-05 10:10:52

饼图数据库JSP

2009-07-02 09:25:41

JSP实现页面跳转

2020-07-28 21:38:24

跨职能流程图

2009-06-29 17:09:49

JavaBeanJSP

2009-06-04 15:51:46

Struts流程图

2023-08-23 19:21:38

流程图时序图UML

2020-07-28 21:42:23

程序流程图

2009-07-07 18:20:54

JSP页面显示乱码

2010-03-24 16:08:55

红旗Linux桌面版

2009-07-02 14:24:02

JSP读取数据库

2020-07-28 21:44:23

工艺流程图

2009-11-09 13:23:35

WCF协定

2012-01-05 11:08:37

CISCO路由器启动流程

2010-03-24 15:36:18

2009-06-30 15:22:55

JSP页面

2019-08-16 11:16:25

Java程序员流程图

2012-06-07 09:48:12

开发流程图

2020-07-28 21:39:54

生产流程图

2011-12-13 20:12:22

iOS
点赞
收藏

51CTO技术栈公众号