今天继续学习oa,汤老师讲了在oa中部署流程定义,对它进行管理,使用par包进行部署,并可以在线查看流程定义文件和流程图片,还可以把流程定义文档打包下载。经过前几天的学习,汤老师让大家自己先动手实现,自己做的时候遇到了很多问题,带着这些问题再听汤老师的讲解,效果不错。总结一下今天学习的重点。
oa中可以查看流程列表,默认显示所有流程定义的最后一个版本。还可以显示指定的流程定义的所有版本。这要用到GraphSession的两个方法。
查询所有的流程定义的最后一个版本:
GraphSession.findLatestProcessDefinitions();
查询指定名字的所有的流程定义:
GraphSession.findAllProcessDefinitionVersions(name);
GraphSession由JbpmContext.getGraphSession()获得。
获得流程定义的par包中的文件
通过FileDefinition可以得到流程定义文档中的所有的文件,他是通过
ProcessDefinition.getFileDefinition()获得的。FileDefinition有方法,
getBytes(String name)获得指定名字的文件的内容(返回值为byte数组)。
getBytesMap()返回的是流程定义中的所有文件,是一个Map。key是文件名,
String类型;value是文件内容,byte[]类型。
把byte[]转成字符串,使用new String(byte[] buf, String encoding);
然后而是让浏览器直接显示为图片和xml内容。打开一个新窗口,可以在配置链接的时候指定一个target,或者是使用window.open。后者的好处是可以定制窗口的大小和是否显示工具栏、菜单栏等。
显示processimage.jpg图片
ProcdefForm pdForm = (ProcdefForm) form;
ProcessDefinition pd = procdefService.getProcdef(pdForm.getId());
if (pd != null) {
FileDefinition fd = pd.getFileDefinition();
byte[] content = fd.getBytes("processimage.jpg");
//显示为图片
response.setContentType("image/jpeg");
response.getOutputStream().write(content);
}
显示processdefinition.xml
ProcdefForm pdForm = (ProcdefForm) form;
ProcessDefinition pd = procdefService.getProcdef(pdForm.getId());
FileDefinition fd = pd.getFileDefinition();
byte[] content = fd.getBytes("processdefinition.xml");
response.setContentType("application/xml");
response.getOutputStream().write(content);
对把流程定义文档打包下载
需要使用ZipOutputStream类
向ZipOutputStream中添加一个文件的方法:
ZipEntry zipEntry = new ZipEntry(name); // 新建并指定文件名字
zipOutputStream.putNextEntry(zipEntry); //开始写入新的 ZIP 文件条目并将流定位到条目数据的开始处。
zipOutputStream.write(content); // 写文件内容(字节数组)
zipOutputStream.closeEntry(); //关闭当前 ZIP 条目并定位流以写入下一个条目。
如果ZipEntry的名字以‘/’结尾,表示一个目录;也可以在指定文件名字的时候
指定所在的目录结构,例如想在zip文件中的"dd"目录下有一个文件a.txt,可以
写成"dd/a.txt"。在调用ZipOutputStream的putNextEntry(ZipEntry)方法或
close()方法后,会自动关闭上一个未关闭的Entry(所以可以不必显示调用
closeEntry()方法)。
实现下载
response.setContentType("application/zip");
String zipName = pd.getName() + "_" + pd.getVersion() + ".zip";
zipName = URLEncoder.encode(zipName, "utf-8");
response.addHeader("Content-Disposition", "attachment; filename=\"" + zipName + "\"");
最后一定要关闭ZipOutputStream,否则,现在下来的文件没有数据
删除流程定义,不要使用session自已实现删除操作,而应调用:
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinitionId);
对jbpm实体的增删改操作,都应使用jbpm提供的api;如果只是查询实体,则可以
自己使用session 直接操作。