准备工作已经做好了,现在就可以开始进行代码的编写了。ssh框架集成的开始模式其实比较简单,各层的对象由spring负责管理,各层对象的依赖由spring负责注入。一般我们推荐采用面向接口的编程方式,理由很简单,大家都这么做。系统主要由数据访问层,业务层,控制层,显示层组成,当然根据具体情况可能会稍有不同,但只有能解决问题就可以了。其中由spring管理业务层的事务。
1.DAO
package org.qhit.jbpm;
import java.util.List;
import java.util.Map;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.transaction.annotation.Transactional;
/**
* 关于流程的数据访问接口
*
* @author 健坤IT教育
*
*/
public interface MonthDaoI {
/**
* 发布流程[流程定义的打包文件的路径]
*/
public abstract void publish(final String path);
/**
* 删除流程
* @param pfid[流程定义ID]
*/
public void deleteDefinition(final long pfid);
/**
* 完成任务
* @param tasker
* @param taskName
* @param params
* @param pid
* @param tranName
*/
public void finishTask(final String tasker, final String taskName,
final Map params, final long pid, final String tranName);
/**
* 启动流程
* @param pfid
* @param params
* @return
*/
public long start(final long pfid, final Map params);
/**
* 查找未完成的任务列表
* @param actorId
* @return
*/
public List<TaskInstance> getAllTaskByActorId(final String actorId);
}
实现类
package org.qhit.jbpm;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.jbpm.JbpmContext;
import org.jbpm.JbpmException;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.springframework.transaction.annotation.Transactional;
import org.springmodules.workflow.jbpm31.JbpmCallback;
import org.springmodules.workflow.jbpm31.support.JbpmDaoSupport;
/**
* spring注入jbpmtmplate或jbpmconfiguration对象
*
* @author 峰哥
*
*/
public class MonthDao extends JbpmDaoSupport implements MonthDaoI {
// 发布----
/*
* (non-Javadoc)
*
* @see org.qhit.jbpm.MonthDaoI#publish(java.lang.String)
*/
public void publish(final String path) {
super.getTemplate().execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
ZipInputStream in = new ZipInputStream(MonthDao.class
.getResourceAsStream(path));
ProcessDefinition pd = ProcessDefinition
.parseParZipInputStream(in);
context.deployProcessDefinition(pd);
return null;
}
});
}
// 删除
public void deleteDefinition(final long pfid) {
super.getTemplate().execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
context.getGraphSession().deleteProcessDefinition(pfid);
return null;
}
});
}
// 查找任务人所有未完成的任务
public List<TaskInstance> getAllTaskByActorId(final String actorId) {
return super.getTemplate().findTaskInstances(actorId);
}
// 启动流程[带流程变量]
public long start(final long pfid, final Map params) {
return (Long) super.getTemplate().execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
ProcessDefinition df = context.getGraphSession()
.loadProcessDefinition(pfid);
ProcessInstance pi = df.createProcessInstance(params);
// 发信号
pi.signal();
return pi.getId();
}
});
}
// 完成任务----[任务人,任务名,数据,流程实例编号 转向名]
public void finishTask(final String tasker, final String taskName,
final Map params, final long pid, final String tranName) {
super.getTemplate().execute(new JbpmCallback() {
public Object doInJbpm(JbpmContext context) throws JbpmException {
ProcessInstance pi = context.loadProcessInstance(pid);
Collection<TaskInstance> taskes = pi.getTaskMgmtInstance()
.getTaskInstances();
if (taskes != null) {
for (TaskInstance t : taskes) {
if (!t.hasEnded() && t.getActorId().equals(tasker)
&& t.getName().equals(taskName)) {
t.end(tranName);// 结束任务
break;
}
}
}
return null;
}
});
}
}
2.BIZ[业务层]
package org.qhit.jbpm.biz;
import java.util.List;
import java.util.Map;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.qhit.jbpm.MonthDaoI;
import org.springframework.transaction.annotation.Transactional;
@Transactional(readOnly=false)
/**
* 流程处理的业务类
*/
public class MonthJbpmBiz {
private MonthDaoI monthDao;
public void setMonthDao(MonthDaoI monthDao) {
this.monthDao = monthDao;
}
//发布
public void publish(String path)
{
this.monthDao.publish(path);
}
//启动
public long start(long pfid,Map<String, Object> params)
{
return this.monthDao.start(pfid, params);
}
//完成任务
public void finishTask(final String tasker,final String taskName,final Map params,final long pid,final String tranName)
{
this.monthDao.finishTask(tasker, taskName, params, pid, tranName);
}
//查找任务
public List<TaskInstance> getAllTaskByActorId(final String actorId){
return this.monthDao.getAllTaskByActorId(actorId);
}
}
这里的业务比较简单,所以代码应该很容易弄懂,这里没有使用接口也是可以的,但代理方式就不是基于接口了,而是基于cglib方式。注意在业务方法中的异常处理,如果有异常,一定要把异常抛出来。否则spring可能无法知道是否发生异常,但从当发生异常里不rollback事务。
3.ACTION[控制层]
一般的项目开发中,很少让控制层直接处理由业务层抛出的异常,所有我们一般会在业务层与控制层加一层比如wrapper之类的,处理业务层可以出现的异常,然后返回友好的结果给控制层。但这仅仅是个简单的示例。我们就直接将业务层对象注入给控制层的action了。
package org.qhit.web.actions;
import java.util.List;
import org.jbpm.taskmgmt.exe.TaskInstance;
import org.qhit.jbpm.biz.MonthJbpmBiz;
import com.opensymphony.xwork2.util.ValueStack;
/**
* 关于月度报表流程的控制类
* 1.发布流程
* 2.启动流程
* 3.完成任务....
* @author 峰哥 健坤教育---快乐学习
*
*/
public class MonthAction {
//spring di
private MonthJbpmBiz monthJbpmBiz;
private List<TaskInstance> taskes;//提供getter setter方法
//spring注入业务对象
public void setMonthJbpmBiz(MonthJbpmBiz monthJbpmBiz) {
this.monthJbpmBiz = monthJbpmBiz;
}
private String actorId;//保存登陆后的用户名
public List<TaskInstance> getTaskes() {
return taskes;
}
public void setTaskes(List<TaskInstance> taskes) {
this.taskes = taskes;
}
public String getActorId() {
return actorId;
}
public void setActorId(String actorId) {
this.actorId = actorId;
}
//查询
public String findAll(){
//ValueStack 【这里的任务参与人是硬编码的....】
List<TaskInstance> taskes = this.monthJbpmBiz.getAllTaskByActorId("清华小帅哥");//这里是硬编码
this.taskes = taskes;
System.out.println("在action中取得任务列表:\t"+taskes);
return "ok";
}
}
4.jsp等[显示层]
ok.jsp 作用是遍历保存于作用域中的taskes变量,显示当前用户的所有任务列表。
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:forEach items="${taskes}" var="task">
<div><a href="show.jsp?tid=${task.id }">${task.name }</a></div>
</c:forEach>
show.jsp 利用jbpm图形标记,显示当前流程实例的图形信息。
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@page import="org.jbpm.JbpmContext"%>
<%@page import="org.jbpm.JbpmConfiguration"%>
<%@ taglib prefix="jbpm" uri="/WEB-INF/jbpm.tld"%>
<jbpm:processimage task="${param.tid}"/>
基本的代码就是这些,下面的就是配置文件的编写与修改了。【未完待续】
分享到:
相关推荐
【SSH2 + JBPM Demo】是一个结合了Secure Shell (SSH2) 和Business Process Management Suite (JBPM) 的示例项目,旨在展示如何在Java应用程序中使用这两种技术来实现远程管理和流程自动化。SSH2是一个用于安全远程...
这个"ssh+jbpm流程例子jar包2"是一个包含SSH和jbpm集成的示例项目,可能包括了以下关键知识点: 1. **SSH框架集成**:项目中会展示如何将Struts2、Spring和Hibernate整合在一起,实现从视图到模型再到数据访问的...
SSH+JBPM整合是一个在Java开发领域常见的技术组合,用于构建复杂的业务流程管理系统。SSH代表Struts2、Spring和Hibernate,它们分别是MVC框架、依赖注入容器和对象关系映射库,而JBPM则是一个开源的工作流和业务流程...
【JBPM web(SSH+JBPM)例子】是一个基于Java技术栈实现的工作流管理系统示例,其中SSH代表Spring、Struts和Hibernate这三个流行的Java企业级开发框架的组合,而JBPM则是Business Process Management(业务流程管理...
4. **集成开发**:教程可能涵盖如何将前端的ExtJS与后端的SSH2和jbpm4进行通信,如使用Ajax进行异步请求,处理JSON数据,以及如何通过jbpm4 API在前端触发工作流程。 5. **实战案例**:通过提供的案例,学习者可以...
SSH+jbpm4.4 Demo 是一个集成Spring Security(SSH)和jBPM 4.4的示例项目,主要用于展示如何在实际应用中结合这两个技术来实现业务流程管理。SSH,即Spring Security,是一个强大的安全框架,用于保护Java应用程序...
SSH(Struts2 + Spring + Hibernate)是一种经典的Java Web开发框架组合,用于构建高效、可扩展的企业级应用程序。SSH框架的结合提供了模型-视图-控制器(MVC)设计模式的实现,Spring提供了依赖注入(DI)和面向切...
SSH(Struts2 + Spring + Hibernate)是一种常见的Java Web开发框架组合,用于构建高效、可扩展的Web应用程序。SSH框架的整合使得开发者能够利用Struts2的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的...
在这个资源中,作者对原有的内容进行了调整,以帮助开发者更便捷地将Jbpm集成到SSH2环境中。 SSH2框架: 1. Struts:这是一个MVC(模型-视图-控制器)框架,负责处理HTTP请求,提供视图展示和业务逻辑分离。 2. ...
Struts、Hibernate、Spring 和 ...总结来说,这个项目是一个综合性的企业级应用示例,它演示了如何利用这些主流技术构建一个功能完备、可扩展的工作流管理系统,对于学习和理解这些技术的集成应用具有很高的参考价值。
**jbpm_ssh.zip_jbpm+ssh** 是一个包含jbpm(Java Business Process Management)与SSH(Spring、Struts和Hibernate)集成示例的压缩包。这个集成是企业级Java应用开发中的常见实践,旨在利用jbpm的强大工作流管理...
【jbpm+ssh整合】是将企业级工作流引擎jbpm与流行的SSH(Struts、Spring、Hibernate)框架集成,实现一个完整的业务流程管理系统。jbpm是一个开源的工作流引擎,可以处理复杂的业务流程自动化,而SSH是Java开发中...
- `jbpm与ssh框架集成.mht` 文件可能包含了一个完整的示例,演示了如何在SSH项目中启动和控制jbpm流程。 - `jbpm 4_3 与 spring 集成 - AJava.mht` 文件可能是关于jbpm 4.3版本与Spring集成的详细教程,包括具体的...
在这个"ssh-jbpm.rar"压缩包中,我们关注的是Struts2的应用实例,它可能包含了与jbpm(Job Business Process Management,工作流管理系统)集成的内容,以及SSH(Spring、Struts2和Hibernate)这一经典Java EE开发栈...
SSH整合JBPM是一个常见的企业级应用开发场景,SSH指的是Spring、Struts和Hibernate这三个开源框架的集成,而JBPM则是一个强大的工作流管理系统。在这个整合过程中,SSH负责应用程序的架构和数据管理,而JBPM则提供了...
jbpm4.4 shh2 项目示例是基于jbpm4.4版本与SSH2(Struts2、Spring和Hibernate)集成的一个实战项目。jbPM(Business Process Management)是一款开源的工作流管理系统,用于实现业务流程自动化。SSH2是Java开发中的...
工作流JBPM SSH示例是将企业级工作流管理系统JBPM与流行的Java开发框架SSH(Struts、Spring、Hibernate)整合的一个典型应用。这个示例旨在帮助开发者理解如何在Java Web环境中集成工作流管理,以实现更高效的企业...
【jbpm4.4+ssh】是一个集成项目,它结合了jbpm(Java Business Process Management)4.4版本与SSH(Spring、Struts、Hibernate)这三大流行的技术框架。jbpm是一个开源的工作流和业务流程管理系统,而SSH是Java开发...
【JBPM4.4+SSH2 业务流 绑定表单Demo】是一个结合了Java企业级框架Spring(SSH2中的S和H)与工作流引擎JBPМ4.4的实战示例,用于演示如何在业务流程中集成自定义表单。这个Demo主要涵盖了以下几个关键知识点: 1. *...
在“struts_spring_hibernate_jbpm”这个文件中,我们可以推测这是将SSH框架与JBPM4.4集成的示例项目。开发者可能已经配置好了Struts、Spring和Hibernate的集成,同时也将JBPM的工作流引擎集成到了应用中,以便实现...