spring+hibernate+osworkflow实现工作流程控制

以下代码也是从网络上整理过来的,在这里记录一下。

首先如下图所示建立一个Web工程.

用到的lib列表如下:

activation.jar
bsh-1.2b7.jar
commons-logging.jar
designer.jar
mail.jar
oscore-2.2.5.jar
osuser-1.0-dev-2Feb05.jar
osworkflow-2.8.0.jar
propertyset-1.4.jar
quartz.jar
antlr-2.7.6.jar
asm.jar
cglib-2.1.3.jar
commons-beanutils.jar
commons-codec.jar
commons-collections-3.2.jar
commons-dbcp-1.2.jar
commons-lang.jar
commons-pool-1.3.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
jta.jar
jtds-1.2.2.jar
log4j-1.2.14.jar
spring.jar

 

代码如下所示:

AllowAction.java

  1. package tw.idv.idealist.actions;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.web.context.WebApplicationContext;
  8. import org.springframework.web.context.support.WebApplicationContextUtils;
  9. import com.opensymphony.workflow.Workflow;
  10. import tw.idv.idealist.Leave;
  11. public class AllowAction extends HttpServlet {
  12.     private static final long serialVersionUID = -8935624987243166064L;
  13.     public void doGet(HttpServletRequest req, HttpServletResponse resp)
  14.             throws ServletException, IOException {
  15.         doPost(req, resp);
  16.     }
  17.     public void doPost(HttpServletRequest req, HttpServletResponse resp)
  18.             throws ServletException, IOException {
  19.         
  20.         WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
  21.         Workflow workflow = (Workflow)context.getBean("workflow");
  22.         String workflowId = req.getParameter("workflowId");
  23.         String actionId = req.getParameter("actionId");
  24.         Leave leave = new Leave();
  25.         leave.allow(workflow, Long.parseLong(workflowId), Integer.parseInt(actionId));
  26.         
  27.         resp.sendRedirect("completed.jsp");
  28.     }
  29. }

LeaveAction.java

  1. package tw.idv.idealist.actions;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.springframework.web.context.WebApplicationContext;
  8. import org.springframework.web.context.support.WebApplicationContextUtils;
  9. import com.opensymphony.workflow.Workflow;
  10. import tw.idv.idealist.Leave;
  11. public class LeaveAction extends HttpServlet {
  12.     private static final long serialVersionUID = 1376955339587565809L;
  13.     public void doGet(HttpServletRequest req, HttpServletResponse resp)
  14.             throws ServletException, IOException {
  15.         doPost(req, resp);
  16.     }
  17.     public void doPost(HttpServletRequest req, HttpServletResponse resp)
  18.             throws ServletException, IOException {
  19.         
  20.         WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
  21.         Workflow workflow = (Workflow)context.getBean("workflow");
  22.         Leave leave = new Leave();
  23.         //String employee = req.getParameter("employee");
  24.         long workflowId = leave.send(workflow);
  25.         resp.sendRedirect("allow.jsp?workflowId=" + workflowId);
  26.     }
  27. }

Leave.java

  1. package tw.idv.idealist;
  2. import com.opensymphony.workflow.InvalidActionException;
  3. import com.opensymphony.workflow.InvalidEntryStateException;
  4. import com.opensymphony.workflow.InvalidInputException;
  5. import com.opensymphony.workflow.InvalidRoleException;
  6. import com.opensymphony.workflow.Workflow;
  7. import com.opensymphony.workflow.WorkflowException;
  8. public class Leave {
  9.     public long send(Workflow workflow) {
  10.         long workflowId = -1;
  11.         try {
  12.             workflowId = workflow.initialize("leave"0null); 
  13.             workflow.doAction(workflowId, 1null);
  14.         } catch (InvalidActionException e) {
  15.             e.printStackTrace();
  16.         } catch (InvalidRoleException e) {
  17.             e.printStackTrace();
  18.         } catch (InvalidInputException e) {
  19.             e.printStackTrace();
  20.         } catch (InvalidEntryStateException e) {
  21.             e.printStackTrace();
  22.         } catch (WorkflowException e) {
  23.             e.printStackTrace();
  24.         }
  25.         return workflowId;
  26.     }
  27.     
  28.     public void allow(Workflow workflow, long workflowId, int actionId) {
  29.         try {
  30.             workflow.doAction(workflowId, actionId, null);
  31.         } catch (InvalidInputException e) {
  32.             e.printStackTrace();
  33.         } catch (WorkflowException e) {
  34.             e.printStackTrace();
  35.         }
  36.         catch (InvalidActionException e) {
  37.             e.printStackTrace();
  38.         }
  39.     }   
  40. }

Query.java

  1. package tw.idv.idealist;
  2. import java.util.List;
  3. import javax.servlet.ServletContext;
  4. import org.hibernate.SessionFactory;
  5. import org.springframework.web.context.WebApplicationContext;
  6. import org.springframework.web.context.support.WebApplicationContextUtils;
  7. import com.opensymphony.workflow.StoreException;
  8. import com.opensymphony.workflow.query.FieldExpression;
  9. import com.opensymphony.workflow.query.WorkflowExpressionQuery;
  10. import com.opensymphony.workflow.spi.WorkflowEntry;
  11. import com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore;
  12. public class Query extends SpringHibernateWorkflowStore{
  13.     public Query(ServletContext sc) {
  14.         
  15.         WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
  16.         SessionFactory sf = (SessionFactory)context.getBean("sessionFactory");
  17.         setSessionFactory(sf);
  18.     }
  19.     
  20.     public List<?> getCompleted() {
  21.         
  22.         FieldExpression fe = new FieldExpression(FieldExpression.STATE,
  23.                 FieldExpression.ENTRY, FieldExpression.EQUALS, new Integer(
  24.                         WorkflowEntry.COMPLETED));
  25.         List<?> list = null;
  26.         try {
  27.             list = query(new WorkflowExpressionQuery(fe));
  28.         } catch (StoreException e) {
  29.             e.printStackTrace();
  30.         }
  31.         return list;
  32.     }
  33. }

leave.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN" 
  3. "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
  4. <workflow>
  5.     <initial-actions>
  6.         <action id="0" name="开始">
  7.             <results>
  8.                 <unconditional-result old-status="Finished"
  9.                     status="Queued" step="1" />
  10.             </results>
  11.         </action>
  12.     </initial-actions>
  13.     <steps>
  14.         <step id="1" name="填假单">
  15.             <actions>
  16.                 <action id="1" name="送出">
  17.                     <pre-functions>
  18.                         <function type="class">
  19.                             <arg name="class.name">
  20.                                 com.opensymphony.workflow.util.Caller
  21.                             </arg>
  22.                         </function>
  23.                     </pre-functions>
  24.                     <results>
  25.                         <unconditional-result old-status="Finished"
  26.                             status="Queued" step="2" owner="User100" />
  27.                     </results>
  28.                 </action>
  29.             </actions>
  30.         </step>
  31.         <step id="2" name="批假单">
  32.             <actions>
  33.                 <action id="2" name="准许">
  34.                     <pre-functions>
  35.                         <function type="class">
  36.                             <arg name="class.name">
  37.                                 com.opensymphony.workflow.util.Caller
  38.                             </arg>
  39.                         </function>
  40.                     </pre-functions>
  41.                     <results>
  42.                         <unconditional-result old-status="Finished"
  43.                             status="Queued" step="3" owner="${caller}" />
  44.                     </results>
  45.                 </action>
  46.                 <action id="3" name="驳回">
  47.                     <pre-functions>
  48.                         <function type="class">
  49.                             <arg name="class.name">
  50.                                 com.opensymphony.workflow.util.Caller
  51.                             </arg>
  52.                         </function>
  53.                     </pre-functions>
  54.                     <results>
  55.                         <unconditional-result old-status="Finished"
  56.                             status="Queued" step="1" owner="${caller}" />
  57.                     </results>
  58.                 </action>
  59.             </actions>
  60.         </step>
  61.         <step id="3" name="停止" />
  62.     </steps>
  63. </workflow>

workflows.xml

  1. <workflows>
  2.     <workflow name="leave" type="resource" location="leave.xml" />
  3. </workflows>

