飞飞博客

欢迎来到飞飞博客>>   | 首页 资源中心 | 工作流 | 随想 | 心情日记 | 杂谈 | Hibernate | 每天日志 | Spring | ITPUB论坛

第六篇评论发表了 访问地址发布

发表人:ganfei1983 | 发表时间: 2007年四月18日, 09:47

第六篇评论发表了 访问地址发布

http://tech.it168.com/j/n/2007-04-17/200704170929156.shtml

请大家,给点意见,拍拍砖.


DWR --2

发表人:ganfei1983 | 发表时间: 2007年四月17日, 13:13

<script type="text/javascript"
src='<%= renderResponse.encodeURL(renderRequest.getContextPath() + "/dwr/engine.js") %>'>
</script>
<script type="text/javascript"
src='<%= renderResponse.encodeURL(renderRequest.getContextPath() + "/dwr/util.js") %>'>
</script>
<script type="text/javascript"
src='<%= renderResponse.encodeURL(renderRequest.getContextPath() +
"/dwr/interface/RssReader.js") %>'>
</script>

其中的renderRequest和renderResponse是Liferay Portal添加到jsp中的隐含变量,负责对Portlet进行渲染。renderRequest.getContextPath()就是当前jsp的路径,加上js相对于jsp的路径,最后要用renderResponse.encodeURL()方法解码一下才能得到正确的路径。

其他方面,DWR的使用方法就和在一般的jsp中的使用方法一样了。从这里也可以看出,不光是使用DWR,所有对js及其他资源的引用都要用这种方法。

如何实现DWR的多人同时开发
这几天研究了一下DWR,觉的有了这个东东后,Ajax就非常Easy了,可以说是不用学了,我用的是1.1.1的版本,2.0的版本目前还在开发,具体的网址是http://getahead.ltd.uk/dwr/documentation,里面说的很简单,对Web开发比较熟的化,一天就能全学会,不过要做好的话,还是需要在工作中遇到具体的问题再具体解决,再和Spring和Hibernate一结合的化,感觉能大大加快开发进度,现在主要说说如何配置多个dwr.xm,这样的化就可以多个人同时开发,互不影响,这对公司的版本控制还是比较有益处的.

主要是在web.xml中配置

