JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架,它可以运行在独立的服务器上或者嵌入任何Java应用中。现在,我们学习一下,如何把jbpm4.3和SSH框架进行整合,整合的步骤如下:
1.准备四个框架所需要的包
2.xml文件的配置
3.编写测试页面和类
4.启动tomcat发布
一.准备四个框架所需要的包.
这四个框架所需的包比较多,很容易搞错,少包或加了重复包等,我觉得应该按以下方式去整合四个框架的包,首先建好一个文件夹来装所需要的包,因为jbpm-4.3/lib下提供了整合各种框架所需的包,所以我们把它们先拷到新建的文件夹里面,考虑到有可能包不全的情况,所以接下来,把平时SSH框架下所用的包也拷到新建的文件夹来,这时一小部分同名的包就会被替换,当然可能还有重复的包,然后我们还需在新建的文件夹里把包排列一下,观察,手动删除重复的包.最后如果你用Myeclipse建web项目,你还需把与j2ee所需的同名的包给去了.
以下就是我在整合时所用的包:antlr-2.7.6.jar
aspectjrt.jar
aspectjweaver.jar
backport-util-concurrent-3.1.jar
cglib-2.2.jar
cglib-nodep-2.1_3.jar
common-annotations.jar
commons-collections-3.1.jar
commons-dbcp-1.2.1.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-logging.jar
commons-pool-1.2.jar
dom4j-1.6.1.jar
ehcache-1.5.0.jar
freemarker-2.3.15.jar
hibernate3.jar
javassist-3.9.0.GA.jar
jta-1.1.jar
mysql-connector-java-5.0.0-beta-bin.jar
ognl-2.7.3.jar
slf4j-api-1.6.1.jar
slf4j-nop-1.6.1.jar
spring-webmvc-struts.jar
spring.jar
struts2-core-2.1.8.1.jar
struts2-pell-multipart-plugin-2.1.8.1.jar
struts2-spring-plugin-2.1.8.1.jar
xwork-core-2.1.6.jar
jbpm.jar
juel-engine.jar
juel-impl.jar
juel.jar
mail.jar
二.xml文件的配置
总共有如下几个xml文件需要配置:web.xml struts.xml applicationContext.xml jbpm.cfg.xml,如果先前整合过SSH的话,只需要配置一下jbpm.cfg.xml,和applicationContext.xml 既可,这里就配置这两个文件,如果没有配置过SSH的话,去看我前面写的一篇SSH整合的文章,里面作了介绍.
jbpm.cfg.xml文件是jbpm的配置文件,如果不知道写,可以到jbpm的下载包里去找,jbpm-4.3/install/src/cfg/jbpm目录下有一个spring.jbpm.cfg.xml文件,把前面的spring去掉既可,它的代码如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <jbpm-configuration>
- <import resource="jbpm.default.cfg.xml" />
- <import resource="jbpm.tx.spring.cfg.xml" />
- <import resource="jbpm.jpdl.cfg.xml" />
- <import resource="jbpm.bpmn.cfg.xml" />
- <import resource="jbpm.identity.cfg.xml" />
- <import resource="jbpm.businesscalendar.cfg.xml" />
- <import resource="jbpm.console.cfg.xml" />
- <import resource="jbpm.jobexecutor.cfg.xml" />
- <process-engine-context>
- <string name="spring.cfg" value="applicationContext.xml" />
- </process-engine-context>
- </jbpm-configuration>
其中里面的value值是spring的IOC文件名.下面就是IOC applicationContext.xml 文件了这里面加载jbmp需要做二件事.
第一, 配置JBPM的映射文件,这个映射文件可以在jbpm-4.3/install/src/cfg/hibernate/jdbc下面的mysql.hibernate.cfg.xml文件中找到.
第二,注入jbpm引擎,这个代码可以在jbpm-4.3/install/src/cfg/spring下的applicationContext.xml文件的第一,二行找到.
下面就是它的代码:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <!-- 注入jbpm引擎 -->
- <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />
- <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
- <!-- 启动注解 -->
- <context:annotation-config></context:annotation-config>
- <!-- 基于classpath扫描加载bean -->
- <context:component-scan base-package="myclass"/>
- <!-- 加载事务管理器 -->
- <tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
- <!-- 注解事务 -->
- <tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
- <property name="url" value="jdbc:mysql://localhost:3306/test"/>
- <property name="username" value="root"/>
- <property name="password" value="liping"/>
- </bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="mappingResources">
- <list>
- <value>myclass/entity/User.hbm.xml</value>
- <!-- 配置JBPM的映射文件 -->
- <value>jbpm.repository.hbm.xml</value>
- <value>jbpm.execution.hbm.xml</value>
- <value>jbpm.history.hbm.xml</value>
- <value>jbpm.task.hbm.xml</value>
- <value>jbpm.identity.hbm.xml</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <value>
- hibernate.dialect=org.hibernate.dialect.MySQLDialect
- hibernate.show_sql=true
- </value>
- </property>
- </bean>
- <!--配置编程式的事务 -->
- <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"></property>
- </bean>
- <bean id="login" class="myclass.struts2.action.LoginAction">
- </bean>
- </beans>
这里面还加了测试用的其他的注解,与jbpm刚配置的无关.为了方便等下测试,我把web.xml,struts.xml文件也贴上来.
web.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <!-- 加载spring配置文件 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:application*.xml</param-value>
- </context-param>
- <!-- 加载监听器 -->
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
- <!--struts2 -->
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
struts.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>
- <constant name="struts.action.extension" value="lp" />
- <!-- struts2整合spring -->
- <constant name="struts.objectFactory" value="spring"></constant>
- <package name="login" namespace="/" extends="struts-default">
- <action name="login" class="login">
- <result name="succ">/succ.jsp</result>
- <result name="fail">/failure.jsp</result>
- </action>
- </package>
- </struts>
到这里为此,配置整合过程,就进行完了,下一步就是测试了,测试的要求就是,从页面添加一个用户到数据库,同时在jbpm表中加入一个流程文件.
三.添加测试页面和类
index.jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <html>
- <head>
- <title> 登录页面 </title>
- <link rel=stylesheet href="css/login.css" type="text/css">
- </head>
- <body>
- <h1 align="center">用户注册页面</h1>
- <hr>
- <div align="center">
- <form action="login.lp" method="post">
- <table cellspacing=5 border=5 bodercolor=#ffaa00 >
- <tr><th colspan="3" align="center" bgcolor=#ffaa00>用户注册</th></tr>
- <tr>
- <th rowspan="3" background="images/2.jpg" style="width=90px"></th>
- <td>用户名:</td><td><input type="text" class="message" name="username"></td></tr>
- <tr><td>密 码:</td><td><input class="message" type="password" name="userpassword"></td></tr>
- <tr><td colspan="2" align="center"><input type="submit" value="注册"> <input type="reset" value="重置"></td></tr>
- </table>
- </form>
- </div>
- </body>
- </html>
succ.jsp:
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <html>
- <head>
- <title>My JSP 'succ.jsp' starting page</title>
- </head>
- <!--默认把值放在了request作用域里面,如果要用session,则需要另外的方法 -->
- <body>
- <p> Succsess.${username } ${userpassword }</p><br>
- <a href="exit.jsp">退出系统</a>
- </body>
- </html>
下一步建立数据库用户表,UserPojo.java和User.hbm.xml,同时还需要创建jbmp的18张表.
- create table user(
- id varchar(32) primary key,
- username varchar(50),
- userpassword varchar(50),
- )
- package myclass.entity;
- public class UserPojo {
- private String id;
- private String userName;
- private String userPassword;
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getUserName() {
- return userName;
- }
- public void setUserName(String userName) {
- this.userName = userName;
- }
- public String getUserPassword() {
- return userPassword;
- }
- public void setUserPassword(String userPassword) {
- this.userPassword = userPassword;
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="myclass.entity.UserPojo" table="user">
- <!-- 配置对角标识符和表的主键 -->
- <!-- column表示与数据库对应的字段 -->
- <id name="id" column="id">
- <!-- 配置主键的生成策略 -->
- <generator class="uuid.hex" />
- </id>
- <!--配置其他的属性与字段 -->
- <property name="userName" column="username"></property>
- <property name="userPassword" column="userpassword"></property>
- </class>
- </hibernate-mapping>
jbpm的表可以在jbpm下载包里找到相应的脚本,导入数据库既可,这里用的是mysql数据库.jbpm-4.3/install/src/db/create下的jbpm.mysql.create.sql文件
接下来就要创建所要用到的ssh框架各层的接口和实现类了:
dao层接口:
- public interface UserDao {
- public void addUser(UserPojo user);
- }
dao层实现类:
- package myclass.dao.imp;
- import javax.annotation.Resource;
- import myclass.dao.UserDao;
- import myclass.entity.UserPojo;
- import org.hibernate.SessionFactory;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import org.springframework.stereotype.Repository;
- import org.springframework.transaction.annotation.Isolation;
- import org.springframework.transaction.annotation.Propagation;
- import org.springframework.transaction.annotation.Transactional;
- @Repository("userDaoImp")
- @Transactional
- public class UserDaoImp implements UserDao{
- @Resource(name="sessionFactory")
- private SessionFactory sessionFactory;
- @Transactional(readOnly = false, propagation = Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED,timeout=20)
- public void addUser(UserPojo user) {
- System.out.println("欢迎来到DAO层");
- //this.getSession().save(user);
- sessionFactory.getCurrentSession().save(user);
- }
- }
service层接口:
- public interface LoginService {
- public void check(String username,String userpassword);
- public void adduser(UserPojo user);
- public void testJbpm();
- }
service层实现类:
- package myclass.service.impl;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.util.zip.ZipInputStream;
- import javax.annotation.Resource;
- import myclass.dao.UserDao;
- import myclass.entity.UserPojo;
- import myclass.service.LoginService;
- import org.jbpm.api.Configuration;
- import org.jbpm.api.NewDeployment;
- import org.jbpm.api.ProcessEngine;
- import org.jbpm.api.RepositoryService;
- import org.springframework.stereotype.Service;
- @Service("loginServiceImpl")
- public class LoginServiceImp implements LoginService{
- @Resource(name="userDaoImp")
- public UserDao userDao;
- @Resource(name="processEngine")
- public ProcessEngine processEngine;
- public void check(String username, String userpassword) {
- System.out.println("欢迎你来到业务层:"+username+"---"+userpassword);
- }
- public void adduser(UserPojo user) {
- System.out.println("欢迎你来到业务层");
- userDao.addUser(user);
- }
- public void testJbpm() {
- RepositoryService repositoryService=processEngine.getRepositoryService();
- NewDeployment newDeployment=repositoryService.createDeployment();
- newDeployment.addResourceFromClasspath("leave.jpdl.xml");
- String id=newDeployment.deploy();
- System.out.println(id);
- }
- }
这里的testJbpm方法是将一个leave.jpdl.xml流程的文件放入jbpm数据库,需要在src下创建这样一个文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <process name="leave" xmlns="http://jbpm.org/4.3/jpdl">
- <start g="308,38,48,48" name="start">
- <transition g="-101,-17" name="to leave message" to="leave message"/>
- </start>
- <task assignee="xiong" g="285,104,92,52" name="leave message">
- <transition g="-83,-17" name="to exclusive1" to="exclusive1"/>
- </task>
- <task assignee="deng" g="201,268,92,52" name="counselor check">
- <transition g="-243,-16" name="to director check" to="director check"/>
- </task>
- <task assignee="liping" g="386,267,92,52" name="director check">
- <transition g="-41,-17" name="to end" to="end"/>
- </task>
- <end g="379,395,48,48" name="end"/>
- <decision expr="#{role}" g="312,183,48,48" name="exclusive1">
- <transition g="-46,-15" name="student" to="counselor check"/>
- <transition g="7,-11" name="counselor" to="director check"/>
- </decision>
- </process>
最后就是控制类了:
LoginAction.java:
- package myclass.struts2.action;
- import javax.annotation.Resource;
- import myclass.entity.UserPojo;
- import myclass.service.LoginService;
- import org.springframework.stereotype.Controller;
- @Controller("loginAction")
- public class LoginAction {
- //注入业务对象
- @Resource(name="loginServiceImpl")
- private LoginService loginService;
- private String username;
- private String userpassword;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getUserpassword() {
- return userpassword;
- }
- public void setUserpassword(String userpassword) {
- this.userpassword = userpassword;
- }
- public String execute(){
- System.out.println("我进来了呢");
- System.out.println(this.getUsername());
- System.out.println(this.getUserpassword());
- UserPojo user=new UserPojo();
- //user.setUserName("xiong");
- //user.setUserPassword("4654654");
- user.setUserName(this.getUsername());
- user.setUserPassword(this.getUserpassword());
- //作用是添加用户
- loginService.adduser(user);
- //添加用户后,测试jbpm,添加一个流程文件
- loginService.testJbpm();
- return "succ";
- }
- }
到这里,测试类就写完了,下面可以启动tomcat了.
四,启动tomcat
如果tomcat5,不会有什么问题,如果是tomcat6.0则需要把juel.jar
juel-engine.jar
juel-impl.jar这几个包放到tomcat6.0的lib下,如果不对,则把el-api.jar删了,既可.如果还有问题的话,可以换成tomcat6.0.20,这个我测试成功了,不过tomcat6.0.28的测试却不对,不知道为什么.到此就整合和测试完了,东西比较多,但总的思想就是先把一个组合配置正确,再增加一个,一步一步配置.