applicationContext.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xmlns:aop="http://www.springframework.org/schema/aop"
  5.     xmlns:tx="http://www.springframework.org/schema/tx"
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  7.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
  8.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
  9.     <bean id="propertyConfigurer"
  10.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  11.         <property name="location">
  12.             <value>/WEB-INF/jdbc.properties</value>
  13.         </property>
  14.     </bean>
  15.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  16.         <property name="driverClassName">
  17.             <value>${jdbc.driverClassName}</value>
  18.         </property>
  19.         <property name="url">
  20.             <value>${jdbc.url}</value>
  21.         </property>
  22.         <property name="username">
  23.             <value>${jdbc.username}</value>
  24.         </property>
  25.         <property name="password">
  26.             <value>${jdbc.password}</value>
  27.         </property>
  28.         <property name="maxWait">
  29.             <value>${jdbc.maxWait}</value>
  30.         </property>
  31.         <property name="removeAbandoned">
  32.             <value>${jdbc.removeAbandoned}</value>
  33.         </property>
  34.         <property name="removeAbandonedTimeout">
  35.             <value>${jdbc.removeAbandonedTimeout}</value>
  36.         </property>
  37.         <property name="logAbandoned">
  38.             <value>${jdbc.logAbandoned}</value>
  39.         </property>
  40.     </bean>
  41.     
  42.     <bean id="sessionFactory"
  43.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  44.         <property name="dataSource">
  45.             <ref bean="dataSource" />
  46.         </property>
  47.         <property name="mappingResources">
  48.             <list>
  49.                 <value>com/opensymphony/workflow/spi/hibernate/HibernateCurrentStep.hbm.xml</value>
  50.                 <value>com/opensymphony/workflow/spi/hibernate/HibernateHistoryStep.hbm.xml</value>
  51.                 <value>com/opensymphony/workflow/spi/hibernate/HibernateWorkflowEntry.hbm.xml</value>
  52.             </list>
  53.         </property>
  54.         <property name="hibernateProperties">
  55.             <props>
  56.                 <prop key="hibernate.dialect">
  57.                     ${hibernate.dialect}
  58.                 </prop>
  59.                 <prop key="hibernate.show_sql">
  60.                     ${hibernate.show_sql}
  61.                 </prop>
  62.                 <prop key="hibernate.jdbc.batch_size">
  63.                     ${hibernate.jdbc.batch_size}
  64.                 </prop>
  65.                 <prop key="hibernate.generate_statistics">
  66.                     ${hibernate.generate_statistics}
  67.                 </prop>
  68.                 <prop key="hibernate.hbm2ddl.auto">
  69.                     ${hibernate.hbm2ddl.auto}
  70.                 </prop>
  71.             </props>
  72.         </property>
  73.         <property name="eventListeners">
  74.             <map>
  75.                 <entry key="merge">
  76.                     <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
  77.                 </entry>
  78.             </map>
  79.         </property>
  80.     </bean>
  81.   
  82.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  83.         <property name="sessionFactory">
  84.             <ref local="sessionFactory" />
  85.         </property>
  86.     </bean>
  87.     <bean id="workflowStore" class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore">
  88.         <property name="sessionFactory"><ref local="sessionFactory"/></property>
  89.         <property name="propertySetDelegate">
  90.             <bean id="propertySetDelegate" class="com.opensymphony.workflow.util.PropertySetDelegateImpl"/>
  91.         </property>
  92.     </bean>
  93.     
  94.     <bean id="workflowTypeResolver" class="com.opensymphony.workflow.util.SpringTypeResolver"/>
  95.     
  96.     <bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init">
  97.         <property name="resource"><value>workflows.xml</value></property>
  98.         <property name="reload"><value>false</value></property>
  99.     </bean>
  100.     
  101.     <bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration">
  102.         <property name="store"><ref local="workflowStore"/></property>
  103.         <property name="factory"><ref local="workflowFactory"/></property>      
  104.     </bean>
  105.     
  106.     <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
  107.         <property name="transactionManager"><ref local="transactionManager"/></property>
  108.         <property name="transactionAttributes">
  109.             <props>
  110.                 <prop key="*">PROPAGATION_REQUIRED</prop>
  111.             </props>
  112.         </property>
  113.     </bean>
  114.     <bean id="workflow" class="org.springframework.aop.framework.ProxyFactoryBean">
  115.         <property name="proxyInterfaces">
  116.             <value>com.opensymphony.workflow.Workflow</value>
  117.         </property>
  118.         <property name="interceptorNames">
  119.             <list>
  120.                 <value>transactionInterceptor</value>
  121.                 <value>workflowTarget</value>
  122.             </list>
  123.         </property>
  124.     </bean>
  125.     <bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow">
  126.         <constructor-arg><value>shenbin</value></constructor-arg>
  127.         <property name="configuration"><ref local="osworkflowConfiguration"/></property>    
  128.     </bean>
  129. </beans>

jdbc.properties

  1. #DataSource
  2. jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
  3. jdbcjdbc.url=jdbc:jtds:sqlserver://localhost:1433/OSWorkflow
  4. jdbc.username=sa
  5. jdbc.password=sa
  6. jdbc.maxWait=10000
  7. jdbc.removeAbandoned=true
  8. jdbc.removeAbandonedTimeout=10000
  9. jdbc.logAbandoned=true
  10. #Hibernate
  11. hibernate.dialect=org.hibernate.dialect.SQLServerDialect
  12. hibernate.show_sql=false
  13. hibernate.jdbc.batch_size=20
  14. hibernate.generate_statistics=true
  15. hibernate.hbm2ddl.auto=create-drop