<servlet>
<servlet-name>dwr-user-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-user</param-name>
<param-value>WEB-INF/dwr-user.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>dwr-admin-invoker</servlet-name>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>config-admin</param-name>
<param-value>WEB-INF/dwr-admin.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-admin-invoker</servlet-name>
<url-pattern>/dwradmin/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dwr-user-invoker</servlet-name>
<url-pattern>/dwruser/*</url-pattern>
</servlet-mapping>


这样的话在WEB-INF文件夹下就新增两个XML文件,分别为dwr-user.xml,dwr-admin.xml就行了,然后访问:http://localhost:8080/your app/dwruser就能看到它的测试页面了,把它的javascript文件的存放位置拷下来,放到你的JSP或html文件中,就OK了,我觉的这个测试页主要也就是做这个的,它的一些测试方法,我觉的不是很好用.这样就可以同时有多个XML的配置文件,大家同时开发不影响.

最后记住一点,为了搞明白这一点,花了我一下午和晚上的时间,就是在你的web app目录中,不要创建dwruser或dwradmin这样的目录,更不要把Jsp或html放进去,否则的话,不管用绝对还是相对路径都找不到.

1.新建一个webapp,命名为testApp
2.将dwr.jar拷贝到testApp的WEB-INF的lib目录下
3.编译上面的User,UserDAO,DWRUserAccess类,放到classes目录下
4.在web.xml中配置servlet,适配路径到dwr目录下,如下所示
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR Servlet</display-name>
<description>Direct Web Remoter Servlet</description>
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>scriptCompressed</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>

以上的配置可以拦截testApp下所有指向dwr的请求,关于这个拦截器,我们会在后面介绍。

5.WEB-INF下新建一个dwr.xml文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "
http://www.getahead.ltd.uk/dwr/dwr10.dtd">

<dwr>
<allow>
<create creator="new" javascript="DWRUserAccess">
<param name="class" value="test.DWRUserAccess"/>
</create>
<convert converter="bean" match="test.User"/>
</allow>
</dwr>

这里我们把DWRUserAccess配置到了dwr中,create元素中,creater="new"表示每调用一次DWRUserAccess时,需要new一个这样的类;javascript="DWRUserAccess",表示提供给前台页面调用的javascirpt文件是DWRUserAccess.js。

convert元素用于数据类型转换,即java类和javascript之间相互转换,因为和前台交换的是User对象,因此需要对此使用bean转换,我们将在后面介绍这个类。


DWR 试用

发表人:ganfei1983 | 发表时间: 2007年四月17日, 12:52

DWR嵌入到现有的J2EE(Web)项目的的配置
1、把dwr.jar文件拷贝到项目的lib目录下。
2、修改项目的web.xml文件,在文件中加入以下代码
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>true</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dwr-invoker</servlet-name>
<url-pattern>/dwr/*</url-pattern>
</servlet-mapping>
3、在WEB-INF目录中建立dwr.xml文件,例如:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">
<dwr>
<init></init>
<allow>
<create creator="new" javascript="dwrbo">
<param name="class" value="com.dwr.DwrBO"/>
</create>
</allow>
</dwr>以上dwr.xml文件内容还是比较好理解。就是发布一个类,一个类发布了,那么就可以通过js 的代码来调用这个类里的方法了。
4、com.dwr.DwrBO类的内容如下:
package com.dwr;

import org.directwebremoting.WebContextFactory;

import uk.ltd.getahead.dwr.ExecutionContext;


public class DwrBO {

public String getInclude()throws Exception{
return WebContextFactory.get().forwardToString("/a.jsp");
}
public String getServerInfo(){
return WebContextFactory.get().getServletContext().getServerInfo()+
"Run on JDK: "+System.getProperty("java.specification.version")+
"Useing DWR :"+ExecutionContext.get().getVersion();
}
public int[] getNumbers(boolean big){
if(big){
System.out.println("big==true");
return new int[]{1000,2000,3000,4000};
}else{
System.out.println("big==false");
return new int[]{1,2,3,4,5,6,7,8,9,10};
}

}
}
这实际上是dwr官方网站上的例子.

5、页面调用代码

<%@ page language="java" pageEncoding="UTF-8"%>

<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-template" prefix="template" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html locale="true">
<head>
<html:base />

<title>测试</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<style type="text/css">
<!--
#Layer1 {
position:absolute;
left:47px;
top:24px;
width:677px;
height:31px;
z-index:1;
}
#context {
position:absolute;
left:45px;
top:100px;
width:679px;
height:100px;
z-index:2;
background-color: #f8f8f8;
clip: rect(10px,auto,auto,auto);
margin-top: 10px;
}
#version {
position: relative;
top: 200px;
width: 200px;
}
#Layer2 {
position:absolute;
left:26px;
top:247px;
width:485px;
height:76px;
z-index:3;
background-color: f2f2f2;
border: 1px solid #f4f4f4;
}
body {
font-size: 12px;
}
-->
</style>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/dwrbo.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/util.js'></script>

<SCRIPT language="javascript">
function loadinfo(data) {
DWRUtil.setValue("context", data);
}
function test(){
dwrbo.getInclude(loadinfo);
}
function loadinfoversion(data){
DWRUtil.setValue("version",data);
}
function showversion(){
dwrbo.getServerInfo(loadinfoversion);
}

function createList(data){
DWRUtil.removeAllOptions("numlist");
DWRUtil.addOptions("numlist",data);
}

function update(){
alert("xxxs");
dwrbo.getNumbers(createList,${"bigselect"}.checked);
}

</SCRIPT>
</head>

<body>
<div id="Layer1">
<input type="submit" name="Submit" value="测试" onClick="test()">
<input type="submit" name="Submit" value="版本信息" onClick="showversion()">
</div>
<div id="context">
</div>
<div id="version">
</div>
<div id="Layer2">
<input type="checkbox" id=bigselect onclick="update()">数字类型<br>
<select id=numlist></select>
</div>
</body>
</html:html>

这只是一个简单的例子,至于具体的技术说明就不说了,因为很简单。把它贴出来当作一个笔记吧,希望能进一步学习DWR
posted on 2006-09-16 16:11 有猫相伴的日子 阅读(238) 评论(3) 编辑 收藏 引用 所属分类: dwr

评论:
# re: DWR2配置及入门例子 2006-10-23 13:19 | 刘文涛[匿名]

按您的教程,没成功,想请问一下 :

<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/dwrbo.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/util.js'></script>

这些JS 从哪里来啊 ? 回复 更多评论

# re: DWR2配置及入门例子 2006-11-08 08:01 | 有猫相伴的日子

@刘文涛[匿名]
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/engine.js'></script>
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/util.js'></script>

这个是DWR自动生成的基础js脚本.
<script type='text/javascript' src='<%=request.getContextPath()%>/dwr/interface/dwrbo.js'></script>
这是跟据我的dwr.xml配置文件生成的,文件的命名与在dwr.xml文件的配置有关 回复 更多评论


第四篇文章终于发表了

发表人:ganfei1983 | 发表时间: 2007年三月18日, 22:43

第四篇文章发表了,3.12 上了IT168头条,呵呵 荣誉啊!

下面是访问地址,大家拍拍砖。

http://tech.it168.com/j/n/2007-03-12/200703120939314.shtml

下面是 征文的发表地址:

http://www.itpub.net/733072.html


工作流基础概念

发表人:ganfei1983 | 发表时间: 2007年三月07日, 17:43

1. 步骤、状态和动作

工作流要描述步骤(step)、步骤的状态(status)、各个步骤之间的关系以及执行各个步骤的条件和权限,每个步骤中可以含有一个或多个动作(action),动作将会使一个步骤的状态发生改变。

对于一个执行的工作流来讲,步骤的切换是不可避免的。一个工作流在某一时刻会有一个或多个当前步骤,每个当前步骤都有一个状态值,当前步骤的状态值组成了工作流实例的状态值。一旦完成了一个步骤,那么这个步骤将不再是当前步骤(而是切换到一个新的步骤),通常一个新的当前步骤将随之建立起来,以保证工作流继续执行。完成了的步骤的最终状态值是用old-status属性指定的,这个状态值的设定将发生在切换到其他步骤之前。old-status的值可以是任意的,但在一般情况下,我们设置为Finished

切换本身是一个动作(action)的执行结果。每个步骤可以含有多个动作,究竟要载入哪个动作是由最终用户、外部事件或者triggerd的自动调用决定的。随着动作的完成,一个特定的步骤切换也将发生。动作可以被限制在用户、用户组或当前状态。每一个动作都必须包含一个unconditional result0个或多个conditional results

所以,总体来说,一个工作流由多个步骤组成。每个步骤有一个当前状态(例如:Queued, Underway, or Finished),一个步骤包含多个动作。每个步骤含有多个可以执行的动作。每个动作都有执行的条件,也有要执行的函数。动作包含有可以改变状态和当前工作流步骤的results

2. Results, Joins, and Splits

(1) Unconditional Result

对于每一个动作来讲,必须存在一个Unconditional Result。一个result是一系列指令,这些指令将告诉OSWorkFlow下一个任务要做什么。这包括使工作流从一个状态切换到另一个状态。

(2) conditional Result

conditional Resultunconditional Result的一个扩展。它需要一个或多个condition子标签。第一个为trueconditional(使用ANDOR类型),会指明发生切换的步骤,这个切换步骤的发生是由于某个用户执行了某个动作的结果导致的。

(3) 三种不同的Resultsconditional or unconditional

--一个新的、单一的步骤和状态的组合。

--一个分裂成两个或多个步骤和状态的组合。

--将这个和其他的切换组合成一个新的单一的步骤和状态的组合。

每种不同的result对应了不同的xml描述,你可以阅读http://www.opensymphony.com/osworkflow/workflow_2_6.dtd,获取更多的信息。

注意:通常,一个split或一个join不会再导致一个split join的发生。

单一步骤和状态的结果可以这样描述:

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

如果状态不是Queued的话,那么第三个必要条件就是新步骤的所有者(owner)。除了可以指明下一个状态的信息之外,result也可以指定validators post-functions,这将在下面讨论。

从一个状态分裂成多个状态可以这样描述:

<unconditional-result split="1"/>

...

<splits>

<split id="1">

<unconditional-result old-status="Finished" step="2"

status="Underway" owner="${someOwner}"/>

<unconditional-result old-status="Finished" step="2"

status="Underway" owner="${someOtherOwner}"/>

</split>

</splits>

将多个状态合并为一个状态可以这样描述:

<!-- for step id 6 ->

<unconditional-result join="1"/>

...

<!- for step id 8 ->

<unconditional-result join="1"/>

...

<joins>

<join id="1">

<conditions type="AND">

<condition type="beanshell">

<arg name="script">

"Finished".equals(jn.getStep(6).getStatus()

&& "Finished".equals(jn.getStep(8).getStatus())

</arg>

</condition>

</conditions>

<unconditional-result old-status="Finished" status="Underway" owner="test" step="2"/>

</join>

</joins>

上面的描述也许有点含糊,但是你最应该关注的是condition标签,它使用一个"jn"的变量,利用这个变量,你可以组成表达式来决定合并动作发生的条件。这个表达式的意思是说:“当id=6id=8的步骤的状态都变成Finished的状态并且他们要发生的切换都是join="1"时,这个合并动作才发生”。

3. 外部函数

OSWorkFlow为要定义和执行的外部业务逻辑定义了一个标准的解决方法。这是通过使用"functions"来实现的。OSWorkFlow有两种functionprepost step functions

Pre functions是在流程的步骤发生切换之前执行的。一个例子是取得调用者名字的函数,将取得的调用者的名字作为要发生状态切换的result使用。另外一个例子是pre-function用来更新大多数的动作的最近调用者。这两个函数是做为标准的工具函数提供的,在实际的工作流中非常实用。

Post functionsPre functions有着同样的适用范围,不同点在于Post functions是在状态发生变化之后执行的。一个典型的Post functions的例子是:在某个动作执行完毕后,给某些人发送电子邮件。例如:当一个文档处于'research'步骤,并且执行了'markReadyForReview'动作的时候,要发送邮件给所有的reviewers

使用Post functionsPre functions可能有很多原因。一个是如果用户点击完成按钮两次而且发送了两次执行动作的指令,而且这个动作的Pre function会执行很长时间,那么这个长时间执行的函数可能会被执行多次,因为切换动作还没有发生,这时OSWorkflow会认为第二次执行动作是合理的。所以要将这个函数改变成Post function。一般情况下,Pre function应该是简单的、能快速执行的函数。

函数可以定义在两个独立的位置:步骤(step)和动作(action)

通常情况下,Post functionsPre functions被定义在action中。在action中定义的Pre-functions是指在该动作发生之前要执行的函数。当工作流发生切换的时候,函数用来做某些事情,不管是发送E_mail也好,还是为以后的使用设置变量。

Post functionsPre functions被定义在step中的时候,用途就有点不同了。在step中定义的Pre-functions是指在切换到这个step之前要执行

的函数。注意:这些函数将被应用到这个步骤的所有的切换,即使是由于这个步骤本身发起的切换,例如:在同一个步骤内,由Queued状态转移到Underway状态时,也将调用所有的 Pre functions。与此相同,在step中的Post functions将在流程离开这个步骤之前。

4. Trigger Functions

Trigger Functions与其他函数一样,不同点在于他们不是与一个动作相联系的。他们也是通过一个唯一的ID来标识。这些函数通常是运行在系统级用户或非正规用户的环境中。Trigger functions是通过OSWorkflowAPI来使用。

5. Validators

validator 是用来校验一个动作的输入的有效性的。如果输入符合条件,那么将执行这个动作。如果输入不符合条件,那么将抛出InvalidInputException异常。

6. Registers

A register 是一个辅助函数,这个函数可以返回一个对象,这个对象可以用在函数中去访问其他的普通对象,特别是出现在workflow中的实体。被注册的对象可以是任何类型,典型的注册对象的例子是:Document, Metadata, Issue, Task

下面是一个registers的例子:

<registers>

<register name="doc" class="com.acme.DocumentRegister"/>

</registers>

...

<results>

<result condition="doc.priority == 1" step="1" status="Underway"

owner="${someManager}"/>

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

</results>

...

7. Conditions

Conditions就象validatorsregistersfunctions一样,可以用不同的语言和技术来实现。Conditions可以用ANDOR逻辑运算符来组织。Conditions通常是与conditional results联系的,只有当条件成立,result才会执行。

Conditions与函数很相似,唯一不同的是Conditions返回的是boolean值,而不是void

8. Variable Interpolation

在所有的functionsconditionsvalidatorsregisters中,可能要提供一系列的参数。这些参数将会被转化为参数Map,这将在后面讨论。同样,在workflow描述符中的statusold-statusowner标签也将被动态的解析成变量。一个变量是这样被识别的:${foo}。当OSWorkflow识别出这种格式的时候,它首先到transientVars中去找关键字为foo的对象,如果没有找到,那么就到propertySet中去找,如果也没找到,那么变量foo将被转换为一个空字串。

One thing of particular importance is that in the case of args, if the variable is the only argument, the argument will not be of type String, but instead whatever the variable type is. However, if the arg is a mix of characters and variables, the entire argument is converted to String no matter what. That means the two arguments below are very different in that foo is a Date object and bar is a String:

<arg name="foo">${someDate}</arg>

<arg name="bar"> ${someDate} </arg> <!-- 注意多余的空格 -->

9. Permissions and Restrictions

Permissions can be assigned to users and/or groups based on the state of the workflow instance. These permissions are unrelated to the functionality of the workflow engine, but they are useful to have for applications that implement OSWorkflow. For example, a document management system might have the permission name "file-write-permission" enabled for a particular group only during the "Document Edit" stage of the workflow. That way your application can use the API to determine if files can be modified or not. This is useful as there could be a number of states within the workflow where the "file-write-permission" is applicable, so instead of checking for specific steps or conditions, the check can simply be made for a particular permission.

10. Auto actions

有的时候,我们需要一些动作可以基于一些条件自动地执行。为了达到这个目的,你可以在action中加入auto="true"属性。流程将考察这个动作的条件和限制,如果条件符合,那么将执行这个动作。 Auto action是由当前的调用者执行的,所以将对该动作的调用者执行权限检查。

11. Integrating with Abstract Entities

建议在你的核心实体中,例如"Document" "Order",在内部创建一个新的属性:workflowId。这样,当新的"Document" "Order"被创建的时候,它能够和一个workflow实例关联起来。那么,你的代码可以通过OSWorkflow API查找到这个workflow实例并且得到这个workflow的信息和动作。

12. Workflow Instance State

有的时候,为整个workflow实例指定一个状态是很有帮助的,它独立于流程的执行步骤。OSWorkflow提供一些workflow实例中可以包含的"meta-states"。这些"meta-states"可以是CREATED, ACTIVATED, SUSPENDED, KILLED COMPLETED。当一个工作流实例被创建的时候,它将处于CREATED状态。然后,只要一个动作被执行,它就会自动的变成ACTIVATED状态。如果调用者没有明确地改变实例的状态,工作流将一直保持这个状态直到工作流结束。当工作流不可能再执行任何其他的动作的时候,工作流将自动的变成COMPLETED状态。

然而,当工作流处于ACTIVATED状态的时候,调用者可以终止或挂起这个工作流(设置工作流的状态为KILLED SUSPENDED)。一个终止了的工作流将不能再执行任何动作,而且将永远保持着终止状态。一个被挂起了的工作流会被冻结,他也不能执行任何的动作,除非它的状态再变成ACTIVATED


OSWorkflow部署描述基础

发表人:ganfei1983 | 发表时间: 2007年三月07日, 17:27

OSWorkflow部署描述基础

1、基本的格式

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.8//EN" "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
<workflow>
<initial-actions>
//工作流的开始
</initial-actions>
<steps>
//具体的工作步骤
</steps>
</workflow>

这是一个标准的xml文件,通过定义标准的XML头部,要注意的是OSWorkflow将会通过这些指定的DTD来验证XML内容的合法性。

2、OSWorkflow重要概念是steps (步骤) 和 actions (动作)。

一个步骤是工作流所处的位置,比如一个简单的工作流过程,它可能从一个步骤流转到另外一个步骤(或者有时候还是停留在一样的步骤)。

动作指定了可能发生在步骤内的转变,通常会导致步骤的变更。

简单的说,步骤是“在哪里”,动作是“可以去哪里”。

初始化步骤是一种特殊类型的步骤,它用来启动工作流。在一个工作流程开始前,它是没有状态,不处在任何一个步骤,用户必须采取某些动作才能开始这个流程。这些特殊步骤被定义在 <initial-actions>。

3、工作流状态

Underway - 进行中

Queued - 等候处理中

Finished-完成

4、条件

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

上面的条件定义保证了动作1只能在当前状态为“Queued”的时候才能被调用。

4、函数

函数是一个在工作流程中的工作单位,他不会影响到流程本身。函数也可以用来添加变量到当前的环境设置里。变量是一个指定名称的对象,可以用来在工作流中被以后的函数或者脚本使用。

Caller函数会获得当前调用工作流的用户,并把它放入一个名为“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>


元宵节晚上

发表人:ganfei1983 | 发表时间: 2007年三月06日, 14:00

元宵节晚上我无意干了一件蠢事.......!

MD 不说了!``````````想起来就上火!真是对不住人啊`````


新年来的第一个周末

发表人:ganfei1983 | 发表时间: 2007年三月03日, 12:37

今天周六,2007新年来的第一个周末。9:30就起床了,还算早,可就是懒得去下去吃早饭,饿就饿吧,撑一下算了,就当省下早饭钱了。

今天又一个人啊,以前同事约我去打球的,到现在还没信呢。坐静了,慢慢的不知道怎么了我就想家里人了,想我奶奶我妈想我妹了。昨天晚上打电话回家,听说家里下大雨了,奶奶关节又开始痛了,真是担心她啊!都这把年纪了,还要受这样大的痛苦。她还是强打着好的语气给我说话,其实我知道她现在很痛苦。她给我说过,平时想我还好,一到自己病痛的时候就特别的想我,生怕自己三长两短的见不着我了。男儿有泪不轻弹,只是未到伤心去,想到这些在电话亭里我眼泪就没处去了,只在眼眶里打转,然后强掩的擦了擦。

然后给妹妹打电话,问她那天是不是送我走了以后在黄石多住了几天,有没有帮妈妈做事。她说是的,还是说自己都快成“香肠妹”了,其他帮不上只能帮妈买香肠。想到妈妈,我又不好受了,整天都那么忙碌,遭受油烟的熏害,一天从早到晚,体力都透支了。妈妈为了我们付出太多了,我以后好好孝顺我妈,过一年自己经济好些了,我就不让妈妈干这样的活了,太伤身体了。妈妈为了省钱,自己一件像样的衣服都舍不得买,一天到晚辛苦着就为了我们兄妹俩,写到这里,我的眼泪已经忍不住夺眶而出了................

过年的时候回去看看,她都瘦了,瘦了很多很多,她还是强打的笑颜,毕竟我回来一次不容易。在家里,我们坐在一起,把我这半年来的境况一五一十的给妈说了,她也是叮嘱我自己小心点,好好做事,别在外面闯祸,别乱喝酒喝酒容易误事。

等一年后,我经济好点了,我就不让我妈做烧烤店的工作了,让她做点别的,我也给妈妈说过这事。妈说:这是和五姨合营的,家里困难,我不做事这怎么行啊!

说实在的,一个人在外面闯,遇到的困难是有很多的,可是一想起家里人对我的期望,想到亲人那一双双期盼我回家的眼神,在外再苦再难也都可以挺过去了。我不能让家里人丢了脸,俗语说:富不过三代,穷不过三代。到我这一代,该是跳跃的时候了。

如果有人看完了这些,会觉得怎么老爱哭啊!也许吧,我还没长大。但我也是男儿一个,有七情六欲,总有伤心处的时候。


2007年新年的第一天

发表人:ganfei1983 | 发表时间: 2007年二月25日, 23:15

今天很兴奋的起来了,很往常一样,还是赶车。今早还好,等了两分钟的样子28路就来了。我迷迷忽忽的就上车了,别管了,顺着手拉个座再说吧。

来到海航的班车上,遇上了孙积豪,和他随便聊了聊,好打发车上无聊的50分钟。我们聊了一些关于项目测试的事情,时间就慢慢的过去了。

来到公司和来的同事一一道了新年好,我还以为有红包呢?等到经理来了好长时间了,他都没说这事,心想恐怕是泡汤了。于是趁上WC的时间,拿着手机瞎发了一通,郁闷啊!我还以为开门见红闹个吉利呢!结果啥都没有!硬是郁闷了好一会儿!

今天正式接触公司业务了,算了搞了一天,也小有成就。

下班了,回来了,到老地方吃了个饭,然后就给家里打电话。

吃完了给家里打电话,给嘟嘟打了一个,她就是一个劲的说:“哥咪,你什么时候再回来了”,真是舍不得。给毛毛打了一个,像嘟嘟一样,也是想我。

其中旁边来了一位大婶,我的天啊,拖着拖鞋,那味道真是震撼啊!我的鼻子都挺不住了,天啊,周围的蚊子啊,就像下雨一样,往下掉啊!蚊子都扛不住,我这身子骨就别呈能了,还是赶紧撤吧````


到瑞建的第一天

发表人:ganfei1983 | 发表时间: 2007年二月13日, 22:54

今天6点手机响了,我就朦朦胧胧的醒了。

这是我起最早的一次,因为今天又要开始上班了。在楼下吃了点早餐,按照老潘的指的路线,先在国贸坐28路车,到彩虹天桥以后,步行前面不远的海航大厦,跳上海航员工的内部班车,3秒钟后就出发了。

来到海航基地后,给老潘打电话,他让我在原地等他,他随后就到。8:30了,他下车了。见到了,只是平静的看了一下我,没有想象那样热情,当然还是相当友好的,可能是起得早了还没缓过劲来吧。

到海航食堂吃了一点,他向我介绍另一位同事---卢春雷。后面了解到他也是在海口信息中心工作过的,我们就格外有话说,说长论短的说了很多,简直一路说到开发组地点的。

刘哥把我们几个新来的,介绍给大家了。交代了任务后,我就找了一天的资料,看了一天的资料。

经历了一天团队磨合,感触还是很多的。大家工作很认真,积极讨论,好象大家见到新人都比较矜持,呵呵``````都是大男人啊 呵呵`````````

因为离机场很近,时不时的听到飞机起飞的声音,一道一道的,灿烂的阳光也恨不得挤进房间里来。一切都是美好,舒坦的。

新工作开始了,新的挑战来了,加油吧!

我的“新生活”运动开始了。


今天惬意的时刻

发表人:ganfei1983 | 发表时间: 2007年二月11日, 22:48

今天在晚上金龙路的新华书店看书,拿了一个蓝色的小凳子,背靠在书架上,拿着一本我比较喜欢的书籍---《突破人才管理瓶颈》余世维著。看着看着,慢慢就有点腰酸了。挺直了下腰,靠在上面好舒服。

趁着舒服这时我思想分散了,想了想我还有那些时候还这么舒坦。想了想 有以下几个:

1:吃完饭,刁着根小牙签,大摇大摆的走路,在街上耍“流氓”。

2:紧缩眉头,背着手到身后,在房间里来回度步思考问题。

3:买根鸭脖子,买些水果,放到本本前面的地方,边吃边看CS 魔兽的比赛录象。

4:看着漂亮的海景房直傻眼。^_^

呵呵``````见笑了```呵呵```


今天没有玩游戏,总算把大事搞完了````

发表人:ganfei1983 | 发表时间: 2007年二月09日, 19:19

今天没有玩游戏,总算把大事搞完了。

1:网站收入太少,按小张要求把网站关键字改了,内容也更着改了。

2:给瑞建人事部经理写了一封电邮,确实她帮了不少忙。

3:下午心情很好,和小仁子,小林子在网上扯蛋。

呵呵,收工


昨天领悟到了几点

发表人:ganfei1983 | 发表时间: 2007年二月09日, 12:04

昨天算是悟出了几点道理:

1:如果今天步行自助游了,那就不要在晚上去买东西了。

2:如果很累了,但晚上真的要买东西了,去商场之前最好不要 吃辣的晚餐,因为上火。你别不信,一吃辣再去买东西准出事。

你信不?

种种迹象表明,种种事实证明,我说的都是对的。大家切记切记啊````````不然,等着挂吧!


博客今天重新开封

发表人:ganfei1983 | 发表时间: 2007年二月09日, 09:57

记得很久很就没写blog了,兴许还记得上次发文章时的场景。感觉那时是我一个时代的终结,另一个历史的起点。主题就是离开了,又开始了。

都几个月了,感触很多啊。可心里还是感觉自己没长大,有时好象还是18岁的心理,有时好象还是正常的。事情经历多一点,对自己都是不小的锻炼。

有一次,在小店里吃饭的时候,看了《大宅门》,那歌词写到“平生多磨砺,男儿自横行”,让我很受鼓舞。也从那时,走出了那段时间的颓废状态。

我喜欢夜深人静了,大家都在休息了,听自己的喜欢的音乐,看自己喜欢的电影,阅读自己喜欢的文字。只有在这时,我才让我远离尘世的喧嚣,感受到灵魂上的一丝宁静。


好累啊````

发表人:ganfei1983 | 发表时间: 2006年十二月23日, 01:02

项目紧张,工作日一天接着一天的做,周末等于没有,晚上还要熬夜弄到很长时间,感觉真的好累。 还好,还是学到了很多东西,现在对项目的把握与感觉比以前强很多了。

今天做完模块,来写写博客,实在是很久没来写了。刚才才无意看到一个消息,是关于什么交通事故的问题,看得我触目惊心,这才想到我这一向过马路,人都是飘的,从今往后要好好的过马路。哎```还是小心为好!

今天已经快月底了,项目时间太紧了,没时间去完成恒哥的文章了,还真不知道怎么给他说,怪不好意思的!明明是自己答应了,眼看就要完不成,又要食言了。我靠````我这是怎么拉?对不住人啊!等这个项目搞完,就要空一段时间了,好好的做做自己想做的事情。真他niang的不容易啊!额滴神啊````````

下个月起,我以前的状态应该就会回来了!加油!又拼一把了!


Valid XHTML 1.0 Strict and CSS. Powered by pLog
Design by Blog.lvwo.com