标签:
一、SSH整合JBPM
JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html
现在将要实现SSH和JBPM的整合。
1.添加jar包
(1)jbpm项目/lib目录下的所有jar包和根目录下的jbpm.jar包放入/WEB-INF/lib文件夹下,同时删除tomcat服务器/lib文件夹中的el-api.jar包。
注意:必须删除el-api.jar包,该jar包和jbpm项目中需要使用到的三个jar包冲突了:juel-api.jar、juel-engine.jar、juel-impl.jar
最好的解决方法就是将tomcat服务器根目录下的/lib文件夹中的el-api.jar包使用上述的三个jar包替换掉,这样也能够运行其他的服务器程序。
也就是说以上的三个jar包的功能能够代替el-api.jar包的功能,但是反之则不可以。
(2)hibernate的相关jar包不需要添加了。jbpm项目中已经添加了hibernate相关的jar包。这里推荐使用jbpm项目中提供的hibernate支持jar包。否则可能会出现一些莫名其妙的问题。
(3)mysql的驱动jar包也不需要添加了,因为该jar包也已经在jbpm项目中提供了。推荐使用jbpm项目中提供的mysql的驱动jar包。原生的更靠谱,但是亲测使用Mysql官方网站提供的驱动jar包也没有问题。
(4)添加spring的相关jar包。
(6)添加struts2的相关jar包。
(7)项目中会使用到ajax的相关功能,前端ajax和struts2交互使用struts2提供的jar包更方便(自定义结果集也能够实现,但是比较麻烦)
(7)推荐将使用到的jar包分门别类的放到一起,方便管理。
ext文件夹存放了代替el-api.jar包的三个jar包;jstl文件夹用不着,我使用的是java EE 6.0的版本,自带jstl的相关支持jar包;junit文件夹中存放单元测试的相关jar包,该jar包也不需要下载,myeclipse自带,直接右键项目->Build Path->Add Libraries->JUnit也能够添加,注意选用4.0的版本。
2.配置文件的配置
建议将配置文件单独放在一个source文件夹中,如下图所示
SSH整合过程见
http://www.cnblogs.com/kuangdaoyizhimei/p/4855034.html
只说几处和SSH和JBPM整合的关键地方:
(1)hibernate.cfg.xml配置文件被jbpm.hibernate.cfg.xml配置文件取代。两个文件中的内容合并到一起,最后在spring中声明配置文件的位置即可(jpbm.hibernate.cfg.xml)
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:jbpm/jbpm.hibernate.cfg.xml"></property> </bean>
(2)jbpm相关的配置
jbpm最重要的一个对象就是ProcessEngine对象,所有的一切流程动作都需要从此对象出发,创建该对象的任务也需要交给spring,注意创建方式为工厂方式。
<!-- 配置jbpm相关 --> <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper"> <property name="jbpmCfg" value="jbpm/jbpm.cfg.xml"></property> </bean> <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine"></bean>
(3)其余配置过程就是SSH的整合过程了,不赘述。
3.SSH整合JBPM的过程主要还是SSH整合的过程,所以SSH是基础,必须熟练掌握。
二、项目演示
项目工程源代码:https://github.com/kdyzm/sshAndJBPM
在项目运行之前,首先运行com.kdyzm.init.Init类,初始化用户数据。
1.浏览器上输入http://localhost:8080/jbpmAndSSH,出现登陆界面
输入预置的用户名张三,密码xiaozhang(所有的用户密码统一为xiaozhang)登陆
2.登陆后主界面
3.首先画一张流程图,打包成zip压缩文件,单击部署流程定义文档进行部署。
单击确定按钮之后:
查看流程图:
至此,流程部署已经成功。
4.表单模板管理
该项功能可以根据现有的流程定义新建流程模板等。
添加新模板:上传一个模板文件
上传成功之后:
5.发起申请
单击第一项:请假流程表单模板
自动跳转到“我的申请”查询页面
6.申请查询
单击查询状态,会显示“我”的所有申请入上图所示
单击查看流转记录图,可以查看当前流程的审批进程
以上的流程图是比较复杂的流程图,之前的笔记中提到的fork/join节点在这里使用到了。现在的流程实例需要项目组长和项目副组长共同同意流程才能流向总经理审批节点。
红色方框是怎么动态显示出来的是一个非常有意思的事情,使用CSS+DIV块可以精确定位,对border设置样式 即可。
7.审批
流程流向了项目组长审批(张三)和项目副组长(李四)审批的任务节点。当前账户是张三,由张三第一个审批。
单击审批处理查看当前有权限处理的所有审批任务
单击审批处理:
直接点击同意,返回到审批列表,这时任务已经结束,所以审批列表中已经没有任务了。
8.再次查看我的申请,查看流程状态
9.登陆李四(副组长)的账户,进行审批
和上面一样如法炮制,点击同意,切换回张三的账户,查看审批进度,发现流程已经流转到总经理审批的地方了
登陆王五(总经理)的账户,审批同意,再次返回张三的账户查看审批进度
流程已经流转到总裁审批的任务节点了。
接下来使用赵六(总裁)的账户登陆系统,进行审批,审批过后使用张三的账户登录系统,再次查看流程状态,这时已经查看不了流程图了,因为申请状态已经标志为“完成申请”
对比未完成的状态,当前状态发生了改变,同时不能查看流转记录图了:
10.该小项目的主要功能就这么多。
三、技术点分析
1.文件上传
写了一个文件上传的工具类解决文件上传的问题
package com.kdyzm.utils; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.apache.struts2.ServletActionContext; /** * 文件上传的工具类 * @author kdyzm * */ public class FileUploadUtils { /** * 保存文件到指定的位置 * 注意保存的方法的问题 * @param sourceFile * @param infactFileName * @return */ public static File saveUploadFileToDestDir(File sourceFile, String infactFileName){ SimpleDateFormat sdf=new SimpleDateFormat("/yyyy/MM/dd"); Date date=new Date(); File dir=new File(ServletActionContext.getServletContext().getRealPath("/upload")+sdf.format(date)); if(!dir.exists()){ dir.mkdir(); } String []arrFileNames=infactFileName.split("\\."); String lastFileName=arrFileNames[arrFileNames.length-1]; File destFile=new File(dir,UUID.randomUUID().toString().replaceAll("-", "")+"."+lastFileName); try { FileUtils.copyFile(sourceFile, destFile); } catch (IOException e) { System.out.println("保存文件失败!"); } return destFile; } }
文件上传到了项目根目录下的/upload/年/月/日文件夹下。
2.文件下载
需要注意的事项:
(1)使用URLEncoder类对文件名进行编码,如果是英文名倒不要紧,如果是中文名,则必须使用该类
String fileName=URLEncoder.encode(formTemplate.getName(),"utf-8");
(2)设置响应头信息,告诉浏览器返回的内容是需要下载的
response.setContentType("application/force-download");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
(3)方法返回值为NULL,在struts2中,如果返回值不是NULL,则会报异常,但是并不影响下载。
return null;
(4)下载表单模板完整事例
1 /** 2 * 下载指定formTemplateId指向的文件的方法 3 */ 4 public String downloadFormTemplateById() throws Exception{ 5 HttpServletRequest request=ServletActionContext.getRequest(); 6 HttpServletResponse response=ServletActionContext.getResponse(); 7 String formTemplateId=request.getParameter("formTemplateId"); 8 FormTemplate formTemplate=formTemplateService.getFormTemplateById(formTemplateId); 9 File file=new File(formTemplate.getUrl()); 10 String fileName=URLEncoder.encode(formTemplate.getName(),"utf-8"); 11 12 response.setContentType("application/force-download"); 13 response.setHeader("Content-Disposition","attachment;filename="+fileName); 14 FileInputStream fis=new FileInputStream(file); 15 OutputStream os=response.getOutputStream(); 16 int length=-1; 17 byte buff[]=new byte[1024]; 18 while((length=fis.read(buff))!=-1){ 19 os.write(buff, 0, length); 20 } 21 os.close(); 22 fis.close(); 23 return null; 24 }
3.
【Java EE 学习第58-67天】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】
标签:
原文地址:http://www.cnblogs.com/kuangdaoyizhimei/p/4983186.html