log4j.properties

  1. #Log4j
  2. log4j.rootLogger=ERROR, stdout
  3. log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  5. log4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n
  6. log4j.logger.org.hibernate.cache=DEBUG

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4" 
  3.     xmlns="http://java.sun.com/xml/ns/j2ee" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  7.     <context-param>
  8.         <param-name>log4jConfigLocation</param-name>
  9.         <param-value>/WEB-INF/log4j.properties</param-value>
  10.     </context-param>
  11.     <context-param>
  12.         <param-name>contextConfigLocation</param-name>
  13.         <param-value>
  14.             /WEB-INF/applicationContext.xml
  15.         </param-value>
  16.     </context-param>
  17.     <listener>
  18.         <listener-class>
  19.             org.springframework.web.context.ContextLoaderListener
  20.         </listener-class>
  21.     </listener>
  22.     <listener>
  23.         <listener-class>
  24.             org.springframework.web.util.Log4jConfigListener
  25.         </listener-class>
  26.     </listener>
  27.     <servlet>
  28.         <servlet-name>LeaveAction</servlet-name>
  29.         <servlet-class>
  30.             tw.idv.idealist.actions.LeaveAction
  31.         </servlet-class>
  32.     </servlet>
  33.     <servlet-mapping>
  34.         <servlet-name>LeaveAction</servlet-name>
  35.         <url-pattern>/LeaveAction</url-pattern>
  36.     </servlet-mapping>
  37.     <servlet>
  38.         <servlet-name>AllowAction</servlet-name>
  39.         <servlet-class>
  40.             tw.idv.idealist.actions.AllowAction
  41.         </servlet-class>
  42.     </servlet>
  43.     <servlet-mapping>
  44.         <servlet-name>AllowAction</servlet-name>
  45.         <url-pattern>/AllowAction</url-pattern>
  46.     </servlet-mapping>
  47.     <welcome-file-list>
  48.         <welcome-file>leave.jsp</welcome-file>
  49.     </welcome-file-list>
  50. </web-app>

allow.jsp

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <%@ page language="java" contentType="text/html; charset=GBK" 
  5. pageEncoding="GBK" %>
  6. <META http-equiv="Content-Type" content="text/html; charset=GBK">
  7. <META http-equiv="Content-Style-Type" content="text/css">
  8. <TITLE>批准假单</TITLE>
  9. <Script Language="JavaScript">
  10. function DoAction(actionId) {
  11.     document.myForm.actionId.value = actionId;
  12.     document.myForm.submit();
  13. }
  14. </Script>
  15. </HEAD>
  16. <BODY>
  17. <%
  18. String workflowId = request.getParameter("workflowId");
  19. %>
  20. <P>主管批假单</P>
  21. <form action="AllowAction" name="myForm">
  22.     <input type="hidden" name="actionId" value="">
  23.     工作流编号: <input type="text" name="workflowId" value=<%= workflowId %>>
  24. <input type="button" value="准许" OnClick="DoAction(2)"> 
  25. <input type="button" value="驳回" OnClick="DoAction(3)">
  26. </form>
  27. </BODY>
  28. </HTML>

completed.jsp

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>
  5. <%@ page import="tw.idv.idealist.*" %>
  6. <%@ page import="java.util.*" %>
  7. <META http-equiv="Content-Type" content="text/html; charset=GBK">
  8. <META http-equiv="Content-Style-Type" content="text/css">
  9. <TITLE>completed.jsp</TITLE>
  10. </HEAD>
  11. <BODY>
  12. 已经完成的工作流程编号:<br>
  13. <%
  14. Query query = new Query(pageContext.getServletContext());
  15. List completed = query.getCompleted();
  16. for(int i=0; i<completed.size(); i++) {
  17.     Long wfId = (Long) completed.get(i);
  18.     out.println("workflow id => " + wfId + "<br>"); 
  19. }
  20. %>
  21. </BODY>
  22. </HTML>

leave.jsp

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <HTML>
  3. <HEAD>
  4. <%@ page language="java" contentType="text/html; charset=GBK" 
  5. pageEncoding="GBK" %>
  6. <%@ page import="tw.idv.idealist.*" %>
  7. <META http-equiv="Content-Type" content="text/html; charset=GBK">
  8. <META http-equiv="Content-Style-Type" content="text/css">
  9. <TITLE>填写假单</TITLE>
  10. </HEAD>
  11. <BODY>
  12. <P>员工请假</P>
  13. <form action="LeaveAction">
  14.     员工代号: <input type="text" name="employee"> 
  15.         <input type="submit" value="送出">
  16. </form>
  17. </BODY>
  18. </HTML>

配置好环境后启动Tomcat即可访问上诉例子。注意在MSSQL2000中建立一个名为OSWorkflow的数据库。表结构将有Hibernte 在每次启动时自行建立,不需要手工建立的。

 

更多资料:

http://blog.csdn.net/shipatrioc/archive/2006/06/29/852424.aspx

http://www.blogjava.net/pdw2009/archive/2006/04/18/41658.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值