<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title></title>
    <description></description>
    <link>http://shanghui-12.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>DROOLS语法详解</title>
        <author>shanghui_12</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shanghui-12.javaeye.com">shanghui_12</a>&nbsp;
          链接：<a href="http://shanghui-12.javaeye.com/blog/190294" style="color:red;">http://shanghui-12.javaeye.com/blog/190294</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个典型的DRL文件：<br />①package com.sample   //包名，不可以与关键字冲突<br />②import com.sample.DroolsTest.Message;//本文件需要导入的类<br />③global java.util.List myGlobalList;//全局变量<br />④//定义函数体<br />function String hello(String name) {<br />    return "Hello "+name+"!";<br />}<br /><br />⑤rule "myRule"  <br />no-loop true  //执行一次后，是否能被再次激活<br />salience 100  //优先级别<br />⑥when  <br />m : Message( status == Message.HELLO, message : message ) <br />⑦then    <br />m.setMessage( "Goodbye cruel world" );<br />		m.setStatus( Message.GOODBYE );<br />		update( m );<br />    myGlobalList.add( "Hello World" );//使用global 变量<br />    System.out.println( hello( "Bob" ) );//调用定义函数<br />End<br /><br /><br />①package com.sample<br />包名，不可以与关键字冲突。一个包通过名称空间描绘，这样很好的保持了一组规则的独立性。<br />②import<br />标记就像java中的含义一样。对于任何要用在规则中的对象，你需要指定完整的路径和类型名。Drools从同名的java包中自动导入类。<br />③global<br />如果多个包定义了同样名称的全局变量，它们必须使用同样的类型，并且全部指向同一个全局值。全部变量通常用来返回数据，获得提供数据或服务给规则使用。为了使用全局变量，你必须：<br />在规则文件中声明全局变量并使用它，如：<br />global java.util.List myGlobalList;<br />rule "Using a global"<br />when<br />    eval( true )<br />then<br />    myGlobalList.add( "Hello World" );<br />end<br />在working memory上设置全局变量的值。最好是在将fact插入working memory之前设置完所有全局变量，如：<br />List list = new ArrayList();<br />WorkingMemory wm = rulebase.newStatefulSession();<br />wm.setGlobal( "myGlobalList", list );<br />④function<br />相对于正常的java类，函数是在你的规则代码中放置语言代码的方法。它们不可能做任何超过你可以在帮助类（在java中定义，被设置入规则的Working Memory中的类）中做到的事情。使用函数的优点是可以将逻辑保存在一个地方，并且你可以在需要的时候改变函数（这样做各有优缺点）。函数最大的用处是被规则的推论（then）部分中的行为所调用，特别是当一个行为操作需要反复被调用时（将公用代码抽取出来成为一个函数）。<br />⑤rule 名称可以在“”下取任何名字。<br />属性列表：<br />属性	类型	默认值	功能描述<br />no-loop	Boolean	false	设置no-loop为true可以阻止该规则被再次激活。<br />salience	integer	0	优先级数字高的规则会比优先级低的规则先执行。<br />agenda-group	String	MAIN	只有在具有焦点的agenda group中的规则才能够激发。<br />auto-focus	Boolean	false	如果该规则符合激活条件，则该规则所在agenda-group自动获得焦点，允许规则激发。<br />activation-group	String	N/A	在同名activation-group中的规则将以互斥的方式激发<br />dialect	String	"java" or "mvel"	指定在LHS代码表达式或RHS代码块中使用的语言。<br /> date-effective	String, 包含日期/时间定义	N/A	规则只能在date-effective指定的日期和时间之后激活。<br />date-exptires	String, 包含日期/时间定义	N/A	如果当前时间在date-expires指定的时间之后，规则不能激活。<br /><br />duration	long	N/A	指出规则将在指定的一段时间后激发，如果那个时候规则的激活条件还是处于true的情况下。<br />⑥  LHS (when) 条件元素<br />为了能够引用匹配的对象，使用一个模式绑定变量如‘$c’。变量的前缀使用的$是可选的，但是在复杂的规则中它会很方便用来区别变量与字段的不同。<br />$c : Cheese( type == "stilton", price &lt; 10, age == "mature" )<br />&& 和|| 约束连接符<br />Cheese( type == "stilton" && price &lt; 10, age == "mature" )<br />Cheese( type == "stilton" || price &lt; 10, age == "mature" ) <br />第一个有两个约束而第二个组有一个约束，可以通过圆括号来改变求值的顺序。<br />单值约束<br />Matches 操作<br />Cheese( type matches "(Buffalo)?\S*Mozerella" )<br />Cheese( type not matches "(Buffulo)?\S*Mozerella" )<br />Contains 操作<br />CheeseCounter( cheeses contains "stilton" )<br />CheeseCounter( cheeses not contains "cheddar" ) <br />memberof操作<br />CheeseCounter( cheese memberof $matureCheeses )<br />CheeseCounter( cheese not memberof $matureCheeses )<br />字符串约束<br />字符串约束是最简单的约束格式，将字段与指定的字符串求值：数值，日期，string或者boolean。<br />Cheese( quantity == 5 )<br />Cheese( bestBefore &lt; "27-Oct-2007" )<br />Cheese( type == "stilton" )<br />Cheese( smelly == true )<br />绑定变量约束<br />变量可以绑定到Fact和它们的字段，然后在后面的字段约束中使用。绑定变量被称为声明。有效的操作符由被约束的字段类型决定；在那里会进行强制转换。绑定变量约束使用'=='操作符，因为能够使用hash索引，因此提供非常快的执行速度。<br />Person( likes : favouriteCheese )<br />Cheese( type == likes )<br />返回值约束<br />返回值约束可以使用任何有效的Java元数据类型或对象。要避免使用任何Drools关键字作为声明标识。在返回值约束中使用的函数必须返回静态常量（time constant）结果。之前声明的绑定可以用在表达式中。<br />Person( girlAge : age, sex == "F" )<br />Person( age == ( girlAge + 2) ), sex == 'M' )<br />复合值约束<br />复合值约束用在可能有多个允许值的时候，当前只支持'in' 和'not in'两个操作。这些操作使用圆括号包含用逗号分开的值的列表，它可以是变量，字符串，返回值或限定标识符。'in' 和'not in'运算式实际上被语法分析器重写成多个!= and ==组成的多重约束。<br />Person( $cheese : favouriteCheese )<br />Cheese( type in ( "stilton", "cheddar", $cheese )<br />多重约束<br />多重约束允许你对一个字段通过使用'&&' 或者'||'约束连接符进行多个约束条件的判断。允许使用圆括号分组，它会让这种约束看起来更自然。<br />Person( age ( (> 30 && &lt; 40) || (> 20 && &lt; 25) ) ) <br />Person( age > 30 && &lt; 40 || location == "london" )<br />内联的Eval约束<br />eval约束可以使用任何有效的语言表达式，只要它最终能被求值为boolean元数据类型。表达式必须是静态常量（time constant）。任何在当前模式之前定义的变量都可以使用，自动代入（autovivification）机制用来自动建立字段绑定变量。当构建器发现标识不是当前定义的变量名是，它将尝试将它作为对象的字段来访问，这种情况下，构建器自动在inline-eval中建立该字段的同名变量。<br />Person( girlAge : age, sex = "F" )<br />Person( eval( girlAge == boyAge + 2 ), sex = 'M' )<br /><br />⑦RHS (then) 执行操作<br />这部分应当包含一系列需要执行的操作。规则的RHS部分应该保持简短的，这保持它是声明性和可读性的。如果你发现你需要在RHS中使用命令式或and/or条件代码，那你可能需要将规则拆分为多个规则。RHS的主要目的是插入，删除修改working memory数据。<br />"update(object, handle);" 将告诉引擎对象已经改变（已经被绑定到LHS中的那一个），并且规则需要重新检查。<br />"insert(new Something());" 将在working memory中放置一个你新建的对象。<br />"insertLogical(new Something());" 与insert类似，但是当没有更多的fact支持当前激发规则的真值状态时，对象自动删除。<br />"retract(handle);" removes an object from working memory.<br />⑧ Query<br />查询中仅仅包含规则LHS部分的结构（不用指定when或then）。它提供了查询working memory 中符合约束条件的对象的一个简单办法。<br />query "people over the age of 30" <br />    person : Person( age > 30 )<br />end<br />通过在返回的查询结果(QueryResults)上进行标准的for循环遍历，每一行将返回一个QueryResult，该对象可以用来存取组元中的每一个Column。这些Column可以通过声明的名称或索引位置存取。<br />QueryResults results = workingMemory.getQueryResults( "people over the age of 30" );<br />for ( Iterator it = results.iterator; it.hasNext(); ) {<br />    QueryResult result = ( QueryResult ) it.next();<br />    Person person = ( Person ) result.get( "person" );<br />    }
          <br/>
          <span style="color:red;">
            <a href="http://shanghui-12.javaeye.com/blog/190294#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 May 2008 16:47:21 +0800</pubDate>
        <link>http://shanghui-12.javaeye.com/blog/190294</link>
        <guid>http://shanghui-12.javaeye.com/blog/190294</guid>
      </item>
      <item>
        <title>jbpm入门建议</title>
        <author>shanghui_12</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shanghui-12.javaeye.com">shanghui_12</a>&nbsp;
          链接：<a href="http://shanghui-12.javaeye.com/blog/181773" style="color:red;">http://shanghui-12.javaeye.com/blog/181773</a>&nbsp;
          发表时间: 2008年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做了一周的入门研究工作，网上也找到大量文章，一步步照着做，能成功的很少。<br />都是程序员，男人何必为难男人？？<br />最后转念一想，反正是后台运行的东西，干吗非得都服务器发布，然后再到IE去看？还是建立后台访问，JUNIT测试不就OK了吗？管你界面怎么表现？调用成功实现的函数不就OK了吗？<br />清楚了这个方向，用eclipse3.2导入jbpm插件，建立jbpm过程，按照http://www.uml.org.cn/workclass/200709306.asp的步骤，虽然也会有些错误，但是在控制台打印以及JUNIT的错误提示可以很快解决问题。<br />所以象我一样的新手入门时候，想看例子，直接看jbpm包内自带例子就可以了，想迁移例子到这到那的，个人认为没有什么必要。<br />程序员所做的工作就是，尽快通过一个程序来明白，这个东西到底怎么个运行方式，以及内部结构，把大量工作按照高手的模式来学习，调试，没有必要。<br />因为java本来就是“一处运行，到处调试”的。
          <br/>
          <span style="color:red;">
            <a href="http://shanghui-12.javaeye.com/blog/181773#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Apr 2008 14:35:31 +0800</pubDate>
        <link>http://shanghui-12.javaeye.com/blog/181773</link>
        <guid>http://shanghui-12.javaeye.com/blog/181773</guid>
      </item>
      <item>
        <title>技术博客开张</title>
        <author>shanghui_12</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shanghui-12.javaeye.com">shanghui_12</a>&nbsp;
          链接：<a href="http://shanghui-12.javaeye.com/blog/175939" style="color:red;">http://shanghui-12.javaeye.com/blog/175939</a>&nbsp;
          发表时间: 2008年03月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          怎么说也毕业一年多了，不该只看不写啦，刚好赶上机会，不再是只管自己模块开发的程序员了，以后的工作需要为公司大局着想，从一个菜鸟级的技术人员慢慢成长吧。<br />基于SSH模式开发的程序员，好象很少能有自己的思想在程序里面，一张表数据信息到一个列表页面和一个修改详细信息页面，按照规范，机器式的写入，甚至有牛人可以完全用工具生成所有这些代码。而后来觉得struts不爽了（因为本人的主要工作为OA开发，所以一般为局域网内，可以采用大量JS框架），能用dwr的都不用它了。当然，个人对于其安全还是有怀疑的，所以涉及金融啥的，还是老实用struts吧。<br />个人得转型到金融行业，所以还是得考虑模式~~今天先到这里。
          <br/>
          <span style="color:red;">
            <a href="http://shanghui-12.javaeye.com/blog/175939#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 25 Mar 2008 17:54:58 +0800</pubDate>
        <link>http://shanghui-12.javaeye.com/blog/175939</link>
        <guid>http://shanghui-12.javaeye.com/blog/175939</guid>
      </item>
  </channel>
</rss>