`
friping
  • 浏览: 133852 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

OSWorkflow的第一支程式

阅读更多
OSWorkflow的第一支程式
(史帝芬, 2005/6/4, hi.steven@gmail.com) 

自从C的圣经版以Hello World程式开始引导初学者学习程式语言以来,多数的程式语言入门书也都如法刨制。 OSWorkflow没办法写出那种一目了然的程式,但是我仍尽量将程式简化,希望初学者能在看完这第一支程式后,就能有所体会。接下来将讲解如何写出第一支OSWorkflow程式!



jar file
將以下jar file放置到WEB-INF/lib底下…
activation.jar
bsh-1.2b7.jar
commons-logging.jar
designer.jar
mail.jar
oscore-2.2.2.jar
osuser-1.0-dev-3Dec03.jar
osworkflow-2.7.0.jar
propertyset-1.3-21Apr04.jar
quartz.jar
這些jar file可以在OSWorkflow提供的example裡找到。

建立資料庫
在SQL Server中建立一資料庫,名稱可自取,這裡取名OSWorkflow,然後執行%OSWorkflow%/src/etc/deployment/jdbc/mssql.sql,建立OSWorkflow所需的Table。
然後在Tomcat設定DataSource取名jdbc/DefaultDS並指向資料庫OSWorkflow,方法可參考Connection Pool (2)。
接下來將以下內容放入osworkflow.xml,並將osworkflow.xml放置在WEB-INF/classes底下。

<osworkflow>
<!--
<persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
-->
<persistence class="com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore">

<property key="datasource" value="jdbc/DefaultDS"/>
<property key="entry.sequence"
                      value="select count(*) + 1 from os_wfentry"/>
<property key="entry.table" value="OS_WFENTRY"/>
<property key="entry.id" value="ID"/>
<property key="entry.name" value="NAME"/>
<property key="entry.state" value="STATE"/>
<property key="step.sequence"
value="select sum(c1) + 1 from (select 1 as tb, count(*) as c1
       from os_currentstep union
       select 2 as tb, count(*) as c1 from os_historystep) as TabelaFinal"/>
<property key="history.table" value="OS_HISTORYSTEP"/>
<property key="current.table" value="OS_CURRENTSTEP"/>
<property key="historyPrev.table" value="OS_HISTORYSTEP_PREV"/>
<property key="currentPrev.table" value="OS_CURRENTSTEP_PREV"/>
<property key="step.id" value="ID"/>
<property key="step.entryId" value="ENTRY_ID"/>
<property key="step.stepId" value="STEP_ID"/>
<property key="step.actionId" value="ACTION_ID"/>
<property key="step.owner" value="OWNER"/>
<property key="step.caller" value="CALLER"/>
<property key="step.startDate" value="START_DATE"/>
<property key="step.finishDate" value="FINISH_DATE"/>
<property key="step.dueDate" value="DUE_DATE"/>
<property key="step.status" value="STATUS"/>
<property key="step.previousId" value="PREVIOUS_ID"/>
</persistence>

    <factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
        <property key="resource" value="workflows.xml" />
    </factory>
</osworkflow>

建立流程
建立一個命名為leave.xml的檔案,並將它放入WEB-INF/classes底下,檔名可自取,這個檔案就是記載流程的檔案。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"
"http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
<workflow>
  <initial-actions>
   <action id="0" name="開始">
      <results>
        <unconditional-result old-status="Finished" status="Queued" step="1" />
      </results>
    </action>
  </initial-actions>

  <steps>
    <step id="1" name="填假單">
      <actions>
        <action id="1" name="送出">
  <pre-functions>
    <function type="class">
      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
  </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued"
step="2"  owner="User100" />
          </results>
        </action>
      </actions>
    </step>

    <step id="2" name="批假單">
      <actions>
        <action id="2" name="准許">
  <pre-functions>
    <function type="class">
      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
  </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued"
step="3"  owner="${caller}"/>
          </results>
        </action>

        <action id="3" name="駁回">
  <pre-functions>
    <function type="class">
      <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>
    </function>
  </pre-functions>
          <results>
            <unconditional-result old-status="Finished" status="Queued"
step="1"  owner="${caller}"/>
          </results>
        </action>
      </actions>     
    </step>

    <step id="3" name="停止" />
  </steps>
</workflow>
接著在workflows.xml中加入如下的設定,即可讓系統於啟動後載入請假的流程,workflows.xml也放至WEB-INF/classes。

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

程式
這裡將建立兩個網頁分別給員工和主管使用,另外有兩個servlet及一個類別作為趨動流程。
    Leave.java

package tw.idv.idealist;

import com.opensymphony.workflow.InvalidActionException;
import com.opensymphony.workflow.InvalidEntryStateException;
import com.opensymphony.workflow.InvalidInputException;
import com.opensymphony.workflow.InvalidRoleException;
import com.opensymphony.workflow.Workflow;
import com.opensymphony.workflow.WorkflowException;
import com.opensymphony.workflow.basic.BasicWorkflow;
import com.opensymphony.workflow.config.DefaultConfiguration;
import com.opensymphony.workflow.spi.Step;

/**
* 請假流程
* @author steven
*/
public class Leave {
/**
* 送出假單
*/
public long send(String employee) {
Workflow workflow = new BasicWorkflow(employee);
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
long workflowId = -1;
try {
//leave是workflowx.xml中定的名稱
workflowId = workflow.initialize("leave", 0, null);
workflow.doAction(workflowId, 1, null);
} catch (InvalidActionException e) {
e.printStackTrace();
} catch (InvalidRoleException e) {
e.printStackTrace();
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (InvalidEntryStateException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}

return workflowId;
}

/**
* 准假假單
* @param workflowId 工作流編號
* @param actionId 動作編號, 2 准許, 3 駁回
*/
public void allow(long workflowId, int actionId) {
Workflow workflow = new BasicWorkflow("manager1");
DefaultConfiguration config = new DefaultConfiguration();
workflow.setConfiguration(config);
try {
workflow.doAction(workflowId, actionId, null);
} catch (InvalidInputException e) {
e.printStackTrace();
} catch (WorkflowException e) {
e.printStackTrace();
}
catch (InvalidActionException e) {
e.printStackTrace();
}
}
}
    LeaveAction.java (servlet)

package tw.idv.idealist.actions;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tw.idv.idealist.Leave;

/**
* @author Steven
*/
public class LeaveAction extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Leave leave = new Leave();
String employee = req.getParameter("employee");
long workflowId = leave.send(employee);
resp.sendRedirect("allow.jsp?workflowId=" + workflowId);
}

}
    AllowAction.java (servlet)

package tw.idv.idealist.actions;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tw.idv.idealist.Leave;

/**
* @author Steven
*/
public class AllowAction extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}

public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String workflowId = req.getParameter("workflowId");
String actionId = req.getParameter("actionId");
Leave leave = new Leave();
leave.allow(Long.parseLong(workflowId), Integer.parseInt(actionId));
}

}
    leave.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
<HEAD>
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5" %>
<%@ page import="tw.idv.idealist.*" %>

<META http-equiv="Content-Type" content="text/html; charset=BIG5">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>填寫假單</TITLE>
</HEAD>
<BODY>
<P>員工請假</P>

<form action="LeaveAction">
員工代號: <input type="text" name="employee">&nbsp;
        <input type="submit" value="送出">
</form>

</BODY>
</HTML>

    allow.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<HTML>
<HEAD>
<%@ page language="java" contentType="text/html; charset=BIG5"
pageEncoding="BIG5" %>

<META http-equiv="Content-Type" content="text/html; charset=BIG5">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>批准假單</TITLE>
<Script Language="JavaScript">
function DoAction(actionId) {
document.myForm.actionId.value = actionId;
document.myForm.submit();
}
</Script>
</HEAD>
<BODY>

<%
String workflowId = request.getParameter("workflowId");
%>

<P>主管批假單</P>
<form action="AllowAction" name="myForm">
<input type="hidden" name="actionId" value="">
工作流編號: <input type="text" name="workflowId" value=<%= workflowId %>>
<input type="button" value="准許" OnClick="DoAction(2)">&nbsp;
<input type="button" value="駁回" OnClick="DoAction(3)">
</form>

</BODY>
</HTML>

測試
啟動Tomcat,並執行leave.jsp,按"送出"後,假單即送出,接著會出現allow.jsp的網頁供主管簽核,主管按"淮許"後,請假流程即完成,記得在執行過程中多觀察資料庫中資料的變化。





  • 大小: 13 KB
  • 大小: 17.2 KB
  • 大小: 19.3 KB
分享到:
评论
2 楼 friping 2010-12-27  
呵呵, 有关工作流都是转载的,用作学习的
1 楼 zhou363667565 2010-12-19  
写的还不错..简单明了..楼主,能把源码发出来,那就更好了。

相关推荐

    OSWorkflow

    OSWorkflow

    OSWorkFlow

    1. 工作流模型:OSWorkFlow使用XML来定义工作流模型,包括任务(Task)、状态(State)、转换(Transition)等元素,这些元素共同构成了一个完整的工作流程。 2. 实例(Instance):当一个工作流模型被实例化后,就...

    OSWorkFlow分析

    OSWorkflow沒辦法寫出那種一目瞭然的程式,但是我仍盡量將程式簡化,希望初學者能在看完這第一支程式後, 就能有所體會

    osworkflow

    1. **流程定义**:osWorkflow 提供了一个XML格式的流程定义语言,允许开发者以声明式的方式定义流程。每个流程可以包含多个状态(steps)和转换条件,以及相关的操作(actions)。 2. **流程实例管理**:系统能够...

    OSWorkflow中文手册 OSWorkflow中文手册

    OSWorkflow是一款开源的工作流引擎,主要用于管理应用程序中的复杂业务流程。这款工具提供了强大的工作流建模、执行和跟踪功能,让开发者能够灵活地定义和控制应用程序的流程逻辑。本手册是OSWorkflow的中文版,旨在...

    osworkflow_bundle2

    1. **工作流定义**:OSWorkflow 提供了一种基于 XML 的方式来定义工作流。工作流定义包括了任务、状态转换、参与者分配等,使得业务流程能够以声明式的方式进行配置。 2. **工作流实例**:在运行时,OSWorkflow 将...

    OSWorkflow2.8 API文档

    OSWorkflow 2.8 API 文档

    osworkflow中文入门指南,osworkflow+hibernate+spring集成配置,osworkflow-2.8.0.jar

    **osworkflow** 是一个开源的工作流管理系统,专为Java应用程序设计,用于管理复杂的工作流程。在本入门指南中,我们将深入探讨如何使用osworkflow,并将其与流行的数据持久化框架Hibernate和依赖注入容器Spring进行...

    Osworkflow10份资料

    JPetStoreOSGI.rar Mytestworkflow.rar Osworkflow持久化.doc Osworkflow的介绍.doc osworkflow配置与demo.rar osworkflow中文开发指南.rar OSWorkflow中文手册OSWorkflow-chinese-...用osworkflow写一个请假例子.rar

    OSWorkflow源码及电子书

    1. **入门教程**:介绍如何安装和配置OSWorkflow,以及如何创建第一个工作流实例。 2. **API参考**:详细说明了OSWorkflow的各个类和接口,帮助开发者理解和使用API进行开发。 3. **最佳实践**:提供一些实际案例和...

    osworkflow2.8

    OSWorkflow 是一个开源的工作流引擎,它允许开发者在应用程序中实现复杂的业务流程管理。这个"osworkflow2.8"版本是OSWorkflow的一个特定发行版,包含了一整套用于设计、执行和管理工作流程的工具和资源。下面我们将...

    osworkflow学习笔记

    通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!

    OsWorkflow工作流实例

    OsWorkflow是一款开源的工作流引擎,它为应用程序提供了一种灵活且可扩展的方式来管理业务流程。在本实例中,我们将深入探讨OsWorkflow的核心概念、主要功能以及如何创建和测试一个工作流实例。 工作流引擎是软件...

    osworkflow2.8.pdf

    #### 一、OSWorkflow 简介与特性 **OSWorkflow** 是一款灵活的工作流管理工具,适用于需要高度定制化流程的应用场景。它与大多数商用或开源工作流软件的不同之处在于其高度的灵活性。 - **特点**:OSWorkflow 的...

    OsWorkflow

    OsWorkflow 是一个基于Java的工作流引擎,主要用于设计和执行复杂的业务流程。这个项目是一个请假申请的工作流示例,其中流程的定义完全存储在XML文件中,这样可以方便地进行流程的配置和更改,无需修改源代码。对于...

    Osworkflow 入门级例子

    Osworkflow 是一个开源的工作流引擎,它为应用程序提供了一种灵活的方式来管理业务流程。这个入门级的例子将带你了解 Osworkflow2.8 的基本概念和如何在项目中简单地实现工作流。 Osworkflow 提供了一个强大的框架...

    osworkflow指导文档 + 源码

    1. **流程启动(Start Workflow)**:应用启动流程时,osWorkflow 会根据流程定义创建一个新的实例。 2. **步骤执行(Execute Step)**:osWorkflow 根据当前状态和转移条件执行相应的步骤。 3. **状态变迁(State...

    OSWORKFlow流程开发教程

    - **开源项目背景**:OSWorkflow作为OpenSymphony组织的一员,致力于提供一个简单高效的工作流引擎解决方案,适用于各种业务流程自动化需求。它支持动态流程设计,允许在运行时更改流程逻辑,并能与多种数据存储技术...

Global site tag (gtag.js) - Google Analytics