- 浏览: 69422 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (42)
- 耗材管理系统 (1)
- OSWorkFlow (2)
- osworkflow api (1)
- jsp 分页插件 (1)
- OsWorkFlow工作流请假实例 (1)
- SSH+DWR (1)
- Java角色权限设计 (1)
- SSH 三大框架整合 (1)
- Spring注解 (1)
- 没有事业的女孩子(一位老总的感言) (1)
- Jdbc介绍 (1)
- struts2 trim截取首尾空格 (1)
- DOS 命令大全 (1)
- SqlServer2000 中各种数据类型允许的最大长度 (1)
- 【收藏版】15款报表工具的总结 (1)
- 获取Java环境的相关信息 (1)
- Java读取二进制文件 (1)
- JAVA 十六进制与字符串的转换 (1)
- struts2 iterator 遍历 map嵌套 (1)
- Spring2文件上传实例 (1)
- JavaScript (1)
- SVN (1)
- JSTL (1)
- ForEach (1)
- Java (1)
- edtFtpJ (3)
- Flash (1)
- 多线程 (1)
- 设计模式 (4)
- jdk (1)
- web.xml (1)
- 算法 (1)
- Spring_MVC (1)
- spring (2)
- Applet (1)
最新评论
-
ybb_dgv:
没有sql
OSworkFlow工作流请假流程实例 -
sunlu:
楼主你好!我运行你的例子时出现个问题使我难以继续!请指教 Un ...
OSworkFlow工作流请假流程实例 -
lotusibm:
文章不错的
Java 角色权限设计 -
dushanggaolou:
解释的很详细。
foreach中循环次数操作 -
Jeenry119:
用的是Netbeans
耗材管理系统
博客分类:
在网上看到的一篇文章,不知出处,太适合做为我前几个笔记的总结和补充了
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文件中的错误。
Step和actions
理解这个xml文件的第一个重点在于理解step和actions的在工作流系统中的概念。一个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,假如需要一个特定的condition。Condition可以接收参数。如本例就接收了一个参数“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变量。
function是osworkflow的一个非常强大的特征,一个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>、beanshell、class
博客分类:
关键字:osworkflow 入门教程, 初体验,环境搭建,示例,笔记,用法,标签 含义 释义。。。。。。
打开osworkflow-2.8.0\src\webapp\WEB-INF\classes\example.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 表达式范围内中始终存在三个变量,entry、context和store。entry变量是一个实现了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, args和propertySet可用 ,通过这三个参数能获取或编辑当前工作流里的很多信息。
<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
博客分类:
来源:http://hi.baidu.com/pluto_andy/blog/item/8f74c20b4a5c061695ca6b39.html
在osworkflow的example.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进行操作:
User、Group、UserManager
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
博客分类:
转自: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) { |
这种做法在开发的前期还觉得不错,随着需求的进一步详细,发现当新增、修改流程时,也许我们要在这个 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 入门教程, 初体验,环境搭建,示例,笔记,用法。。。。。。
在研究osworkflow详细配置之前,先整明白这玩意咋在网页里用呢?
看例子:
页面都在osworkflow-2.8.0\src\webapp下:
首先是首页default.jsp,创建用户啥的先不理,然后是登陆页面:login.jsp,登陆验证完进入nav.jsp
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
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页面复杂了。。。
不过感觉需要看的就开始那点:
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>
<%
}
无非就是获取一个流水号,然后就知道当前工作流在第几步了,
1. wd.getAction(actions[i]).getName()
wd.getAction(actions[i]).getName()
然后想执行哪一步,就执行哪一步的action编号就行
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 入门教程, 初体验,环境搭建,示例,笔记,用法。。。。。。
上一篇中说了怎么跑起来例子,然后是如果操作流程运转
第一步是开始编辑:First Draft
第二步分成两小步:Foo和Bar,其中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里了,step6是Foo, step7是Bar。(foo和bar 中文是啥意思啊?金山词霸查不到, 我猜是傻瓜和王八的意思)。
原来是这样啊就是 通过在结果< result>写类似step="2" split="2" join="2" 这样属性就把流程给链接起来了。
我感觉我只要把流程连起来就心满意足了,其他一堆堆东西是干啥用啊,是啥牛X功能呢?
2010-09-01
博客分类:
关键字: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“这个流程节点,当前在第二级节点中,我们可以选择结束第二级节点(foo和bar),然后进入下一级,以此类推,部门一步步finish所有流程节点。
这个例子就跑完了,接下来看看它是如何通过配置文件来定义这些节点的。
2010-08-03
No class registered for interface 'mx.styles::IStyleManager2'.
博客分类:
出这个问题的原因是:
当你把一原来是 application的类改成普通组件时,在项目属性里它仍被注册为一个application造成的,解决办法:在项目属性里的"flex application"中“select the runnable application files”列表中 删掉这个application.
相关推荐
通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!
OSWorkflow
3. 示例代码:压缩包中的"OSWorkFlow"文件可能包含示例代码和配置,供学习参考。 4. 第三方教程:网上有许多关于OSWorkFlow的教程和博客文章,深入讲解各个功能和最佳实践。 总的来说,OSWorkFlow为Java开发者提供...
**osworkflow** 是一个开源的工作流管理系统,专为Java...通过学习和实践这些文档,开发者可以掌握osworkflow的基本用法,了解如何将其与Hibernate和Spring集成,从而在实际项目中构建出高效、灵活的工作流管理系统。
OSWorkflow是一款开源的工作流引擎,主要用于管理应用程序中的复杂业务流程。这款工具提供了强大的工作流建模、执行和跟踪功能,让开发者能够灵活地定义和控制应用程序的流程逻辑。本手册是OSWorkflow的中文版,旨在...
**osWorkflow 概述** osWorkflow 是一个开源的工作流管理系统,专为 Java 应用程序设计,用于处理复杂的业务流程。...通过深入学习和实践,你将能够掌握如何利用osWorkflow 构建高效、可扩展的业务流程管理解决方案。
在这个压缩包中,你将找到一系列资源,包括jar包、学习资料和API手册,这些都是深入理解和使用OSWorkflow 2.8的关键。 首先,让我们详细了解一下OSWorkflow的核心概念和功能: 1. **流程定义**:OSWorkflow允许...
"osworkflow_bundle2" 是一个专门用于学习 OSWorkflow 的示例集合,它包含了一系列的资源和实例,帮助用户理解并掌握如何使用这个强大的工作流框架。在这个压缩包中,你将找到 "osworkflow_bundle" 文件,这是该学习...
本资源包含了OSWorkflow的源代码和相关电子书籍,对于学习和使用OSWorkflow来说,这是一个宝贵的资料库。 首先,让我们深入了解一下OSWorkflow的核心特性: 1. **灵活性**:OSWorkflow的最大亮点是其灵活性。它...
通过学习和运行这些示例,可以理解 OSWorkflow 的核心概念和用法。 6. **扩展与自定义** OSWorkflow 允许开发者自定义工作流行为,如定义新的动作、条件和事件处理器,以适应特定业务需求。同时,它还支持插件机制...
**osWorkflow 指导文档 + 源码详解** osWorkflow 是一款开源的工作流引擎,主要用于处理业务流程...通过深入学习 osWorkflow 的指导文档和源码,开发者能够更好地理解和定制工作流,从而提高应用程序的业务处理能力。
通过理解和实践这个实例,我们可以学习到如何在实际项目中应用工作流引擎,提升软件系统的灵活性和可维护性。无论是在企业级应用还是中小项目中,OsWorkflow都是一个值得考虑的工作流解决方案。
OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及风暴—基础概念.doc 用osworkflow写一个请假例子.rar
**osworkflow** 是一个强大的开源工作流引擎,主要用于在Java应用程序中实现...通过深入学习这些文档,你可以掌握如何利用osworkflow来实现动态、可扩展的工作流解决方案,从而提升你的Java应用程序的业务处理能力。
通过学习这个入门级的例子,你可以掌握如何定义流程、启动流程实例、处理任务,以及如何与现有的应用程序集成。一旦掌握了基础,你就可以根据具体需求扩展 Osworkflow,构建出复杂而高效的工作流管理系统。
OSWorkflow 2.8 API 文档
### OSWorkflow 2.8 知识点概览 #### 一、OSWorkflow 简介与特性 **OSWorkflow** 是一款灵活的工作流管理工具,适用于需要高度定制化流程的应用场景。它与大多数商用或开源工作流软件的不同之处在于其高度的灵活性...
OsWorkflow 是一个基于Java的工作流引擎,主要用于设计和执行复杂的业务流程。这个项目是一个请假申请的工作流示例,其中流程的定义完全存储在XML文件中,这样可以方便地进行流程的配置和更改,无需修改源代码。对于...
4. **文档**:完整的文档是学习任何工具的关键。OSWorkflow 2.80 包含的文档应该涵盖安装指南、API参考、教程和最佳实践,帮助开发者快速上手并深入理解其内部机制。 5. **API 使用**:OSWorkflow 提供了丰富的API...