这个模块分了三个小模块逐步实现模块功能,分别是流程与表单管理/执行流程/查询
复习一下JBPM,工作流动包括:部署,启动,查询,执行(开始,结束),Signal
1.流程定义
ProcessDefinition pd = ProcessDefinition.parseXmlResource("helloworld/processdefinition.xml");
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance("/jbpm.cfg.xml");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); // 创建Session,开始事务
try {
jbpmContext.deployProcessDefinition(pd);
} catch (RuntimeException e) {
jbpmContext.setRollbackOnly();
throw e;
} finally {
jbpmContext.close(); // 提交/回滚 事务,关闭Session
}
2.对于这个模块的要求
1)方便的 定义/修改 与 管理 流程
2)方便的 定义/修改 与 管理 表单模板
3)执行审批流转(让表单(数据)按指定的流程进行流转,并且记录)
4)方便的查询所有的 表单实例 记录(查询流转过的表单)
3.分页
先设计一个对象,其中包括这些属性.
//是直接传给对象的
private int currentPage; // 当前页
private int pageSize; // 页面大小(每页显示的数量)
// 查询数据库得来的
private int recordCount; // 总记录数
private List recordList; // 本页的数据列表
// 通过自己计算就能得来
private int totalPage; // 总页码
private int startPageIndex; // 页码列表的开始索引
private int endPageIndex; // 页码列表的结束索引
4.总页数的计算.
分页在实现类中的数据准备过程要注意的事项
总数量对数据库的查询,用到了number
1)FROM 后跟的是 entity-name
2)entity-name是<class>的属性。默认为类的全限定名
3)在<hibernate-mapping>有auto-import属性,配置在HQL中是否可以使用简单名称。
默认为true。什么时候用false?
在有多个类是同一个简单名称时,只能有一个为true。
其中需要查询数据库的操作实现
int count = ((Number) getSession().createQuery(//
"SELECT COUNT(pd) FROM org.jbpm.graph.def.ProcessDefinition pd")//
.uniqueResult())//
.intValue();
int firstResult = PageView.calcFirstResult(pageNum, pageSize);
List list = getSession().createQuery(//
"FROM org.jbpm.graph.def.ProcessDefinition pd")//
.setFirstResult(firstResult)//
.setMaxResults(pageSize)//
.list();
在Action类中,直接向页面返回这个对象就行了.
5.审批流程管理
在实现一个功能之前,要先分析需求,再分析出需要的实体,最后才能编码实现.
不要一上来就急着编码,这样很难成功实现.
流程定义在JBPM中是 ProcessDefinition
JBPM所有的实体都要用它自己的API来操作.我们不能用自己的Session来操作JBPM.
部署新的审批流程:
这里我们用struts的直接上传流程的.zip文件.
6.struts的文件上传
1)HTML
<html:form action="/pd" οnsubmit="return checkForm(this)" enctype="multipart/form-data">
<html:file property="parResource"/>
在HTML中,别忘了声明enctype="multipart/form-data"
2)ActionForm
ProcessDefinitionActionForm actionForm = (ProcessDefinitionActionForm) form;
try {
ZipInputStream zipInputStream = new ZipInputStream(actionForm.getParResource().getInputStream());
ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zipInputStream);
processDefinitionService.deploy(pd);
} catch (RuntimeException e) {
ActionErrors errors = new ActionErrors();
errors.add("deploy", new ActionMessage("请提供正确的流程定义文档(.zip)", false));
saveErrors(request, errors);
return mapping.findForward("deployUI");
}
我们一定不能忘记判断上传的文件是否为.zip文件
7.查询流程定义文件Action 类的实现
Long id = Long.parseLong(request.getParameter("id"));
ProcessDefinition pd = processDefinitionService.getById(id);
byte[] content = pd.getFileDefinition().getBytes("processdefinition.xml");
response.setContentType("text/xml;charset=utf-8");
response.getOutputStream().write(content);
return null;
查询流程图片(processimage.jpg)
Long id = Long.parseLong(request.getParameter("id"));
ProcessDefinition pd = processDefinitionService.getById(id);
byte[] content = pd.getFileDefinition().getBytes("processimage.jpg");
response.setContentType("image/jpeg");
response.getOutputStream().write(content);
return null;
这查看上传的流程文件和流程文件时,我们使用了一个打开小窗口 window.open()
复习一下JBPM,工作流动包括:部署,启动,查询,执行(开始,结束),Signal
1.流程定义
ProcessDefinition pd = ProcessDefinition.parseXmlResource("helloworld/processdefinition.xml");
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance("/jbpm.cfg.xml");
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); // 创建Session,开始事务
try {
jbpmContext.deployProcessDefinition(pd);
} catch (RuntimeException e) {
jbpmContext.setRollbackOnly();
throw e;
} finally {
jbpmContext.close(); // 提交/回滚 事务,关闭Session
}
2.对于这个模块的要求
1)方便的 定义/修改 与 管理 流程
2)方便的 定义/修改 与 管理 表单模板
3)执行审批流转(让表单(数据)按指定的流程进行流转,并且记录)
4)方便的查询所有的 表单实例 记录(查询流转过的表单)
3.分页
先设计一个对象,其中包括这些属性.
//是直接传给对象的
private int currentPage; // 当前页
private int pageSize; // 页面大小(每页显示的数量)
// 查询数据库得来的
private int recordCount; // 总记录数
private List recordList; // 本页的数据列表
// 通过自己计算就能得来
private int totalPage; // 总页码
private int startPageIndex; // 页码列表的开始索引
private int endPageIndex; // 页码列表的结束索引
4.总页数的计算.
分页在实现类中的数据准备过程要注意的事项
总数量对数据库的查询,用到了number
1)FROM 后跟的是 entity-name
2)entity-name是<class>的属性。默认为类的全限定名
3)在<hibernate-mapping>有auto-import属性,配置在HQL中是否可以使用简单名称。
默认为true。什么时候用false?
在有多个类是同一个简单名称时,只能有一个为true。
其中需要查询数据库的操作实现
int count = ((Number) getSession().createQuery(//
"SELECT COUNT(pd) FROM org.jbpm.graph.def.ProcessDefinition pd")//
.uniqueResult())//
.intValue();
int firstResult = PageView.calcFirstResult(pageNum, pageSize);
List list = getSession().createQuery(//
"FROM org.jbpm.graph.def.ProcessDefinition pd")//
.setFirstResult(firstResult)//
.setMaxResults(pageSize)//
.list();
在Action类中,直接向页面返回这个对象就行了.
5.审批流程管理
在实现一个功能之前,要先分析需求,再分析出需要的实体,最后才能编码实现.
不要一上来就急着编码,这样很难成功实现.
流程定义在JBPM中是 ProcessDefinition
JBPM所有的实体都要用它自己的API来操作.我们不能用自己的Session来操作JBPM.
部署新的审批流程:
这里我们用struts的直接上传流程的.zip文件.
6.struts的文件上传
1)HTML
<html:form action="/pd" οnsubmit="return checkForm(this)" enctype="multipart/form-data">
<html:file property="parResource"/>
在HTML中,别忘了声明enctype="multipart/form-data"
2)ActionForm
ProcessDefinitionActionForm actionForm = (ProcessDefinitionActionForm) form;
try {
ZipInputStream zipInputStream = new ZipInputStream(actionForm.getParResource().getInputStream());
ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zipInputStream);
processDefinitionService.deploy(pd);
} catch (RuntimeException e) {
ActionErrors errors = new ActionErrors();
errors.add("deploy", new ActionMessage("请提供正确的流程定义文档(.zip)", false));
saveErrors(request, errors);
return mapping.findForward("deployUI");
}
我们一定不能忘记判断上传的文件是否为.zip文件
7.查询流程定义文件Action 类的实现
Long id = Long.parseLong(request.getParameter("id"));
ProcessDefinition pd = processDefinitionService.getById(id);
byte[] content = pd.getFileDefinition().getBytes("processdefinition.xml");
response.setContentType("text/xml;charset=utf-8");
response.getOutputStream().write(content);
return null;
查询流程图片(processimage.jpg)
Long id = Long.parseLong(request.getParameter("id"));
ProcessDefinition pd = processDefinitionService.getById(id);
byte[] content = pd.getFileDefinition().getBytes("processimage.jpg");
response.setContentType("image/jpeg");
response.getOutputStream().write(content);
return null;
这查看上传的流程文件和流程文件时,我们使用了一个打开小窗口 window.open()