今天开始oa的学习,汤老师讲了一个员工请假的jpbm的比较好的例子,对jpbm的重点,难点的掌握很有帮助。然后就在开始了在实际项目中使用jbpm的oa项目,又复习了一遍struts和hirbernate,感觉前段时间学的还是可以的,汤老师在一部分的实现之前会先讲一下要实现的功能,然后让大家试着去实现。感觉效果不错,即使有的地方做不出来,因为已经思考过了,再听汤老师讲解,有助于理解和
记忆。
员工请假流程:
1, 填写请假单。
2, 交由部门经理的批准。
3, 在批复申请之后,由系统给申请人发送消息,通知其批复结果。
4, 在请假被批准之前,申请人可以撤销请假申请。
5, 申请人撤销申请后,系统应发消息,通知正在审批的领导申请已撤销。
流程实现的主要部分在 4, 在请假被批准之前,申请人可以撤销请假申请。
可以设置个fork和join 对撤销请假和部门经理审批进行分支,在join中添加事件,
并添加事件的action类,
public class JionActionHandler implements ActionHandler {
public void execute(ExecutionContext executionContext) throws
Exception {
System.out.println("正在取消其他分支----");
//获取当前token
Token currToken=executionContext.getToken();
//获取父token
Token parent=currToken.getParent();
//map<name,obj>
Map<String, Token> tokens=parent.getChildren();
for(Token token:tokens.values())
{
if(token!=currToken){
//获得token上所有未完成的任务实例
Collection<TaskInstance>
taskInstances=executionContext.getTaskMgmtInstance().getUnfinishedTasks
(token);
for(TaskInstance taskInstance: taskInstances)
{ //阻止流程继续
taskInstance.setSignalling(false);
//关闭任务实例
taskInstance.cancel();
System.out.println("已取消实
例:"+taskInstance.getName());
}
//关闭token
token.end();
System.out.println("已结束Token:"+token.getName());
}
}
}
}
oa项目使用两层架构:view + service(service+dao)使用的dao很简单,与service结合一起了。
使用技术:struts1 + jstl1.1 + hibernate + jbpm
添加相应的jar包:
jbpm3.2.2的jar包(包含了Hibernate3.2.3,不用在添加Hibernate的jar包);
struts1.3.8的jar包;
jstl1.1;
相应的jdbc驱动;
添加配置文件:
jbpm.cfg.xml
hibernate.cfg.xml
log4j.properties
修改hibernate.cfg.xml中的数据库连接信息;
整个项目比较重要的是控制事务,不使用jbpm的项目都是由Hibernate控制的
,但是加入jbpm以后就不一样了,一个请求使用同一个JbpmContext;操作数据
库的Session是从JbpmContext中取得的。JbpmContext有一个getSession()的方法。要获得JbpmContext,用到的方法JbpmConfiguration.getCurrentJbpmContext()
,这个方法是返回与当前线程对应的JbpmContext,如果没有,返回null。
在调用JbpmConfiguration.createJbpmContext()后,新建的JbpmContext会自动和当前线程对应起来。
今天的学习中遇到了一个很奇怪的异常,汤老师对解决方法进行了讲解
java.lang.RuntimeException:javax.servlet.ServletException:java.lang.SecurityExc
eption:class"org.apache.commons.collections.SquenceHashMap" 's signer information does not match signer information of other classes in the same package
这个错误是由两个包引起的,commons-beanutils-1.7.0.jar和 commons-
collections.jar 从项目中移除这两个jar包 ,再到spring 的lib/jakarta-commons目录下找到两个jar包commons-beanutils.jar 和commons-collections.jar 把他们添加进项目,再重新部署项目,问题就解决了。
我在学习还遇到一个异常,异常就不详细介绍了,太简单了,但牵扯到的知识
还是很重要的,action类中 除了unspecified方法要用protected,其他方法都要用
public,否则会抛出找不到该方法的异常,以后一定要注意。