1编写测试的主体页面index_demo.jsp。
index_demo.jsp代码如下:
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/commons/taglibs.jsp"%>
<head>
<title>My JSP 'index_demo.jsp' starting page</title>
</head>
<body>
<a href="${ctx}/workflow/deployjbpm.jsp">流程部署</a><br>
<a href="${ctx}/jbpmdemo.do?method=createDoc">创建公文</a><br>
<a href="${ctx}/jbpmdemo.do?method=bingDoc">将公文与流程绑定(即需要创建流程实例)</a><br>
<a href="${ctx}/jbpmdemo.do?method=submitDoc">公文创建者提交公文</a><br>
<a href="${ctx}/jbpmdemo.do?method=getNode">当前所处的节点</a><br>
<a href="${ctx}/jbpmdemo.do?method=getTask">某用户的是否有公文等待其审批</a><br>
<a href="${ctx}/jbpmdemo.do?method=goNext">查找到当前的任务对应的公文之后,即可对其审批,并继续流转</a><br>
<a href="${ctx}/jbpmdemo.do?method=isFinish">到达终点</a><br>
<a href="${ctx}/workflow.do?method=viewImage&id=246" target="_blank">查看</a><br>
</body>
</html>
2 对应的action文件
/*******************************************************************************
* 文件名:JbpmDemo.java<br>
* 版本: <br>
* 描述: <br>
* 版权所有: <br>
* <br>
* 创建者: 沙振中 <br>
* 创建日期: Jan 9, 2009 <br>
* 修改者: <br>
* 修改日期: <br>
* 修改说明: <br>
******************************************************************************/
package com.shane.security.web;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.shane.commons.core.web.StrutsAction;
import com.shane.security.service.WorkflowDemoManager;
public class JbpmDemoAction extends StrutsAction {
private static Log log = LogFactory.getLog(JbpmDemoAction.class);
private WorkflowDemoManager workflowDemoManager;
public void setWorkflowDemoManager(WorkflowDemoManager workflowDemoManager) {
this.workflowDemoManager = workflowDemoManager;
}
public ActionForward createDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.createDoc();
return mapping.findForward("succeed");
}
public ActionForward bingDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.bingDoc();
return mapping.findForward("succeed");
}
public ActionForward submitDoc(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.submitDoc();
return mapping.findForward("succeed");
}
public ActionForward getNode(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.getNode();
return mapping.findForward("succeed");
}
public ActionForward getTask(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.getTask();
return mapping.findForward("succeed");
}
public ActionForward goNext(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.goNext();
return mapping.findForward("succeed");
}
public ActionForward isFinish(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws Exception {
workflowDemoManager.isFinish();
return mapping.findForward("succeed");
}
}
3本示例与公文表绑定,在现实的业务当中,流程的流转同样需绑定业务公文表单。此例为简单公文示例。
3.1公文表
public class Document {
private int id;
private String title;
private String content;
private String creator;
private Long processIntanceId;
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Long getProcessIntanceId() {
return processIntanceId;
}
public void setProcessIntanceId(Long processIntanceId) {
this.processIntanceId = processIntanceId;
}
}
3.2相关hibernate配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class table="T_Document" name="com.shane.security.model.Document">
<id name="id">
<generator class="increment"/>
</id>
<property name="title"/>
<property name="content"/>
<property name="creator"/>
<property name="processIntanceId"/>
</class>
</hibernate-mapping>
4 service类实现
4.1接口定义
public interface WorkflowDemoManager {
public void createDoc();
public void bingDoc();
public void submitDoc();
public void getNode();
public void getTask();
public void goNext();
public void isFinish();
}
4.2 类实现
import java.util.Iterator;
import java.util.List;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import com.shane.commons.core.dao.HibernateEntityDao;
import com.shane.security.model.Document;
public class WorkflowDemoManagerImpl extends HibernateEntityDao implements
WorkflowDemoManager {
private JbpmConfiguration jbpmConfiguration;
public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {
this.jbpmConfiguration = jbpmConfiguration;
}
private JbpmContext getJbpmContext() {
JbpmContext context = jbpmConfiguration.getInstance()
.createJbpmContext();
context.setSession(this.getSession());
return context;
}
public void bingDoc() {
// 从数据库中加载ProcessDefinition对象
ProcessDefinition definition = getJbpmContext().getGraphSession()
.findLatestProcessDefinition("文档测试流程");
// 从流程中创建一个流程实例
ProcessInstance processInstance = new ProcessInstance(definition);
// 存储流程实例
getJbpmContext().save(processInstance);
// 加载公文
Document doc = (Document) getJbpmContext().getSession().load(
Document.class, 3);
// 绑定流程实例到公文
doc.setProcessIntanceId(processInstance.getId());
// 绑定公文到流程实例(ContextInstance相当于一个变量的容器)
processInstance.getContextInstance().createVariable("document",
doc.getId());
getJbpmContext().close();
log.info("____________________绑定公文和流程!");
}
public void createDoc() {
Document doc = new Document();
doc.setTitle("标题");
doc.setContent("内容");
doc.setCreator("创建人");
save(doc);
log.info("____________________创建公文!");
}
}
注首先要先执行createDoc创建公文方法,之后bingDoc将公文与流程绑定(即需要创建流程实例)方法。