`
Jeenry119
  • 浏览: 67594 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

osworkflow 学习笔记

阅读更多

osworkflow学习笔记-简单总结补充

 

博客分类:

Workflow工作XML框架

在网上看到的一篇文章,不知出处,太适合做为我前几个笔记的总结和补充了

 

Osworkflow定义工作流是通过一个XML文件来完成的,你可以把它取成任何你想要的名字。大致框架如下:

<?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>

    ...

  </initial-actions>

  <steps>

    ...

  </steps>

</workflow>

都是按照标准xml指定。通过指定的dtd来校验xml文件。一般需要辅助工具如xmlspy来自动校验xml文件里的错误,这样会方便大家检测xml文件中的错误。

Stepactions

理解这个xml文件的第一个重点在于理解stepactions的在工作流系统中的概念。一个step就是这样的一个概念:一个工作流中所处的不同位置。如在一个文档治理系统中。可以是起草、编辑阶段、发布等等。

Actions指定不同step中的变迁。还是用例子来理解更为形象一些。在一个文档治理系统当中如在第一个起草中的开始第一个起草结束第一个起草就是actions

Initial actions 是一个action的非凡类型。在工作流开始时候,是没有状态的,也没有任何step。用户必须利用某个action来开始流程,这个用来开始工作流的action就被指定为initial-actions

例如,我们假定我们只有一个initial-action,非常简单,如下面:

<action id="1" name="Start Workflow">

  <results>

    <unconditional-result old-status="Finished" status="Queued" step="1"/>

  </results>

</action>

 

这个action是个action的最简单的例子。他只是简单定义我们需要走想的step

 

工作流status

Status用来描述特定step中的一个工作流的状态。如在文档治理系统当中,我们的第一次起草”step可以有两个statuses“underway”“queued”

“queued”来指示此条已经在“first draft”中排队。没有安排谁来处理此文档,但是已经发出请求。而“underway”是指示一个作者已经从队列中取出此文档并且或许已经上锁。表明正在first draft上工作。

 

Step实例:在这个例子中有两个actions。第一个action(开始第一个起草)是在一个step中进行。但是,更改状态为underway,第二个action是工作流流转到下一个step,我们假定下一个工作流step“finish”

<step id="1" name="First Draft">

  <actions>

    <action id="1" name="Start First Draft">

      <results>

        <unconditional-result old-status="Finished" status="Underway" step="1"/>

      </results>

    </action>

    <action id="2" name="Finish First Draft">

      <results>

        <unconditional-result old-status="Finished" status="Queued" step="2"/>

      </results>

    </action>

  </actions>

</step>

<step id="2" name="finished" />

Old-status这个属性用来指示对于当前state(结束)将要进入哪个history table。在绝大多数情况下,被写为“finished”

Conditions

Osworkflow有一些内建的conditon。请参看Javadocs,假如需要一个特定的conditionCondition可以接收参数。如本例就接收了一个参数“status”用来指定status

 

<action id="1" name="Start First Draft">

  <restrict-to>

    <conditions>

      <condition type="class">

        <arg name="class.name">

          com.opensymphony.workflow.util.StatusCondition

        </arg>

        <arg name="status">Queued</arg>

      </condition>

    </conditions>

  </restrict-to>

  <results>

    <unconditional-result old-status="Finished" status="Underway" step="1"/>

  </results>

</action>

 

这样就能保证在initial action被调用后才可以正确执行。因为它需要确信当前status“queued”

 

Functions

接下来,假如我们希望指定一个用户开始first draft,他们变为“owner”为了达到这样的目的,我们需要这样做:

1、在当前context中防止一个“caller”变量

2  设置result“owner”属性为call变量。

functionosworkflow的一个非常强大的特征,一个function基本上是一个系列在工作流变迁之间执行的工作,并不影响工作流本身。例如,你能够有个sendmail功能,它的职责就是当一个特定的变迁发生后发送邮件通知。

Functions能够给当前context添加变量。可以在其他functions或者scripts中使用。

Osworkflow 有自己内建function。其中一个比较有用的就是“caller”。这个function的作用就是通过查找当前的能够调用工作流的用户,把该用户以字符串形式命名为caller变量的值。

<action id="1" name="Start First Draft">

  <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="Underway"

                                       step="1" owner="${caller}"/>

  </results>

</action>

 

 

整合后的结果:

 

<action id="1" name="Start First Draft">

  <restrict-to>

    <conditions>

      <condition type="class">

        <arg name="class.name">

                com.opensymphony.workflow.util.StatusCondition

        </arg>

        <arg name="status">Queued</arg>

      </condition>

    </conditions>

  </restrict-to>

  <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="Underway"

                                       step="1"  owner="${caller}"/>

  </results>

</action>

 

<action id="2" name="Finish First Draft">

  <restrict-to>

    <conditions type="AND">

      <condition type="class">

        <arg

        name="class.name">com.opensymphony.workflow.util.StatusCondition

        </arg>

        <arg name="status">Underway</arg>

      </condition>

      <condition type="class">

        <arg name="class.name">

              com.opensymphony.workflow.util.AllowOwNeronlyCondition

       </arg>

      </condition>

    </conditions>

  </restrict-to>

  <results>

    <unconditional-result old-status="Finished" status="Queued" step="2"/>

  </results>

</action>

 

2010-09-02

缩略显示

osworkflow学习笔记-标签<initial-actions><restrict-to>beanshellclass

博客分类:

Workflow脚本工作XMLBlog

关键字:osworkflow 入门教程, 初体验,环境搭建,示例,笔记,用法,标签 含义 释义。。。。。。

 

打开osworkflow-2.8.0\src\webapp\WEB-INF\classes\example.xml

看看这些的标签:

Xml代码

1.       <initial-actions>  

2.               <action id="100" name="Start Workflow">  

3.                   <restrict-to>  

4.                       <conditions type="AND">  

5.                           <condition type="beanshell">  

6.                               <arg name="script">true</arg>  

7.                           </condition>  

8.                           <condition type="class">  

9.                               <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>  

10.                           <arg name="group">foos</arg>  

11.                       </condition>  

12.                   </conditions>  

13.               </restrict-to>  

14.               <pre-functions>  

15.                   <function type="class">  

16.                       <arg name="class.name">com.opensymphony.workflow.util.Caller</arg>  

17.                   </function>  

18.               </pre-functions>  

19.               <results>  

20.                   <unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>  

21.               </results>  

22.           </action>  

23.       </initial-actions>  

<initial-actions>

                               <action id="100" name="Start Workflow">

                                              <restrict-to>

                                                             <conditions type="AND">

                                                                            <condition type="beanshell">

                                                                                            <arg name="script">true</arg>

                                                                            </condition>

                                                                            <condition type="class">

                                                                                            <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>

                                                                                            <arg name="group">foos</arg>

                                                                            </condition>

                                                             </conditions>

                                              </restrict-to>

                                              <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="Underway" step="1" owner="${caller}"/>

                                              </results>

                               </action>

               </initial-actions>

 

1  initial-actions 一组初始动作,在工作流实例被赋予任何状态之前执行,每個流程都至少需定義一個initial-actions,這是流程的起點,初始化步骤是一种特殊类型的步骤,它用来启动工作流。在一个工作流程开始前,它是没有状态,不处在任何一个步骤,用户必须采取某些动作才能开始这个流程。这些特殊步骤被定义在 <initial-actions>

可以用来定义通用动作(common action)和全局动作(global action)

我们再看看example.xml initial-actions里干了啥:

首先定义了一个约束restrict-to,约束里有两个AND 关系的条件,然后用pre-funcitons取出当前用户名,传给step1

 

2 condition type="beanshell"

beanshell 表达式范围内中始终存在三个变量,entrycontextstoreentry变量是一个实现了com.opensymphony.workflow.spi.WorkflowEntry接口的对象,它代表workflow实例。context变量是com.opensymphony.workflow.WorkflowContext类型的对象,它允许BeanShell方法回滚事务或决定调用者的名字。store变量是com.opensymphony.workflow.WorkflowStore类型的对象,它允许方法访问workflow底层的持久化存储区。

另外beanshell 是一种脚本语言,一种完全符合java语法的java脚本语言

我们再看看example.xml beanshell 里干了啥: 直接返回true,啥也没干,这里应该可以做一些稍复杂的判断

 

3  condition type="class" :能够调用一些实现了com.opensymphony.workflow.FunctionProvider接口的 外部类,这个接口只有一个方法——execute,这个方法有三个参数transientVars, argspropertySet可用 ,通过这三个参数能获取或编辑当前工作流里的很多信息。

<condition type="class">
       <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
       <arg name="group">foos</arg>
</condition>

这是一个条件语句,意思是:判断当前执行改流程的用户在不在group组(foos是组的名字)中,是执行什么流程,不是执行什么流程。

 

参考:http://baixiaozhe.iteye.com/blog/753603 关于权限

         http://baixiaozhe.iteye.com/blog/753587关于class

 

4 <pre-functions> 在事情发生之前执行的函数和它相对应是post-functions就是在事情发生以后执行的。

    这里是获取到当前用户名,并放到临时变量caller中。

5 unconditional-result

对于每一个动作,都需要存在一个无条件结果,叫做unconditional-result。这个结果只不过是一些指令,告诉OSWorkflow下一步要做什么。这一结果让组成工作流的状态机从一个状态流转到下一个状态。

 

<unconditional-result old-status="Finished" status="Underway" step="1" owner="${caller}"/>

大概意思就是这一步已经完事,已经不在是当前动作了 ,所以上一步 的状态为Finished 当前流程 状态为"办理中"Underway,现在已经到step1去了,带过去的参数是ower,即当前用户

 

 

2010-09-02

缩略显示

osworkflow --权限的一些问题(group组)

博客分类:

JDBCWorkflow配置管理SQLXML

来源:http://hi.baidu.com/pluto_andy/blog/item/8f74c20b4a5c061695ca6b39.html

 

osworkflowexample.xml中,可以看到这样的配置:

<condition type="class">
       <arg name="class.name">com.opensymphony.workflow.util.OSUserGroupCondition</arg>
       <arg name="group">foos</arg>
</condition>

这是一个条件语句,意思是:判断当前执行改流程的用户在不在group组(foos是组的名字)中,是执行什么流程,不是执行什么流程。

那在实际开发中如何应用这个组呢?这就要用到osuser.xml配置文件。

<opensymphony-user>

<!--数据储存在内存中-->
<provider class="com.opensymphony.user.provider.memory.MemoryAccessProvider" />
<provider class="com.opensymphony.user.provider.memory.MemoryCredentialsProvider" />
<provider class="com.opensymphony.user.provider.memory.MemoryProfileProvider" />

<!--数据持久化到数据库中-->

<provider class="com.opensymphony.user.provider.jdbc.JDBCAccessProvider">
<property name="user.table">eruser</property>
<property name="group.table">role</property>
<property name="membership.table">user_role</property>
<property name="user.name">usid</property>
<property name="user.password">loginpwd</property>
<property name="group.name">roleid</property>
<property name="membership.userName">ur_userid</property>
<property name="membership.groupName">ur_roleid</property>
<property name="datasource">java:comp/env/jdbc/sqlserver</property>
</provider>

<provider class="com.opensymphony.user.provider.jdbc.JDBCCredentialsProvider">
<property name="user.table">eruser</property>
<property name="group.table">role</property>
<property name="membership.table">user_role</property>
<property name="user.name">usid</property>
<property name="user.password">loginpwd</property>
<property name="group.name">roleid</property>
<property name="membership.userName">ur_userid</property>
<property name="membership.groupName">ur_roleid</property>
<property name="datasource">java:comp/env/jdbc/sqlserver</property>
</provider>

<provider class="com.opensymphony.user.provider.jdbc.JDBCProfileProvider">
<property name="user.table">eruser</property>
<property name="group.table">role</property>
<property name="membership.table">user_role</property>
<property name="user.name">usid</property>
<property name="user.password">loginpwd</property>
<property name="group.name">roleid</property>
<property name="membership.userName">ur_userid</property>
<property name="membership.groupName">ur_roleid</property>
<property name="datasource">java:comp/env/jdbc/sqlserver</property>
</provider>

<authenticator class="com.opensymphony.user.authenticator.SmartAuthenticator"/>

</opensymphony-user>

简要的说明一下改配置文件:

当数据存储在内存中时,不用做什么配置。要持久化到数据库中,就要配置数据库连接池了。

property name="datasource">java:comp/env/jdbc/sqlserver</property>

这条语句就是对连接池的调用。

osworkflow中主要有三个类对group进行操作:

UserGroupUserManager

user对应相应的用户表,Group对应相应的组表,两表是多对多的关系。有个中间表维护两种表。

UserManager的作用就是管理用户和组以及两者之间的关系。

------------------------------------------具体应用代码--------------------------------------------

UserManager um = UserManager.getInstance();    //

com.opensymphony.user.User test = null;

test = um.createUser("test"); //新建用户test

foos = um.createGroup("haha");//新建用户haha

test.addToGroup(foos);   //test添加到haha组中

//程序执行流程时,会执行OSUserGroupCondition

public class OSUserGroupCondition implements Condition {
    //~ Methods ////////////////////////////////////////////////////////////////

    public boolean passesCondition(Map transientVars, Map args, PropertySet ps) {
        try {
            WorkflowContext context = (WorkflowContext) transientVars.get("context");
            User user = UserManager.getInstance().getUser(context.getCaller());

            return user.inGroup((String) args.get("group"));
        } catch (EntityNotFoundException e) {
            return false;
        }
    }
}

更改源文件JDBCAccessProvider类中inGroup方法的sql语句

2010-09-02

缩略显示

充分利用 OSWorkflow function

博客分类:

Web.netXML

转自:http://www.blogjava.net/rosen/archive/2005/08/12/9888.html

 

  使用 OSWorkflow 已经有段时间了,现在看来实际需求不是请假条流程原型这么简单。
   
   
有这样的需求:OA 系统中的公文审批共有六个 step,采用单点(不牵涉 split join)逐级审核方式,不同角色登陆时,由同一页面处理,为了便于收发文统计,必须知道下一个接收人是哪个。
   
   
由于在触发当前 action 的同时就要设置好下一接收者,遂需要引进新的协作表。当 action 时要调用另外的 save 方法,而这一过程当然不能在表现层进行。最开始的做法是用一个辅助 service 来取出每个 action 的下一接收者,如下:

  public List getLeader(int type,int companyId) {
  switch (type) {
   case 1:
    return docSendDao.getThisFaculty(companyId);
   case 2:
    return docSendDao.getOffice();
   case 3:
    return docSendDao.getSecGroup();
   case 4:
    return docSendDao.getOfficeLead();
   case 5:
    return docSendDao.getSecFaculty();
   default :
    return new ArrayList();
  }
 }

    这种做法在开发的前期还觉得不错,随着需求的进一步详细,发现当新增、修改流程时,也许我们要在这个 service 中满山遍野的找寻到底代码在哪里。更糟糕的是产品提交用户后,用户不会花费这么大的耐心让你这样维护。在经过短暂的思考后,决定利用 OSWorkflow FunctionProvider 接口和 script 做文章。
   
   
一个比较成熟的想法是(如各位有更好的方案不妨交流):每个流程都可能面临修改,那就把流程的每个 action 要做的事抽取出来,这样修改起来相对独立,比如要把下一默认接收者改成其他人;另一个目的是快速响应用户对新流程的需求,在提出需求后,生成相应的流程文件及每个 action 要做的事,提交到服务器,重启就可以用了,而不是在已有代码基础上新增。这里的每个 action 要做的事就是 OSWorkflow FunctionProvider 接口,实现这个接口,就可以为所欲为了。
   
   
代码片断如下:

 流程定义
    <step id="1" name="
科领导审批">
      <actions>
        <action id="2" name="
批准" view="批准">
          <results>
            <unconditional-result id="2" old-status="Finished" status="Queued" step="2" owner="${stepOwner}">
           <pre-functions>
           //
FacultyLea 类说明当前调用者
    <function type="beanshell">
     <arg name="script">
                        String caller = context.getCaller();
                        transientVars.put("caller", caller);
                    </arg>
    </function>
                     //FunctionProvider
实现类
                     //
向协作表中写入当前调用者和下一默认接收者
             <function name="set.caller" type="class">
               <arg name="class.name">***.*****.util.FacultyLea</arg>               </function>
           </pre-functions>
        </unconditional-result>
          </results>
        </action>
        <action id="3" name="
拒绝" view="拒绝">
          <results>
            <unconditional-result id="3" old-status="Finished" status="Finished" step="7"/>
          </results>
        </action>
      </actions>
    </step>

FacultyLea

public class FacultyLea implements FunctionProvider{
 
 ReadProperty readProperty = ReadProperty.getInstance();
 ApplicationContext ctx=new
 FileSystemXmlApplicationContext(System.getProperty("user.dir")+"/web/WEB-INF/classes/applicationContext.xml");
 
 private SendDao sendDao = (SendDao) ctx.getBean("sendDao");
 private DocService docService = (DocService) ctx.getBean("docService");
 
 public void execute(Map transientVars, Map args, PropertySet ps) throws WorkflowException {
  long l=((HibernateCurrentStep)((Collection)transientVars.get("currentSteps")).toArray()[0]).getEntryId();
 Doc md=docService.findDocByWrokFlowId(l+"");
 String caller=(String)transientVars.get("caller");
  
 //
设置下一步的接收者
 Timestamp date = new Timestamp(System.currentTimeMillis());
 String query = "some hql here";
 List leaders = docSendDao.find(query);
        for(int i=0;i<leaders.size();i++){
            Send send = new Send();
            send.setSendUser(new UserLogin(new Integer(caller)));
            send.setDoc(md);
            ......
            sendDao.save(send);
        }
  
 //
设置该步骤处理者
  transientVars.put("stepOwner", caller);
 }
}

2010-09-02

缩略显示

osworkflow学习笔记-怎么在项目里用工作流呢?

博客分类:

工作JSPWorkflowXMLWeb

关键字:osworkflow 入门教程, 初体验,环境搭建,示例,笔记,用法。。。。。。

 

在研究osworkflow详细配置之前,先整明白这玩意咋在网页里用呢?

看例子:

页面都在osworkflow-2.8.0\src\webapp下:

首先是首页default.jsp,创建用户啥的先不理,然后是登陆页面:login.jsp,登陆验证完进入nav.jsp

Java代码

1.       session.setAttribute("username", username);   

2.        response.sendRedirect("nav.jsp");  

       session.setAttribute("username", username);

        response.sendRedirect("nav.jsp");

 nav.jsp里进入创建工作流的页面:newworkflow.jsp

 

 OK重点到了,如何创建一个工作流对象:

newworkflow.jsp

Java代码

1.       Workflow wf = new BasicWorkflow((String) session.getAttribute("username"));   

2.        long id = wf.initialize("example", 100, null);  

   Workflow wf = new BasicWorkflow((String) session.getAttribute("username"));

    long id = wf.initialize("example", 100, null);

 

 哦,首先根据当前用户名创建一个 BasicWorkflow, 然后初始化,估计是用之前配的osworkflow-2.8.0\src\webapp\WEB-INF\classes\example.xml, 得到一个流水号id,然后进入test.jsp页面开始走流程:

test.jsp页面复杂了。。。

不过感觉需要看的就开始那点:

Java代码

1.       Workflow wf = new BasicWorkflow((String) session.getAttribute("username"));   

2.         

3.           long id = Long.parseLong(request.getParameter("id"));   

4.         

5.           String doString = request.getParameter("do");   

6.           if (doString != null && !doString.equals("")) {   

7.             <STRONG>  int action = Integer.parseInt(doString);   

8.               wf.doAction(id, action, Collections.EMPTY_MAP);</STRONG>   

9.         

10.     

11.       }   

12.     

13.     

14.       int[] actions = wf.getAvailableActions(id, null);   

15.       <STRONG>WorkflowDescriptor wd =  wf.getWorkflowDescriptor(wf.getWorkflowName(id));</STRONG>   

16.     

17.     

18.     

19.       for (int i = 0; i < actions.length; i++) {   

20.          <STRONG> String name = wd.getAction(actions[i]).getName();</STRONG>   

21.     

22.     

23.     

24.           %>   

25.           <li> <a href="test.jsp?id=<%=id%>&do=<%= actions[i] %>"><%= name %></a>   

26.           <%   

27.       }  

Workflow wf = new BasicWorkflow((String) session.getAttribute("username"));

 

    long id = Long.parseLong(request.getParameter("id"));

 

    String doString = request.getParameter("do");

    if (doString != null && !doString.equals("")) {

        int action = Integer.parseInt(doString);

        wf.doAction(id, action, Collections.EMPTY_MAP);

 

 

    }

 

 

    int[] actions = wf.getAvailableActions(id, null);

    WorkflowDescriptor wd =  wf.getWorkflowDescriptor(wf.getWorkflowName(id));

 

 

 

    for (int i = 0; i < actions.length; i++) {

        String name = wd.getAction(actions[i]).getName();

 

 

 

        %>

        <li> <a href="test.jsp?id=<%=id%>&do=<%= actions[i] %>"><%= name %></a>

        <%

    }

 无非就是获取一个流水号,然后就知道当前工作流在第几步了,

Java代码

1.       wd.getAction(actions[i]).getName()  

 wd.getAction(actions[i]).getName()

   然后想执行哪一步,就执行哪一步的action编号就行

Java代码

1.       wf.doAction(id, action, Collections.EMPTY_MAP);  

wf.doAction(id, action, Collections.EMPTY_MAP);

action编号在sworkflow-2.8.0\src\webapp\WEB-INF\classes\example.xml里定义了,例如:

  <action id="1" name="Finish First Draft">

 

至于到底能执行哪一个action,什么用户才能执行,这执行完了又该咋地,这都配到example.xml里了, 得还得看那个example.xml

反正现在终于可以对osworkflow“hello world”

 

 

2010-09-02

缩略显示

osworkflow学习笔记-这一步步是咋连起来的呢

博客分类:

金山WebXML

关键字:osworkflow 入门教程, 初体验,环境搭建,示例,笔记,用法。。。。。。

 

上一篇中说了怎么跑起来例子,然后是如果操作流程运转

第一步是开始编辑:First Draft

第二步分成两小步:FooBar,其中bar完事了还要baz一下

第三步是合并上面两小步到 edit doc

。。。等等等

大概齐就这个意思吧。

 

丫是咋把这一步步连起来的呢,找了半天也没个教程里写这个,还是老老实实看配置文件吧:

 

打开配置文件:osworkflow-2.8.0\src\webapp\WEB-INF\classes

这么目录下有4个文件,有东西的就是example.xml (请原谅我的无知无畏)

这个文件好长啊,我给缩了一下:

 

乱!

 

请看 step 1 : First Draft , 他完事了会有个结果result, 这个result写了个 split="1", 意思是将进入劈叉1里,劈叉1在最下面定义<split id="1">, 这里定义了分别劈叉到step 6 step 7里了,step6Foo, step7Bar(foobar 中文是啥意思啊?金山词霸查不到, 我猜是傻瓜和王八的意思)

 

原来是这样啊就是 通过在结果< result>写类似step="2" split="2" join="2" 这样属性就把流程给链接起来了。

 

我感觉我只要把流程连起来就心满意足了,其他一堆堆东西是干啥用啊,是啥牛X功能呢?

 

 

 

 

  • 大小: 111.6 KB

2010-09-01

缩略显示

osworkflow学习笔记-先把例子跑起来看看

博客分类:

WorkflowOOTomcat工作.net

关键字:osworkflow 入门教程, 初体验,环境搭建,示例,笔记,用法。。。。。。

 

下载地址:https://osworkflow.dev.java.net/files/documents/635/27138/osworkflow-2.8.0.zip

在下载的zip包中,有一个osworkflow-2.8.0-example.war包,可以直接放到在容器中 ,启动服务器就行了。(tomcat的话就放到 webapp目录下)

 

切记不需配任何东西 你就可以看它的例子了!

 

在网页上进入这个网址后可以看到:

啥意思唻?  大概意思就是 让你先点一下那个“here”,好让他初始化下,然后用test/test在下面登录就行了。

登录完了进入页面:

 

 

这又是啥玩意? 让你先启动一个工作流i,然后在“view”它,点击"new workflow",出:

 

哦,您已经闯入了一个工作流里了,而且是第#2流,好然后我们就看看这个2流工作流吧(在输入框里输“2”,点击"view"):

该页面告诉您,您当前处于第一个流程节点处”first draft“, 如果您点一下”finish first draft“, 那么您将渐入下一个流程节点。(点击view live grahp 可以看到您在流程中那个环节上:)

 

很明显 就是用红框高亮的那个蓝色方块,就是我们当前的位置,点击结束"finish first draft"后我们将进入节点bar和节点f oo

 

 在列表中可以看到我们已经结束了”first draft“这个流程节点,当前在第二级节点中,我们可以选择结束第二级节点(foobar),然后进入下一级,以此类推,部门一步步finish所有流程节点。

 

 这个例子就跑完了,接下来看看它是如何通过配置文件来定义这些节点的。

 

 

  • 大小: 17.2 KB
  • 大小: 9.4 KB
  • 大小: 15.6 KB
  • 大小: 44.3 KB
  • 大小: 38.5 KB
  • 大小: 62 KB

2010-08-03

缩略显示

No class registered for interface 'mx.styles::IStyleManager2'.

博客分类:

Flex

出这个问题的原因是:

   当你把一原来是 application的类改成普通组件时,在项目属性里它仍被注册为一个application造成的,解决办法:在项目属性里的"flex application"“select the runnable application files”列表中 删掉这个application.

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics