此篇接上篇 JBPM学习(一)--与SSH整合
http://blog.csdn.net/lushuaiyin/article/details/8599253
SSH与JBPM整合好以后我们必须写测试代码才能确认到底整合成功与否。
在jbpm-4.4\examples\src\org\jbpm\examples路径下我们可以找到官方自带的Demo。
在不知JBPM如何使用前,最好看看Demo的代码。
我挑了这个目录下java这个文件夹里面的代码。把它拷贝到Eclipse中看看。
process.jpdl.xml是流程定义文件,这个打开后能看到图形,也可以看源码。
3个bean和一个测试类。我们要把这些代码整合到SSH中去,就把每个方法在Action重新定义一遍就可以了。
搞定之后,我们再照着自己再定义一个流程。
在Eclipse中新建一个jBPM 4 Process Definition文件。
然后就可以用Eclipse的插件来画流程图了。
WorkFlowTestAction
package org.jbpm.action;
import java.util.List;
import org.base.MyBaseAction;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.RepositoryService;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
public class WorkFlowTestAction extends MyBaseAction {
private static final long serialVersionUID = 1L;
public String execute() throws Exception{
return SUCCESS;
}
//发布流程
public String setUp() throws Exception {
RepositoryService repositoryService=getProcessEngine().getRepositoryService();
String pro="1";
if(this.getHttpServletRequest().getParameter("pro")!=null){
pro=(String)this.getHttpServletRequest().getParameter("pro");
if(!pro.trim().equals("")){
if(pro.equals("2")){
deploymentId = repositoryService.createDeployment()
.addResourceFromClasspath("org/jbpm/config/process.jpdl.xml")//流程定义
.addResourceFromClasspath("org/jbpm/config/process.png")//流程定义图,这个可选
.deploy();
System.out.println("发布流程2,ID:"+deploymentId);
}else{
deploymentId = repositoryService.createDeployment()
.addResourceFromClasspath("org/jbpm/config/myprocess.jpdl.xml")//流程定义
.addResourceFromClasspath("org/jbpm/config/myprocess.png")//流程定义图
.deploy();
System.out.println("发布流程1,ID:"+deploymentId);
}
}
}
return NONE;
}
//查询流程
public String showAll() throws Exception {
RepositoryService repositoryService=getProcessEngine().getRepositoryService();
String proname="";
if(this.getHttpServletRequest().getParameter("proname")!=null){
proname=(String)this.getHttpServletRequest().getParameter("proname");
if(proname.trim().equals("")){
System.out.println("proname参数为空,查询所有流程");
List<ProcessDefinition> processDefinitions = repositoryService.createProcessDefinitionQuery().list();
if(processDefinitions!=null){
this.setValueToRequest("processDefinitions", processDefinitions);
}
}else{
System.out.println("proname参数"+proname);
List<ProcessDefinition> processDefinitions = repositoryService
.createProcessDefinitionQuery().processDefinitionName(proname).list();
if(processDefinitions!=null){
this.setValueToRequest("processDefinitions", processDefinitions);
}
}
}
return SUCCESS;
}
//删除流程
public String tearDown() throws Exception {
RepositoryService repositoryService=getProcessEngine().getRepositoryService();
String delId="";
if(this.getHttpServletRequest().getParameter("delId")!=null){
delId=(String)this.getHttpServletRequest().getParameter("delId");
if(!delId.trim().equals("")){
repositoryService.deleteDeploymentCascade(delId);
System.out.println("删除流程,ID:"+delId);
}else{
System.out.println("流程,ID为空,删除失败");
}
}else{
System.out.println("流程,ID为空,删除失败");
}
return NONE;
}
public ProcessEngine processEngine;
public ProcessEngine getProcessEngine() {
return processEngine;
}
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
public String deploymentId;
public String getDeploymentId() {
return deploymentId;
}
public void setDeploymentId(String deploymentId) {
this.deploymentId = deploymentId;
}
}
struts_jbpm_test.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="jbpmtest" extends="base-struts-default" namespace="/jbpmtest">
<action name="setUp" class="org.jbpm.action.WorkFlowTestAction" method="setUp">
</action>
<action name="tearDown" class="org.jbpm.action.WorkFlowTestAction" method="tearDown">
</action>
<action name="showAll" class="org.jbpm.action.WorkFlowTestAction" method="showAll">
<result name="success">/jsp/jbpmtest/listProcess.jsp</result>
</action>
</package>
</struts>
listProcess.jsp
<%@ page contentType="text/html; charset=UTF-8"%>
<%@page import="java.util.*"%>
<%@page import="org.jbpm.api.ProcessDefinition"%>
<%
String path = request.getContextPath();
%>
<%
List list=null;
if(request.getAttribute("processDefinitions")!=null){
list=(List)request.getAttribute("processDefinitions");
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
<script src="<%=path%>/script/jquery-1.7.1.min.js" type="text/javascript"></script>
</head>
<body style="overflow: scroll; overflow: auto;">
<input type="hidden" name="path" id="path" value='<%=path%>' ></input>
<table width="500px" border="1" align="center">
<tr>
<td align="center">流程名字:<input type="text" id="proname" value='' ></input></td>
</tr>
<tr>
<td align="center"><h1><a href="javascript:void(0)" οnclick="query()">查询</a></h1></td>
</tr>
<tr>
<td align="center"><input type="button" οnclick="setUpProcess('1')" value='发布流程1--myprocess' ></input></td>
</tr>
<tr>
<td align="center"><input type="button" οnclick="setUpProcess('2')" value='发布流程2--java' ></input></td>
</tr>
</table>
<table width="500px" border="1" align="center">
<tr>
<th align="center">流程id</th><th align="center">流程名字</th><th align="center">操作</th>
</tr>
<%
if(list!=null){
for(int i=0;i<list.size();i++){
ProcessDefinition process=(ProcessDefinition)list.get(i);
if(process!=null){
String proid="";
String proname="";
if(process.getDeploymentId()!=null){
proid=process.getDeploymentId();
}
if(process.getName()!=null){
proname=process.getName();
}
%>
<tr>
<td><%=proid%></td><td><%=proname%></td><td><input type="button" οnclick="delprocess('<%=proid%>')" value='删除' ></input></td>
</tr>
<%
}
}
}
%>
</table>
</body>
</html>
<script type="text/javascript">
function query(){
var proname=document.getElementById("proname").value;
var urlpath="<%=path%>/jbpmtest/showAll.action?proname="+proname+"&randomStr="+Math.random();
window.location.href=urlpath;
}
function delprocess(id){
var urlpath="<%=path%>"+"/jbpmtest/tearDown.action";
$.ajax({
type:"POST",
url:urlpath,
data: "delId="+id+"&randomStr="+Math.random(),
success: function(msg){
alert("成功删除!");
window.location.reload();
}
});
}
function setUpProcess(pro){
var urlpath="<%=path%>"+"/jbpmtest/setUp.action";
$.ajax({
type:"POST",
url:urlpath,
data: "pro="+pro+"&randomStr="+Math.random(),
success: function(msg){
alert("成功发布!");
window.location.reload();
}
});
}
</script>
如下是整合后的package结构图:
在启动服务器时没有报错,但是在访问jsp页面时,却报错了:
严重: Servlet.service() for servlet jsp threw exception
java.lang.LinkageError: loader constraint violation: when resolving interface method
"javax.servlet.jsp.JspApplicationContext.getExpressionFactory()Ljavax/el/ExpressionFactory;" the
class loader (instance of
org/apache/jasper/servlet/JasperLoader) of the current class, org/apache/jsp/index_jsp, and the
class loader (instance of
org/apache/catalina/loader/StandardClassLoader) for resolved class,
javax/servlet/jsp/JspApplicationContext, have different
Class objects for the type javax/el/ExpressionFactory used in the signature
at org.apache.jsp.index_jsp._jspInit(index_jsp.java:24)
at org.apache.jasper.runtime.HttpJspBase.init(HttpJspBase.java:52)
从网上找到了原因:
原因:
jbpm4 在tomcat6 下面ssh2 这个错误!
原因是项目中WEB-INF\lib中的三个jar包(juel.jar, juel-engine.jar, juel-impl.jar)和tomcat6下lib中jar
包(el-api.jar)冲突
解决方法:
方法一:换成tomcat5.5 一点问题也没有了
方法二:将juel.jar, juel-engine.jar, juel-impl.jar这三个包复制到tomcat6下lib中,并删除原来的
el-api.jar,切记要把WEB-INF\lib中的juel.jar, juel-engine.jar, juel-impl.jar删除。不然还是要冲突。
------------------------------------------------------------------------------------------------------------------------------------------------------------
继续。。。。
访问http://localhost:8080/frame/jbpmtest/showAll.action
分别请求action中的查询,发布,删除方法都正常。
好,到现在算是整合成功了。
看看效果吧: