﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-apple0668</title><link>http://www.blogjava.net/apple0668/</link><description>TDD,Agile,Scrum,Core Java,J2EE,Investment Blank</description><language>zh-cn</language><lastBuildDate>Sun, 08 Mar 2026 04:41:00 GMT</lastBuildDate><pubDate>Sun, 08 Mar 2026 04:41:00 GMT</pubDate><ttl>60</ttl><item><title>Ehcache集群方案</title><link>http://www.blogjava.net/apple0668/archive/2015/03/18/423596.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Wed, 18 Mar 2015 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2015/03/18/423596.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/423596.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2015/03/18/423596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/423596.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/423596.html</trackback:ping><description><![CDATA[最近项目中用到ehcache集群，就上网搜索一通，有几种方式可以实现ehcache集群。<br />1.是RMI方式点对点方式，手动方式，这种方式网上搜索结果大部分都可以用，优点同步可靠，唯一缺点就是部署多个应用需要改配置文件，这样增加部署的复杂性。<br />2.是RMI的广播形式，自动方式，指定相关广播的IP范围和端口，优点部署应用不用改配置文件，多个应用同一套配置文件，缺点，广播方式不稳定。<br />3.通过JGOUP方式，这种方式需要额外增加jgoup的jar包和jgroupreplication包，网上搜索90%配置都是抄来抄去不可用，最苦逼的是连ehcache官网的配置都不可用，最终还是terracotta论坛找到相关解决方案，优点，多个应用公用一套配置文件，集群稳定，缺点，需要增加额外的支持jar包。<img src ="http://www.blogjava.net/apple0668/aggbug/423596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2015-03-18 22:05 <a href="http://www.blogjava.net/apple0668/archive/2015/03/18/423596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MongoDB安装手记</title><link>http://www.blogjava.net/apple0668/archive/2012/07/07/382479.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Sat, 07 Jul 2012 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2012/07/07/382479.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/382479.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2012/07/07/382479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/382479.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/382479.html</trackback:ping><description><![CDATA[简介：<br />MongoDB是一个高性能，开源，无模式的文档型数据库，是当前<span class="red">NoSql</span>数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式。Mongo使用C++开发。<br />安装：<br />软硬件环境<br />-----------------------<br />系统：win7 64bit<br />数据库：Mongo-2.0.6<br />-----------------------<br />下载地址：<a href="http://www.mongodb.org/downloads">http://www.mongodb.org/downloads</a><br />按照自己需要下载对应操作系统的数据库版本。<br />目前由于我的是64系统，下载对应64位的数据库。<br /><br />Step1：解压MongoDB目录为C:\mongodb<br />Step2：创建E:\MongoDB\data，指定数据库存储目录E:\MongoDB\data，操作如下<br />C:\mongodb\bin\mongod --dbpath E:\MongoDB\data<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/apple0668/mongodb.jpg" width="837" height="586" /><br /><br /><br />测试数据库是否安装成功：浏览器输入<a href="http://localhost:27017/">http://localhost:27017/</a><br />结果：<pre>You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
</pre>安装成功，可以使用MongoDB进行开发工作了。<br /><br /><span>然后运行mongo即可连接到test数据库，你就可以进行数据操作。运行help显示帮助命令行。</span><br />双击：C:\mongodb\bin\mongo.exe,输入help帮助命令<br /><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/apple0668/dbhelp.jpg" /><br /><br /><br />就可以在命令行下面进行数据库操作了。<br />&nbsp;<img src ="http://www.blogjava.net/apple0668/aggbug/382479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2012-07-07 22:11 <a href="http://www.blogjava.net/apple0668/archive/2012/07/07/382479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>任何人都可以重构&lt;转载&gt;</title><link>http://www.blogjava.net/apple0668/archive/2012/04/28/376978.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Sat, 28 Apr 2012 07:56:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2012/04/28/376978.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/376978.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2012/04/28/376978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/376978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/376978.html</trackback:ping><description><![CDATA[<p>原文：<a href="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/">https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/</a><a name="N10046"><span class="atitle"><br />为什么重构?</span></a></p>
<p><em>重构</em>是指在不改变程序功能的前提下改变其结构。重构是一项功能强大的技术，但是执行起来需要倍加小心才行。主要的危险在于可能在不经意中引入一些错误，尤其是在进行手工重构的时候更是如此。这种危险引发了对重构技术的普遍批评：当代码不会崩溃的时候为什么要修改它呢？ </p>
<p>您需要进行代码重构的原因可能有以下几个：传说中的第一个原因是：需要继承为某个古老产品而开发的年代久远的代码，或者突然碰到这些代码。最初的开发团队已经不在了。我们必须创建增加了新特性的新版本软件，但是这些代码已经无法理解了。新的开发队伍夜以继日地工作，破译代码然后映射代码，经过大量的规划与设计之后，人们将这些代码分割成碎片。历经重重磨难之后，所有这些东西都按照新版本的要求归位了。这是英雄般的重构故事，几乎没有人能在经历了这些之后活着讲述这样的故事。</p>
<p>还有一种现实一些的情况是项目中加入了新的需求，需要对设计进行修改。至于是因为在最初的规划过程中失察，还是由于采用了迭代式的开发过程（比如敏捷开发，或者是测试驱动的开发）而在开发过程中有意引入需求，这两者并没有实质性的区别。这样的重构的规模要小得多，其内容一般涉及通过引入接口或者抽象类来更改类的继承关系，以及对类进行分割和重新组织，等等。</p>
<p>重构的最后一个原因是，当存在可用的自动重构工具时，可以有一个用来预先生成代码的快捷方式&#8212;&#8212;就好比在您无法确定如何拼写某个单词的时候，可以用某种拼写检查工具输入这个单词。比如说，您可以用这种平淡无奇的重构方法生成 getter 和 setter 方法，一旦熟悉了这样的工具，它就可以为您节省很多的时间。</p>
<p>Eclipse 的重构工具无意进行英雄级的重构&#8212;&#8212;适合这种规模的工具几乎没有&#8212;&#8212;但是不论是否用到敏捷开发技术，Eclipse 的工具对于一般程序员修改代码的工作都具有无法衡量的价值。毕竟任何复杂的操作只要能够自动进行，就可以不那么烦闷了。只要您知道 Eclipse 实现了什么样的重构工具，并理解了它们的适用情况，您的生产力就会得到极大的提高。</p>
<p>要降低对代码造成破坏的风险，有两种重要的方法。第一种方法是对代码进行一套完全彻底的单元测试：在重构之前和之后都必须通过这样的测试。第二种方法是使用自动化的工具来进行重构，比如说 Eclipse 的重构特性。</p>
<p>将彻底的测试与自动化重构结合起来就会更加有效了，这样重构也就从一种神秘的艺术变成了有用的日常工具。为了增加新的功能或者改进代码的可维护性，我们可以在不影响原有代码功能的基础上迅速且安全地改变其结构。这种能力会对您设计和开发代码的方式产生极大的影响，即便是您没有将其结合到正式的敏捷方法中也没有关系。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/#ibm-pcon">回页首</a></p>
<p><a name="N10064"><span class="atitle">Eclipse 中重构的类型</span></a></p>
<p>Eclipse 的重构工具可以分为三大类（下面的顺序也就是这些工具在 Refactoring 菜单中出现的顺序）：</p>
<ol><li>对代码进行重命名以及改变代码的物理结构，包括对属性、变量、类以及接口重新命名，还有移动包和类等。</li><li>改变类一级的代码逻辑结构，包括将匿名类转变为嵌套类，将嵌套类转变为顶级类、根据具体的类创建接口，以及从一个类中将方法或者属性移到子类或者父类中。</li><li>改变一个类内部的代码，包括将局部变量变成类的属性、将某个方法中选中部分的代码变成一个独立的方法、以及为属性生成 getter 和 setter 方法。</li></ol>
<p>还有几个重构工具并不能完全归入这三个种类，特别是 Change Method Signature，不过在本文中还是将这个工具归入第三类。除了这种例外情况以外，本文下面几节都是按照上面的顺序来讨论 Eclipse 重构工具的。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/#ibm-pcon">回页首</a></p>
<p><a name="N1007C"><span class="atitle">物理重组与重命名</span></a></p>
<p>显然，您即便没有特别的工具，也可以在文件系统中重命名文件或者是移动文件，但是如果操作对象是 Java 源代码文件，您就需要编辑很多文件，更新其中的 <code>import </code>或 <code>package </code>语句。与此类似，用某种文本编辑器的搜索与替换功能也可以很容易地给类、方法和变量重新命名，但是这样做的时候必须十分小心，因为不同的类可能具有名称相似的方法或者变量；要是从头到尾检查项目中所有的文件，来保证每个东西的标识和修改的正确性，那可真够乏味的。 </p>
<p>Eclipse 的 Rename 和 Move 工具能够十分聪明地在整个项目中完成这样的修改，而不需要用户的干涉。这是因为 Eclipse 可以理解代码的语义，从而能够识别出对某个特定方法、变量或者类名称的引用。简化这一任务有助于确保方法、变量和类的名称能够清晰地指示其用途。</p>
<p>我们经常可以发现代码的名字不恰当或者令人容易误解，这是因为代码与最初设计的功能有所不同。比方说，某个用来在文件中查找特定单词的程序也许会扩展为在 Web 页面中通过 URL 获取 <code>InputStream </code>的操作。如果这一输入流最初叫做 <code>file</code> ，那么就应该修改它的名字，以便能反映其新增的更加一般的特性，比方说 <code>sourceStream</code> 。开发人员经常无法成功地修改这些名称，因为这个过程是十分混乱和乏味的。这当然也会把下一个不得不对这些类进行操作的开发人员弄糊涂。 </p>
<p>要对某个 Java 元素进行重命名，只需要简单地从 Package Explorer 视图中点击这个元素，或者从Java 源代码文件中选中这个元素，然后选择菜单项 <strong>Refactor &gt; Rename</strong>。在对话框中输入新的名称，然后选择是否需要 Eclipse 也改变对这个名称的引用。实际显示出来的确切内容与您所选元素的类型有关。比方说，如果选择的属性具有 getter 和 setter 方法，那么也就可以同时更新这些方法的名称，以反映新的属性。图1显示了一个简单的例子。 </p>
<p><a name="figure1"><strong>图 1. 重命名一个局部变量</strong> </a><br /><img alt="Renaming a local variable" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/rename.gif" width="488" height="221" /> </p>
<p>就像所有的 Eclipse 重构操作一样，当您指定了全部用来执行重构的必要信息之后，您就可以点击 <strong>Preview</strong> 按钮，然后在一个对话框中对比 Eclipse 打算进行哪些变更，您可以分别否决或者确认每一个受到影响的文件中的每一项变更。如果您对于 Eclipse 正确执行变更的能力有信心的话，您可以只按下 <strong>OK</strong>按钮。显然，如果您不确定重构到底做了什么事情，您就会想先预览一下，但是对于 Rename 和 Move 这样简单的重构而言，通常没有必要预览。 </p>
<p>Move 操作与 Rename 十分相似：您选择某个 Java 元素（通常是一个类），为其指定一个新位置，并定义是否需要更新引用。然后，您可以选择 <strong>Preview</strong>检查变更情况，或者选择 <strong>OK</strong> 立即执行重构，如图2所示。 </p>
<p><a name="figure2"><strong>图 2. 将类从一个包移到另一个包</strong> </a><br /><img alt="Moving a class" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/move.gif" width="513" height="569" /> </p>
<p>在某些平台上（特别是 Windows），您还可以在 Package Explorer 视图中通过简单拖放的方法将类从一个包或者文件夹中移到另一个包或文件夹中。所有的引用都会自动更新。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/#ibm-pcon">回页首</a></p>
<p><a name="N100DE"><span class="atitle">重新定义类的关系</span></a></p>
<p>Eclipse 中有大量的重构工具，使您能够自动改变类的关系。这些重构工具并没有 Eclipse 提供的其他工具那么常用，但是很有价值，因为它们能够执行非常复杂的任务。可以说，当它们用得上的时候，就会非常有用。</p>
<p><a name="N100E7"><span class="smalltitle">提升匿名类与嵌套类</span></a></p>
<p>Convert Anonymous Class（转换匿名类）和 Convert Nested Type（转换嵌套类）这两种重构方法比较相似，它们都将某个类从其当前范围移动到包含这个类的范围上。</p>
<p>匿名类是一种语法速写标记，使您能够在需要实现某个抽象类或者接口的地方创建一个类的实例，而不需要显式提供类的名称。比如在创建用户界面中的监听器时，就经常用到匿名类。在清单1中，假设 Bag 是在其他地方定义的一个接口，其中声明了两个方法， <code>get() </code>和 <code>set()</code> 。 </p><br /><a name="N100FB"><strong>清单 1. Bag 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"> 
      public class BagExample
{
   void processMessage(String msg)
   {
      Bag bag = new Bag()
      {
         Object o;
         public Object get()
         {
            return o;
         }
         public void set(Object o)
         {
            this.o = o;
         }
      };
      bag.set(msg);
      MessagePipe pipe = new MessagePipe();
      pipe.send(bag);
   }
}
</pre></td></tr></tbody></table><br />
<p>当匿名类变得很大，其中的代码难以阅读的时候，您就应该考虑将这个匿名类变成严格意义上的类；为了保持封装性（换句话说，就是将它隐藏起来，使得不必知道它的外部类不知道它），您应该将其变成嵌套类，而不是顶级类。您可以在这个匿名类的内部点击，然后选择 <strong>Refactor &gt; Convert Anonymous Class to Nested </strong>就可以了。当出现确认对话框的时候，为这个类输入名称，比如 <code>BagImpl</code> ，然后选择 <strong>Preview</strong>或者 <strong>OK</strong>。这样，代码就变成了如清单2所示的情形。 </p><br /><a name="N10115"><strong>清单 2. 经过重构的 Bag 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode"> 
public class BagExample
{
   private final class BagImpl implements Bag
   {
      Object o;
      public Object get()
      {
         return o;
      }
      public void set(Object o)
      {
         this.o = o;
      }
   }
       
   void processMessage(String msg)
   {
     Bag bag = new BagImpl();
     bag.set(msg);
     MessagePipe pipe = new MessagePipe();
     pipe.send(bag);
   }
}</pre></td></tr></tbody></table><br />
<p>当您想让其他的类使用某个嵌套类时，Convert Nested Type to Top Level 就很有用了。比方说，您可以在一个类中使用值对象，就像上面的 <code>BagImpl</code> 类那样。如果您后来又决定应该在多个类之间共享这个数据，那么重构操作就能从这个嵌套类中创建新的类文件。您可以在源代码文件中高亮选中类名称（或者在 Outline 视图中点击类的名称），然后选择 <strong>Refactor &gt; Convert Nested Type to Top Level</strong>，这样就实现了重构。 </p>
<p>这种重构要求您为装入实例提供一个名字。重构工具也会提供建议的名称，比如 <code>example</code> ，您可以接受这个名字。这个名字的意思过一会儿就清楚了。点击 <strong>OK</strong> 之后，外层类 <code>BagExample</code> 就会变成清单3所示的样子。 </p><br /><a name="N10137"><strong>清单 3. 经过重构的 Bag 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class BagExample
{
   void processMessage(String msg)
   {
      Bag bag = new BagImpl(this);
      bag.set(msg);
      MessagePipe pipe = new MessagePipe();
      pipe.send(bag);
   }
}
</pre></td></tr></tbody></table><br />
<p>请注意，当一个类是嵌套类的时候，它可以访问其外层类的成员。为了保留这种功能，重构过程将一个装入类 <strong>BagExample</strong> 的实例放在前面那个嵌套类中。这就是之前要求您输入名称的实例变量。同时也创建了用于设置这个实例变量的构造函数。重构过程创建的新类 <strong>BagImpl</strong> 如清单4所示。 </p><br /><a name="N1014A"><strong>清单 4. BagImpl 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">  
final class BagImpl implements Bag
{
   private final BagExample example;
   /**
    * @paramBagExample
    */
  BagImpl(BagExample example)
   {
      this.example = example;
      // TODO Auto-generated constructor stub
   }
   Object o;
   public Object get()
   {
      return o;
   }
   public void set(Object o)
   {
      this.o = o;
   }
}
</pre></td></tr></tbody></table><br />
<p>如果您的情况与这个例子相同，不需要保留对 <code>BagExample</code> 的访问，您也可以很安全地删除这个实例变量与构造函数，将 <code>BagExample</code> 类中的代码改成缺省的无参数构造函数。 </p>
<p><a name="N1015F"><span class="smalltitle">在类继承关系内移动成员</span></a></p>
<p>还有两个重构工具，Push Down 和 Pull Up，分别实现将类方法或者属性从一个类移动到其子类或父类中。假设您有一个名为 <code>Vehicle </code>的抽象类，其定义如清单5所示。 </p><br /><a name="N1016C"><strong>清单 5. 抽象的 Vehicle 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public abstract class Vehicle
{
   protected int passengers;
   protected String motor;
   
   public int getPassengers()
   {
      return passengers;
   }
   public void setPassengers(int i)
   {
      passengers = i;
   }
   public String getMotor()
   {
      return motor;
   }
   public void setMotor(String string)
   {
      motor = string;
   }
}
</pre></td></tr></tbody></table><br />
<p>您还有一个 <code>Vehicle</code> 的子类，类名为 <code>Automobile</code> ，如清单6所示。 </p><br /><a name="N10181"><strong>清单6. Automobile 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class Automobile extends Vehicle
{
   private String make;
   private String model;
   public String getMake()
   {
      return make;
   }
   public String getModel()
   {
      return model;
   }
   public void setMake(String string)
   {
      make = string;
   }
   public void setModel(String string)
   {
      model = string;
   }
}
</pre></td></tr></tbody></table><br />
<p>请注意， <code>Vehicle</code> 有一个属性是 <code>motor</code> 。如果您知道您将永远只处理汽车，那么这样做就好了；但是如果您也允许出现划艇之类的东西，那么您就需要将 <code>motor </code>属性从 <code>Vehicle</code> 类下放到 <code>Automobile </code>类中。为此，您可以在 Outline 视图中选择 <code>motor</code> ，然后选择 <strong>Refactor &gt; Push Down</strong>。 </p>
<p>Eclipse 还是挺聪明的，它知道您不可能总是单单移动某个属性本身，因此还提供了 <strong>Add Required </strong>按钮，不过在 Eclipse 2.1 中，这个功能并不总是能正确地工作。您需要验证一下，看所有依赖于这个属性的方法是否都推到了下一层。在本例中，这样的方法有两个，即与 <code>motor</code> 相伴的 getter 和 setter 方法，如图3所示。 </p>
<p><a name="figure3"><strong>图 3. 加入所需的成员</strong> </a><br /><img alt="Adding required members" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/pushdown.gif" width="488" height="427" /> </p>
<p>在按过 <strong>OK</strong>按钮之后， <code>motor</code> 属性以及 <code>getMotor() </code>和 <code>setMotor()</code> 方法就会移动到 <code>Automobile</code> 类中。清单7显示了在进行了这次重构之后 <code>Automobile</code> 类的情形。 </p><br /><a name="N101DF"><strong>清单 7. 经过重构的 Automobile 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class Automobile extends Vehicle
{
   private String make;
   private String model;
   protected String motor;
   public String getMake()
   {
      return make;
   }
   public String getModel()
   {
      return model;
   }
   public void setMake(String string)
   {
      make = string;
   }
   public void setModel(String string)
   {
      model = string;
   }
   public String getMotor()
   {
      return motor;
   }
   public void setMotor(String string)
   {
      motor = string;
   }
}
</pre></td></tr></tbody></table><br />
<p>Pull Up 重构与 Push Down 几乎相同，当然 Pull Up 是将类成员从一个类中移到其父类中，而不是子类中。如果您稍后改变主意，决定还是把 <code>motor</code> 移回到 <code>Vehicle</code> 类中，那么您也许就会用到这种重构。同样需要提醒您，一定要确认您是否选择了所有必需的成员。 </p>
<p><code>Automobile</code> 类中具有成员 motor，这意味着您如果创建另一个子类，比方说 <code>Bus</code> ，您就还需要将 <code>motor</code> （及其相关方法）加入到 <code>Bus</code> 类中。有一种方法可以表示这种关系，即创建一个名为 <code>Motorized </code>的接口， <code>Automobile</code> 和 <code>Bus</code> 都实现这个接口，但是 <code>RowBoat</code> 不实现。 </p>
<p>创建 <code>Motorized</code> 接口最简单的方法是在 <code>Automobile </code>上使用 Extract Interface 重构。为此，您可以在 Outline 视图中选择 <code>Automobile</code> ，然后从菜单中选择 <strong>Refactor &gt; Extract Interface</strong>。您可以在弹出的对话框中选择您希望在接口中包含哪些方法，如图4所示。 </p>
<p><a name="figure4"><strong>图 4. 提取 Motorized 接口</strong> </a><br /><img alt="Motorized interface" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/motorized.gif" width="580" height="378" /> </p>
<p>点击 OK 之后，接口就创建好了，如清单8所示。</p><br /><a name="N1023F"><strong>清单 8. Motorized 接口</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public interface Motorized
{
   public abstract String getMotor();
   public abstract void setMotor(String string);
}
</pre></td></tr></tbody></table><br />
<p>同时， <code>Automobile</code> 的类声明也变成了下面的样子： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class Automobile extends Vehicle implements Motorized
</pre></td></tr></tbody></table><br />
<p><a name="N10254"><span class="smalltitle">使用父类</span></a></p>
<p>本重构工具类型中最后一个是 User Supertyp Where Possible。想象一个用来管理汽车细帐的应用程序。它自始至终都使用 <code>Automobile</code> <code></code>类型的对象。如果您想处理所有类型的交通工具，那么您就可以用这种重构将所有对 <code>Automobile </code>的引用都变成对 Vehicle 的引用（参看图5）。如果您在代码中用 <code>instanceof</code> 操作执行了任何类型检查的话，您将需要决定在这些地方适用的是原先的类还是父类，然后选中第一个选项&#8220;Use the selected supertype in 'instanceof' expressions&#8221;。 </p>
<p><a name="figure5"><strong>图 5. 将 Automobile 改成其父类 Vehicle</strong> </a><br /><img alt="Supertype" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/supertype.gif" width="488" height="266" /> </p>
<p>使用父类的需求在 Java 语言中经常出现，特别是在使用了 Factory Method 模式的情况下。这种模式的典型实现方式是创建一个抽象类，其中具有静态方法 <code>create()</code> ，这个方法返回的是实现了这个抽象类的一个具体对象。如果需创建的具体对象的类型依赖于实现的细节，而调用类对实现细节并不感兴趣的情况下，可以使用这一模式。 </p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top"><a class="ibm-anchor-up-link" href="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/#ibm-pcon">回页首</a></p>
<p><a name="N10286"><span class="atitle">改变类内部的代码</span></a></p>
<p>最大一类重构是实现了类内部代码重组的重构方法。在所有的重构方法中，只有这类方法允许您引入或者移除中间变量，根据原有方法中的部分代码创建新方法，以及为属性创建 getter 和 setter 方法。</p>
<p><a name="N1028F"><span class="smalltitle">提取与内嵌</span></a></p>
<p>有一些重构方法是以 Extract 这个词开头的：Extract Method、Extract Local Variable 以及Extract Constants。第一个 Extract Method 的意思您可能已经猜到了，它根据您选中的代码创建新的方法。我们以清单8中那个类的 <code>main() </code>方法为例。它首先取得命令行选项的值，如果有以 -D 开头的选项，就将其以名-值对的形式存储在一个 <code>Properties</code> 对象中。 </p><br /><a name="N102A0"><strong>清单 8. main()</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">import java.util.Properties;
import java.util.StringTokenizer;
public class StartApp
{
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i= 0; i &lt; args.length; i++)
      {
         if(args[i].startsWith("-D"))
         {
           String s = args[i].substring(2);
           StringTokenizer st = new StringTokenizer(s, "=");
            if(st.countTokens() == 2)
            {
              props.setProperty(st.nextToken(), st.nextToken());
            }
         }
      }
      //continue...
   }
}
</pre></td></tr></tbody></table><br />
<p>将一部分代码从一个方法中取出并放进另一个方法中的原因主要有两种。第一种原因是这个方法太长，并且完成了两个以上逻辑上截然不同的操作。（我们不知道上面那个 <code>main() </code>方法还要处理哪些东西，但是从现在掌握的证据来看，这不是从其中提取出一个方法的理由。）另一种原因是有一段逻辑上清晰的代码，这段代码可以被其他方法重用。比方说在某些时候，您发现自己在很多不同的方法中都重复编写了相同的几行代码。那就有可能是需要重构的原因了，不过除非真的需要重用这部分代码，否则您很可能并不会执行重构。 </p>
<p>假设您还需要在另外一个地方解析名-值对，并将其放在 <code>Properties</code> 对象中，那么您可以将包含 <code>StringTokenizer</code> 声明和下面的 <code>if</code> 语句的这段代码抽取出来。为此，您可以高亮选中这段代码，然后从菜单中选择 <strong>Refactor &gt; Extract Method</strong>。您需要输入方法名称，这里输入 <code>addProperty</code> ，然后验证这个方法的两个参数， <code>Properties prop </code>和 <code>Strings</code> 。清单9显示由 Eclipse 提取了 <code>addProp() </code>方法之后类的情况。 </p><br /><a name="N102D3"><strong>清单 9. 提取出来的 addProp()</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">import java.util.Properties;
import java.util.StringTokenizer;
public class Extract
{
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i = 0; i &lt; args.length; i++)
      {
         if (args[i].startsWith("-D"))
         {
            String s = args[i].substring(2);
            addProp(props, s);
         }
      }
   }
   private static void addProp(Properties props, String s)
   {
      StringTokenizer st = new StringTokenizer(s, "=");
      if (st.countTokens() == 2)
      {
         props.setProperty(st.nextToken(), st.nextToken());
      }
   }
}
</pre></td></tr></tbody></table><br />
<p>Extract Local Variable 重构取出一段被直接使用的表达式，然后将这个表达式首先赋值给一个局部变量。然后在原先使用那个表达式的地方使用这个变量。比方说，在上面的方法中，您可以高亮选中对 <code>st.nextToken() </code>的第一次调用，然后选择 <strong>Refactor &gt; Extract Local Variable</strong>。您将被提示输入一个变量名称，这里输入 <code>key</code> 。请注意，这里有一个将被选中表达式所有出现的地方都替换成新变量的引用的选项。这个选项通常是适用的，但是对这里的 <code>nextToken() </code>方法不适用，因为这个方法（显然）在每一次调用的时候都返回不同的值。确认这个选项未被选中。参见图6。 </p>
<p><a name="figure6"><strong>图 6. 不全部替换所选的表达式</strong> </a><br /><img alt="Extract variable" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/extractvariable.gif" width="569" height="271" /> </p>
<p>接下来，在第二次调用 <code>st.nextToken() </code>的地方重复进行重构，这一次调用的是一个新的局部变量 <code>value</code> 。清单10显示了这两次重构之后代码的情形。 </p><br /><a name="N1030C"><strong>清单 10. 重构之后的代码</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">private static void addProp(Properties props, String s)
   {
     StringTokenizer st = new StringTokenizer(s, "=");
      if(st.countTokens() == 2)
      {
         String key = st.nextToken();
         String value = st.nextToken();
        props.setProperty(key, value);
      }
   }
</pre></td></tr></tbody></table><br />
<p>用这种方式引入变量有几点好处。首先，通过为表达式提供有意义的名称，可以使得代码执行的任务更加清晰。第二，代码调试变得更容易，因为我们可以很容易地检查表达式返回的值。最后，在可以用一个变量替换同一表达式的多个实例的情况下，效率将大大提高。</p>
<p>Extract Constant 与 Extract Local Variable 相似，但是您必须选择静态常量表达式，重构工具将会把它转换成静态的 final 常量。这在将硬编码的数字和字符串从代码中去除的时候非常有用。比方说，在上面的代码中我们用&#8220;-D&#8221;这一命令行选项来定义名-值对。先将&#8220;-D&#8221;高亮选中，选择 <strong>Refactor &gt; Extract Constant</strong>，然后输入 DEFINE 作为常量的名称。重构之后的代码如清单11所示： </p><br /><a name="N1031F"><strong>清单 11. 重构之后的代码</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class Extract
{
   private static final String DEFINE = "-D";
   public static void main(String[] args)
   {
      Properties props = new Properties();
      for (int i = 0; i &lt; args.length; i++)
      {
         if (args[i].startsWith(DEFINE))
         {
            String s = args[i].substring(2);
            addProp(props, s);
         }
      }
   }
   // ...
</pre></td></tr></tbody></table><br />
<p>对于每一种 Extract... 类的重构，都存在对应的 Inline... 重构，执行与之相反的操作。比方说，如果您高亮选中上面代码中的变量 s，选择 <strong>Refactor &gt; Inline...</strong>，然后点击 <strong>OK</strong>，Eclipse 就会在调用 <code>addProp() </code>的时候直接使用 <code>args[i].substring(2) </code>这个表达式，如下所示： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">        if(args[i].startsWith(DEFINE))
         {
            addProp(props,args[i].substring(2));
         }</pre></td></tr></tbody></table><br />
<p>这样比使用临时变量效率更高，代码也变得更加简要，至于这样的代码是易读还是含混，就取决于您的观点了。不过一般说来，这样的内嵌重构没什么值得推荐的地方。</p>
<p>您可以按照用内嵌表达式替换变量的相同方法，高亮选中方法名，或者静态 final 常量，然后从菜单中选择 <strong>Refactor &gt; Inline...</strong>，Eclipse 就会用方法的代码替换方法调用，或者用常量的值替换对常量的引用。 </p>
<p><a name="N10347"><span class="smalltitle">封装属性</span></a></p>
<p>通常我们认为将对象的内部结构暴露出来是一种不好的做法。这也正是 <code>Vehicle</code> 类及其子类都具有 private 或者 protected 属性，而用 public setter 和 getter 方法来访问属性的原因。这些方法可以用两种不同的方式自动生成。 </p>
<p>第一种生成这些方法的方式是使用 <strong>Source &gt; Generate Getter and Setter </strong>菜单。这将会显示一个对话框，其中包含所有尚未存在的 getter 和 setter 方法。不过因为这种方式没有用新方法更新对这些属性的引用，所以并不算是重构；必要的时候，您必须自己完成更新引用的工作。这种方式可以节约很多时间，但是最好是在一开始创建类的时候，或者是向类中加入新属性的时候使用，因为这些时候还不存在对属性的引用，所以不需要再修改其他代码。 </p>
<p>第二种生成 getter 和 setter 方法的方式是选中某个属性，然后从菜单中选择 <strong>Refactor &gt; Encapsulate Field</strong>。这种方式一次只能为一个属性生成 getter 和 setter 方法，不过它与 <strong>Source &gt; Generate Getter and Setter </strong>相反，可以将对这个属性的引用改变成对新方法的调用。 </p>
<p>例如，我们可以先创建一个新的简版 <code>Automobile</code> 类，如清单12所示。 </p><br /><a name="N1036A"><strong>清单 12. 简单的 Automobile 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class Automobile extends Vehicle
{
   public String make;
   public String model;
}
</pre></td></tr></tbody></table><br />
<p>接下来，创建一个类实例化了 <code>Automobile</code> 的类，并直接访问 <code>make</code> 属性，如清单13所示。 </p><br /><a name="N1037F"><strong>清单 13. 实例化 Automobile</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class AutomobileTest
{
   public void race()
   {
      Automobilecar1 = new Automobile();
      car1.make= "Austin Healy";
      car1.model= "Sprite";
      // ...
   }
}</pre></td></tr></tbody></table><br />
<p>现在封装 <code>make</code> 属性。先高亮选中属性名称，然后选择 <strong>Refactor &gt; Encapsulate Field</strong>。在弹出的对话框中输入 getter 和 setter 方法的名称&#8212;&#8212;如您所料，缺省的方法名称分别是 getMake() 和 setMake()。您也可以选择与这个属性处在同一个类中的方法是继续直接访问该属性，还是像其他类那样改用这些访问方法。（有一些人非常倾向于使用这两种方式的某一种，不过碰巧在这种情况下您选择哪一种方式都没有区别，因为 <code>Automobile </code>中没有对 <code>make</code> 属性的引用。） </p>
<p><a name="figure7"><strong>图7. 封装属性</strong> </a><br /><img alt="Encapsulating a field" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/encapsulate.gif" width="504" height="276" /> </p>
<p>点击 <strong>OK</strong>之后， <strong>Automobile</strong> 类中的 <code>make</code> 属性就变成了私有属性，也同时具有了 <code>getMake() </code>和 <code>setMake() </code>方法。 </p>
<p>&gt; </p><br /><a name="N103C4"><strong>清单 14. 经过重构的 Automobile 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class Automobile extends Vehicle
{
   private String make;
   public String model;
   public void setMake(String make)
   {
      this.make = make;
   }
   public String getMake()
   {
      return make;
   }
}
</pre></td></tr></tbody></table><br />
<p><code>AutomobileTest</code> 类也要进行更新，以便使用新的访问方法，如清单15所示。 </p><br /><a name="N103D5"><strong>&gt;清单 15. AutomobileTest 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class AutomobileTest
{
   public void race()
   {
      Automobilecar1 = new Automobile();
      car1.setMake("Austin Healy");
      car1.model= "Sprite";
      // ...
   }
}</pre></td></tr></tbody></table><br />
<p><a name="N103DF"><span class="smalltitle">改变方法的签名</span></a></p>
<p>本文介绍的最后一个重构方法也是最难以使用的方法：Change Method Signature（改变方法的签名）。这种方法的功能显而易见&#8212;&#8212;改变方法的参数、可见性以及返回值的类型。而进行这样的改变对于调用这个方法的其他方法或者代码会产生什么影响，就不是那么显而易见了。这么也没有什么魔方。如果代码的改变在被重构的方法内部引发了问题&#8212;&#8212;变量未定义，或者类型不匹配&#8212;&#8212;重构操作将对这些问题进行标记。您可以选择是接受重构，稍后改正这些问题，还是取消重构。如果这种重构在其他的方法中引发问题，就直接忽略这些问题，您必须在重构之后亲自修改。</p>
<p>为澄清这一点，考虑清单16中列出的类和方法。</p><br /><a name="N103EB"><strong>清单 16. MethodSigExample 类</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public class MethodSigExample
{
   public int test(String s, int i)
   {
      int x = i + s.length();
      return x;
   }
}
</pre></td></tr></tbody></table><br />
<p>上面这个类中的 <code>test() </code>方法被另一个类中的方法调用，如清单17所示。 </p><br /><a name="N103FC"><strong>清单 17. callTest 方法</strong></a><br />
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">public void callTest()
   {
     MethodSigExample eg = new MethodSigExample();
     int r = eg.test("hello", 10);
   }</pre></td></tr></tbody></table><br />
<p>在第一个类中高亮选中 <code>test</code> ，然后选择 <strong>Refactor &gt; Change Method Signature</strong>。您将看到如图8所示的对话框。 </p>
<p><a name="figure8"><strong>图 8. Change Method Signature 选项</strong> </a><br /><img alt="Change Method Signature options" src="https://www.ibm.com/developerworks/cn/linux/opensource/os-ecref/changesig.gif" width="488" height="514" /> </p>
<p>第一个选项是改变该方法的可见性。在本例中，将其改变为 protected 或者 private，这样第二个类的 <code>callTest() </code>方法就不能访问这个方法了。（如果这两个类在不同的包中，将访问方法设为缺省值也会引起这样的问题。） Eclipse 在进行重构的时候不会将这些问题标出，您只有自己选择适当的值。 </p>
<p>下面一个选项是改变返回值类型。如果将返回值改为 <code>float</code> ，这不会被标记成错误，因为 <code>test() </code>方法返回语句中的 <code>int</code> 会自动转换成 <code>float</code> 。即便如此，在第二个类的 <code>callTest() </code>方法中也会引起问题，因为 <code>float</code> 不能转换成 <code>int</code> 。您需要将 <code>test() </code>的返回值改为 <code>int</code> ，或者是将 <code>callTest() </code>中的 <code>r </code>改为 <code>float</code> 。 </p>
<p>如果将第一个参数的类型从 <code>String</code> 变成 <code>int</code> ，那么也得考虑相同的问题。在重构的过程中这些问题将会被标出，因为它们会在被重构的方法内部引起问题： <code>int </code>不具有方法 <code>length()</code> 。然而如果将其变成 <code>StringBuffer</code> ，问题就不会标记出来，因为 <code>StringBuffer </code>的确具有方法 <code>length()</code> 。当然这会在 <code>callTest() </code>方法中引起问题，因为它在调用 <code>test() </code>的时候还是把一个 <code>String</code> 传递进去了。 </p>
<p>前面提到过，在重构引发了问题的情况下，不管问题是否被标出，您都可以一个一个地修正这些问题，以继续下去。还有一种方法，就是先行修改这些错误。如果您打算删除不再需要的参数 <code>i</code> ，那么可以先从要进行重构的方法中删除对它的引用。这样删除参数的过程就更加顺利了。 </p>
<p>最后一件需要解释的事情是 Default Value 选项。这一选项值仅适用于将参数加入方法签名中的情况。比方说，如果我们加入了一个类型为 <code>String </code>的参数，参数名为 <code>n</code> ，其缺省值为 <code>world</code> ，那么在 <code>callTest() </code>方法中调用 <code>test() </code>的代码就变成下面的样子： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">      
         public void callTest()
   {
      MethodSigExample eg = new MethodSigExample();
      int r = eg.test("hello", 10, "world");
   }
</pre></td></tr></tbody></table><br />
<p>在这场有关 Change Method Signature 重构的看似可怕的讨论中，我们并没有隐藏其中的问题，但却一直没有提到，这种重构其实是非常强大的工具，它可以节约很多时间，通常您必须进行仔细的计划才能成功地使用它。</p><img src ="http://www.blogjava.net/apple0668/aggbug/376978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2012-04-28 15:56 <a href="http://www.blogjava.net/apple0668/archive/2012/04/28/376978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK6中JWS自带webservice应用</title><link>http://www.blogjava.net/apple0668/archive/2011/05/11/350017.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Wed, 11 May 2011 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2011/05/11/350017.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/350017.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2011/05/11/350017.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/350017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/350017.html</trackback:ping><description><![CDATA[&nbsp;在使用JDK6自带的<font style="background-color: #cce8cf">webservice特性之前，项目中接口开发有用到<span class="Apple-style-span" style="word-spacing: 0px; font: medium 'Times New Roman'; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; font-family: verdana, sans-serif; text-align: left">Axis2、XFire、CXF等webservice框架发布通过获取相关的wsdl文件即可实现远程通讯数据交互。<br />
&nbsp;Axis2配合相关的IDE生成服务并发布到服务器上面相当简单和根据选择其中之一的wsdl引擎生成客户端调用java类，感觉类库jar包比较庞大应用起来也比较复杂。<br />
&nbsp;XFire是比较强大的webservice框架，容易与web容器整合，以及spring提供整合支持。<br />
CXF是apache收购XFire后改造产物，功能也相当强大。<br />
&nbsp;使用JDK6自带的webservice特性后，深感部署之简单，真正的轻量级，可以使你集中尽力解决服务端的相关功能设计与实现。<br />
&nbsp;下面介绍JDK6自带的Webservice特性例子：<br />
<br />
&nbsp; IDE：eclipse3.6+ javaee版<br />
新建一个java工程后，建如下类即可简单实现webservice：<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.jws.WebService;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.xml.ws.Endpoint;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />@WebService<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_96_299_Open_Image" onclick="this.style.display='none'; Codehighlighter1_96_299_Open_Text.style.display='none'; Codehighlighter1_96_299_Closed_Image.style.display='inline'; Codehighlighter1_96_299_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_96_299_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_96_299_Closed_Text.style.display='none'; Codehighlighter1_96_299_Open_Image.style.display='inline'; Codehighlighter1_96_299_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HelloWorld&nbsp;</span><span id="Codehighlighter1_96_299_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_96_299_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_124_152_Open_Image" onclick="this.style.display='none'; Codehighlighter1_124_152_Open_Text.style.display='none'; Codehighlighter1_124_152_Closed_Image.style.display='inline'; Codehighlighter1_124_152_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_124_152_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_124_152_Closed_Text.style.display='none'; Codehighlighter1_124_152_Open_Image.style.display='inline'; Codehighlighter1_124_152_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;sayHello()&nbsp;</span><span id="Codehighlighter1_124_152_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_124_152_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">helloworld</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_196_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_196_296_Open_Text.style.display='none'; Codehighlighter1_196_296_Closed_Image.style.display='inline'; Codehighlighter1_196_296_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_196_296_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_196_296_Closed_Text.style.display='none'; Codehighlighter1_196_296_Open_Image.style.display='inline'; Codehighlighter1_196_296_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_196_296_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_196_296_Open_Text"><span style="color: #000000">{&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">发布一个WebService&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">11</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Endpoint.publish(</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:9090/HelloWorld</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HelloWorld());&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
启动main方法即可发布一个webservice服务，通过浏览器输入<font style="background-color: #cce8cf" face="Verdana"><a href="http://localhost:9090/HelloWorld?wsdl">http://localhost:9090/HelloWorld?wsdl</a>即可访问。<br />
注：HelloWorld是一个普通类，只是在类的前面第4行加了注解<font style="background-color: #cce8cf">@WebService，发布是在第11行，<font style="background-color: #cce8cf"><a href="http://localhost:9090/HelloWorld">http://localhost:9090/HelloWorld</a></font>是发布服务地址，其中new HelloWorld()是服务类。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在实际项目开发中可以服务地址从硬编码中抽离处理，写到配置文件或者数据库中方便维护管理，修改地址从前服务即可。<br />
&nbsp; </font><br />
</font></span></span></font><img src ="http://www.blogjava.net/apple0668/aggbug/350017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2011-05-11 15:48 <a href="http://www.blogjava.net/apple0668/archive/2011/05/11/350017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决：Eclipse启动tomcat 访问不了 手动启动可以访问</title><link>http://www.blogjava.net/apple0668/archive/2011/05/09/349875.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Mon, 09 May 2011 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2011/05/09/349875.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/349875.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2011/05/09/349875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/349875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/349875.html</trackback:ping><description><![CDATA[之前在eclipse配置tomcat可以正常访问，最近换了ec。lipse版本为3.62配置tomcat6.0，启动tomcat正常，访问<a href="http://localhost:8080">http://localhost:8080</a>访问不到。<br />
解决办法：在server视图上面，双击tomcat v6.0，打开配置窗口，在server location中默认是选中&#8220;use workspace metadata(does not modify tomcat instation)&#8221;，改成选中第二项&#8220;use tomcat installation&#8221; 服务restart即可正常访问。<img src ="http://www.blogjava.net/apple0668/aggbug/349875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2011-05-09 22:21 <a href="http://www.blogjava.net/apple0668/archive/2011/05/09/349875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IntelliJ Idea10 常用快捷键</title><link>http://www.blogjava.net/apple0668/archive/2011/05/04/349503.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Wed, 04 May 2011 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2011/05/04/349503.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/349503.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2011/05/04/349503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/349503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/349503.html</trackback:ping><description><![CDATA[习惯了eclipse快捷键，最近用IntelliJ Idea,快捷键完全不一样，记下供以后参考使用。<br />
快捷键如下：<br />
<br />
<font style="background-color: #cce8cf">代码提示 KEYMAP-&gt;Main menu-&gt;Code-&gt;Complete Code-&gt;Basic 设置快捷键ALT+Z 原是ctrl+空格（SPACE）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEYMAP-&gt;Main menu-&gt;Code-&gt;Generate 设置快捷键ALT+Insert 原是AlT+Shift+S Alt+回车 导入包,<br />
自动修正 Ctrl+N 查找类 <br />
Ctrl+Shift+N 查找文件 <br />
Ctrl+Alt+L 格式化代码 <br />
Ctrl+Alt+O 优化导入的类和包 <br />
Alt+Insert 生成代码(如get,set方法,构造函数等) <br />
Ctrl+E或者Alt+Shift+C 最近更改的代码 <br />
Ctrl+R 替换文本 <br />
Ctrl+F 查找文本 <br />
Ctrl+Shift+Space 自动补全代码 <br />
Ctrl+空格 代码提示 <br />
Ctrl+Alt+Space 类名或接口名提示 <br />
Ctrl+P 方法参数提示 <br />
Ctrl+Shift+Alt+N 查找类中的方法或变量 <br />
Alt+Shift+C 对比最近修改的代码 <br />
Shift+F6 重构-重命名 <br />
Ctrl+Shift+先上键 <br />
Ctrl+X 删除行 <br />
Ctrl+D 复制行 <br />
Ctrl+/ 或 Ctrl+Shift+/ 注释（// 或者/*...*/ ） <br />
Ctrl+J 自动代码 <br />
Ctrl+E 最近打开的文件 <br />
Ctrl+H 显示类结构图 <br />
Ctrl+Q 显示注释文档 <br />
Alt+1 快速打开或隐藏工程面板 <br />
Alt+F1 查找代码所在位置 <br />
Alt+ left/right 切换代码视图 <br />
Alt+ Up/Down 在方法间快速移动定位 <br />
Ctrl+Alt+ left/right 返回至上次浏览的位置 <br />
Ctrl+Shift+Up/Down 代码向上/下移动。 <br />
F2 或Shift+F2 高亮错误或警告快速定位 代码标签输入完成后，按Tab，生成代码。 如输入"sout",再按下Tab键，就可以自动生成System.out.println(); 选中文本，按Ctrl+Shift+F7 ，高亮显示所有该文本，按Esc高亮消失。 <br />
Ctrl+W 选中代码，连续按会有其他效果选中文本，按Alt+F3 ，逐个往下查找相同文本，并高亮显示。 <br />
Ctrl+Up/Down 光标跳转到第一行或最后一行下 Ctrl+B 快速打开光标处的类或方法</font><img src ="http://www.blogjava.net/apple0668/aggbug/349503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2011-05-04 16:09 <a href="http://www.blogjava.net/apple0668/archive/2011/05/04/349503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Drools语法详解&lt;转&gt;</title><link>http://www.blogjava.net/apple0668/archive/2010/01/17/309884.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Sun, 17 Jan 2010 13:11:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2010/01/17/309884.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/309884.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2010/01/17/309884.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/309884.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/309884.html</trackback:ping><description><![CDATA[<p>原文：<font style="background-color: #cce8cf">http://www.javaeye.com/topic/190294</font><font style="background-color: #cce8cf"><br />
一个典型的DRL文件： <br />
Java代码 <br />
①package com.sample&nbsp;&nbsp; //包名，不可以与关键字冲突&nbsp;&nbsp; <br />
②import com.sample.DroolsTest.Message;//本文件需要导入的类&nbsp;&nbsp; <br />
③global java.util.List myGlobalList;//全局变量&nbsp;&nbsp; <br />
④//定义函数体&nbsp;&nbsp; <br />
function String hello(String name) {&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return "Hello "+name+"!";&nbsp;&nbsp; <br />
}&nbsp;&nbsp; <br />
&nbsp; <br />
⑤rule "myRule"&nbsp;&nbsp;&nbsp;&nbsp; <br />
no-loop true&nbsp; //执行一次后，是否能被再次激活&nbsp;&nbsp; <br />
salience 100&nbsp; //优先级别&nbsp;&nbsp; <br />
⑥when&nbsp;&nbsp;&nbsp;&nbsp; <br />
m : Message( status == Message.HELLO, message : message )&nbsp;&nbsp;&nbsp; <br />
⑦then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
m.setMessage( "Goodbye cruel world" );&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.setStatus( Message.GOODBYE );&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; update( m );&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; myGlobalList.add( "Hello World" );//使用global 变量&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; System.out.println( hello( "Bob" ) );//调用定义函数&nbsp;&nbsp; <br />
End&nbsp; </font></p>
<p><font style="background-color: #cce8cf">①package com.sample&nbsp;&nbsp; //包名，不可以与关键字冲突<br />
②import com.sample.DroolsTest.Message;//本文件需要导入的类<br />
③global java.util.List myGlobalList;//全局变量<br />
④//定义函数体<br />
function String hello(String name) {<br />
&nbsp;&nbsp;&nbsp; return "Hello "+name+"!";<br />
}</font></p>
<p><font style="background-color: #cce8cf">⑤rule "myRule"&nbsp; <br />
no-loop true&nbsp; //执行一次后，是否能被再次激活<br />
salience 100&nbsp; //优先级别<br />
⑥when&nbsp; <br />
m : Message( status == Message.HELLO, message : message ) <br />
⑦then&nbsp;&nbsp;&nbsp; <br />
m.setMessage( "Goodbye cruel world" );<br />
&nbsp;&nbsp;m.setStatus( Message.GOODBYE );<br />
&nbsp;&nbsp;update( m );<br />
&nbsp;&nbsp;&nbsp; myGlobalList.add( "Hello World" );//使用global 变量<br />
&nbsp;&nbsp;&nbsp; System.out.println( hello( "Bob" ) );//调用定义函数<br />
End</font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf">①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 />
&nbsp;&nbsp;&nbsp; eval( true ) <br />
then <br />
&nbsp;&nbsp;&nbsp; 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 名称可以在&#8220;&#8221;下取任何名字。 <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指定的时间之后，规则不能激活。 </font></p>
<p><font style="background-color: #cce8cf">duration long N/A 指出规则将在指定的一段时间后激发，如果那个时候规则的激活条件还是处于true的情况下。 <br />
⑥&nbsp; LHS (when) 条件元素 <br />
为了能够引用匹配的对象，使用一个模式绑定变量如&#8216;$c&#8217;。变量的前缀使用的$是可选的，但是在复杂的规则中它会很方便用来区别变量与字段的不同。 <br />
$c : Cheese( type == "stilton", price &lt; 10, age == "mature" ) <br />
&amp;&amp; 和|| 约束连接符 <br />
Cheese( type == "stilton" &amp;&amp; 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 />
多重约束允许你对一个字段通过使用'&amp;&amp;' 或者'||'约束连接符进行多个约束条件的判断。允许使用圆括号分组，它会让这种约束看起来更自然。 <br />
Person( age ( (&gt; 30 &amp;&amp; &lt; 40) || (&gt; 20 &amp;&amp; &lt; 25) ) ) <br />
Person( age &gt; 30 &amp;&amp; &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' ) </font></p>
<p><font style="background-color: #cce8cf">⑦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 />
&nbsp;&nbsp;&nbsp; person : Person( age &gt; 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 />
&nbsp;&nbsp;&nbsp; QueryResult result = ( QueryResult ) it.next(); <br />
&nbsp;&nbsp;&nbsp; Person person = ( Person ) result.get( "person" ); <br />
&nbsp;&nbsp;&nbsp; } </font></p>
<p><font style="background-color: #cce8cf"></font>&nbsp;</p><img src ="http://www.blogjava.net/apple0668/aggbug/309884.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2010-01-17 21:11 <a href="http://www.blogjava.net/apple0668/archive/2010/01/17/309884.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse3.4安装drools插件手记</title><link>http://www.blogjava.net/apple0668/archive/2010/01/17/309883.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Sun, 17 Jan 2010 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2010/01/17/309883.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/309883.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2010/01/17/309883.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/309883.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/309883.html</trackback:ping><description><![CDATA[最近由于项目用到drools，所以只有一边学习一边开发，首先先安装好插件搭好开发环境。<br />
下载drools eclipse插件，地址为：<a href="http://www.jboss.org/drools/downloads.html">http://www.jboss.org/drools/downloads.html</a><br />
解压用links方式安装插件，如果<font style="background-color: #cce8cf">features</font>目录和<font style="background-color: #cce8cf">plugins</font>目录上层没有eclipse文件夹，就要建一个。<br />
<br />
在Eclipse目录下面新建一个links文件夹，里面建一个XXX.link，内容为：path=F://plugins/drools<br />
<br />
启动Eclipse，在window----prefernces那里如果看不到又drools，就说明插件安装不成功。<br />
<br />
Eclipse3.4安装drools插件遇到识别不了插件，解决方案如下：<br />
<br />
<font style="background-color: #cce8cf">F:\eclipse\configuration\org.eclipse.equinox.simpleconfigurator</font>下面<font style="background-color: #cce8cf">bundles.info</font>最后加上以下几句：<br />
<br />
<p>org.guvnor.tools,5.0.1,file:plugins\org.guvnor.tools_5.0.1.jar,4,false <br />
org.eclipse.webdav,3.0.101,file:plugins\org.eclipse.webdav_3.0.101.jar,4,false <br />
org.drools.eclipse,5.0.1,file:plugins\org.drools.eclipse_5.0.1.jar,4,false <br />
org.drools.eclipse.task,5.0.1,file:plugins\org.drools.eclipse.task_5.0.1.jar,4,false </p>
保存即可。<br />
<br />
再次启动Eclipse就可以成功安装插件，window----prefernces---drools插件，配置drools的依赖包环境，这些很简单，省略。<br />
<br />
新建一个drools工程，就会看到一个附带的helloworld的例子，执行java文件即可执行测试。<br />
<br />
<font style="background-color: #cce8cf">Sample.drl</font><br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">package&nbsp;com.sample<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />import&nbsp;com.sample.DroolsTest.Message;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />rule&nbsp;"Hello&nbsp;World"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;when<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m&nbsp;:&nbsp;Message(&nbsp;status&nbsp;==&nbsp;Message.HELLO,&nbsp;myMessage&nbsp;:&nbsp;message&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;then<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;myMessage&nbsp;);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.setMessage(&nbsp;"Goodbye&nbsp;cruel&nbsp;world"&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.setStatus(&nbsp;Message.GOODBYE&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update(&nbsp;m&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />end<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />rule&nbsp;"GoodBye"<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;when<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message(&nbsp;status&nbsp;==&nbsp;Message.GOODBYE,&nbsp;myMessage&nbsp;:&nbsp;message&nbsp;)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;then<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;myMessage&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />end</span></div>
<br />
<br />
<font style="background-color: #cce8cf">DroolsTest.java<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.sample;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.KnowledgeBase;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.KnowledgeBaseFactory;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.builder.KnowledgeBuilder;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.builder.KnowledgeBuilderError;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.builder.KnowledgeBuilderErrors;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.builder.KnowledgeBuilderFactory;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.builder.ResourceType;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.io.ResourceFactory;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.logger.KnowledgeRuntimeLogger;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.logger.KnowledgeRuntimeLoggerFactory;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.drools.runtime.StatefulKnowledgeSession;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img id="Codehighlighter1_524_574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_524_574_Open_Text.style.display='none'; Codehighlighter1_524_574_Closed_Image.style.display='inline'; Codehighlighter1_524_574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_524_574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_524_574_Closed_Text.style.display='none'; Codehighlighter1_524_574_Open_Image.style.display='inline'; Codehighlighter1_524_574_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_524_574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_524_574_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;*&nbsp;This&nbsp;is&nbsp;a&nbsp;sample&nbsp;class&nbsp;to&nbsp;launch&nbsp;a&nbsp;rule.<br />
</span><span style="color: #008080">17</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_600_2212_Open_Image" onclick="this.style.display='none'; Codehighlighter1_600_2212_Open_Text.style.display='none'; Codehighlighter1_600_2212_Closed_Image.style.display='inline'; Codehighlighter1_600_2212_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_600_2212_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_600_2212_Closed_Text.style.display='none'; Codehighlighter1_600_2212_Open_Image.style.display='inline'; Codehighlighter1_600_2212_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DroolsTest&nbsp;</span><span id="Codehighlighter1_600_2212_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_600_2212_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_649_1165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_649_1165_Open_Text.style.display='none'; Codehighlighter1_649_1165_Closed_Image.style.display='inline'; Codehighlighter1_649_1165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_649_1165_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_649_1165_Closed_Text.style.display='none'; Codehighlighter1_649_1165_Open_Image.style.display='inline'; Codehighlighter1_649_1165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_649_1165_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_649_1165_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img id="Codehighlighter1_657_1112_Open_Image" onclick="this.style.display='none'; Codehighlighter1_657_1112_Open_Text.style.display='none'; Codehighlighter1_657_1112_Closed_Image.style.display='inline'; Codehighlighter1_657_1112_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_657_1112_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_657_1112_Closed_Text.style.display='none'; Codehighlighter1_657_1112_Open_Image.style.display='inline'; Codehighlighter1_657_1112_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_657_1112_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_657_1112_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;load&nbsp;up&nbsp;the&nbsp;knowledge&nbsp;base</span><span style="color: #008000"><br />
</span><span style="color: #008080">23</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeBase&nbsp;kbase&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;readKnowledgeBase();<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatefulKnowledgeSession&nbsp;ksession&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;kbase.newStatefulKnowledgeSession();<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeRuntimeLogger&nbsp;logger&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;KnowledgeRuntimeLoggerFactory.newFileLogger(ksession,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;go&nbsp;!</span><span style="color: #008000"><br />
</span><span style="color: #008080">27</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Message();<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setMessage(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setStatus(Message.HELLO);<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ksession.insert(message);<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ksession.fireAllRules();<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.close();<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img id="Codehighlighter1_1134_1162_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1134_1162_Open_Text.style.display='none'; Codehighlighter1_1134_1162_Closed_Image.style.display='inline'; Codehighlighter1_1134_1162_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1134_1162_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1134_1162_Closed_Text.style.display='none'; Codehighlighter1_1134_1162_Open_Image.style.display='inline'; Codehighlighter1_1134_1162_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Throwable&nbsp;t)&nbsp;</span><span id="Codehighlighter1_1134_1162_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1134_1162_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.printStackTrace();<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img id="Codehighlighter1_1235_1784_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1235_1784_Open_Text.style.display='none'; Codehighlighter1_1235_1784_Closed_Image.style.display='inline'; Codehighlighter1_1235_1784_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1235_1784_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1235_1784_Closed_Text.style.display='none'; Codehighlighter1_1235_1784_Open_Image.style.display='inline'; Codehighlighter1_1235_1784_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;KnowledgeBase&nbsp;readKnowledgeBase()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_1235_1784_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1235_1784_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeBuilder&nbsp;kbuilder&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;KnowledgeBuilderFactory.newKnowledgeBuilder();<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kbuilder.add(ResourceFactory.newClassPathResource(</span><span style="color: #000000">"</span><span style="color: #000000">Sample.drl</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;ResourceType.DRL);<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeBuilderErrors&nbsp;errors&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;kbuilder.getErrors();<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img id="Codehighlighter1_1481_1637_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1481_1637_Open_Text.style.display='none'; Codehighlighter1_1481_1637_Closed_Image.style.display='inline'; Codehighlighter1_1481_1637_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1481_1637_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1481_1637_Closed_Text.style.display='none'; Codehighlighter1_1481_1637_Open_Image.style.display='inline'; Codehighlighter1_1481_1637_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(errors.size()&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_1481_1637_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1481_1637_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img id="Codehighlighter1_1528_1564_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1528_1564_Open_Text.style.display='none'; Codehighlighter1_1528_1564_Closed_Image.style.display='inline'; Codehighlighter1_1528_1564_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1528_1564_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1528_1564_Closed_Text.style.display='none'; Codehighlighter1_1528_1564_Open_Image.style.display='inline'; Codehighlighter1_1528_1564_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(KnowledgeBuilderError&nbsp;error:&nbsp;errors)&nbsp;</span><span id="Codehighlighter1_1528_1564_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1528_1564_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(error);<br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalArgumentException(</span><span style="color: #000000">"</span><span style="color: #000000">Could&nbsp;not&nbsp;parse&nbsp;knowledge.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">47</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeBase&nbsp;kbase&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;KnowledgeBaseFactory.newKnowledgeBase();<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());<br />
</span><span style="color: #008080">50</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;kbase;<br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img id="Codehighlighter1_1816_2209_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1816_2209_Open_Text.style.display='none'; Codehighlighter1_1816_2209_Closed_Image.style.display='inline'; Codehighlighter1_1816_2209_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1816_2209_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1816_2209_Closed_Text.style.display='none'; Codehighlighter1_1816_2209_Open_Image.style.display='inline'; Codehighlighter1_1816_2209_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Message&nbsp;</span><span id="Codehighlighter1_1816_2209_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1816_2209_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">55</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;HELLO&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
</span><span style="color: #008080">56</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;GOODBYE&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br />
</span><span style="color: #008080">57</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">58</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;message;<br />
</span><span style="color: #008080">59</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">60</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;status;<br />
</span><span style="color: #008080">61</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">62</span><span style="color: #000000"><img id="Codehighlighter1_1977_2005_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1977_2005_Open_Text.style.display='none'; Codehighlighter1_1977_2005_Closed_Image.style.display='inline'; Codehighlighter1_1977_2005_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1977_2005_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1977_2005_Closed_Text.style.display='none'; Codehighlighter1_1977_2005_Open_Image.style.display='inline'; Codehighlighter1_1977_2005_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getMessage()&nbsp;</span><span id="Codehighlighter1_1977_2005_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1977_2005_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">63</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message;<br />
</span><span style="color: #008080">64</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">65</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">66</span><span style="color: #000000"><img id="Codehighlighter1_2049_2080_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2049_2080_Open_Text.style.display='none'; Codehighlighter1_2049_2080_Closed_Image.style.display='inline'; Codehighlighter1_2049_2080_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2049_2080_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2049_2080_Closed_Text.style.display='none'; Codehighlighter1_2049_2080_Open_Image.style.display='inline'; Codehighlighter1_2049_2080_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setMessage(String&nbsp;message)&nbsp;</span><span id="Codehighlighter1_2049_2080_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2049_2080_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">67</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;message;<br />
</span><span style="color: #008080">68</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">69</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">70</span><span style="color: #000000"><img id="Codehighlighter1_2108_2135_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2108_2135_Open_Text.style.display='none'; Codehighlighter1_2108_2135_Closed_Image.style.display='inline'; Codehighlighter1_2108_2135_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2108_2135_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2108_2135_Closed_Text.style.display='none'; Codehighlighter1_2108_2135_Open_Image.style.display='inline'; Codehighlighter1_2108_2135_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getStatus()&nbsp;</span><span id="Codehighlighter1_2108_2135_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2108_2135_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">71</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.status;<br />
</span><span style="color: #008080">72</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">73</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">74</span><span style="color: #000000"><img id="Codehighlighter1_2174_2203_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2174_2203_Open_Text.style.display='none'; Codehighlighter1_2174_2203_Closed_Image.style.display='inline'; Codehighlighter1_2174_2203_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_2174_2203_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2174_2203_Closed_Text.style.display='none'; Codehighlighter1_2174_2203_Open_Image.style.display='inline'; Codehighlighter1_2174_2203_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setStatus(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;status)&nbsp;</span><span id="Codehighlighter1_2174_2203_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_2174_2203_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">75</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;status;<br />
</span><span style="color: #008080">76</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">77</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">78</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">79</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">80</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
</font><br />
输出：<br />
<br />
<font style="background-color: #cce8cf">Hello World<br />
Goodbye cruel world</font><br /><img src ="http://www.blogjava.net/apple0668/aggbug/309883.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2010-01-17 21:08 <a href="http://www.blogjava.net/apple0668/archive/2010/01/17/309883.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java日期时间运算</title><link>http://www.blogjava.net/apple0668/archive/2009/03/19/260902.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Thu, 19 Mar 2009 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2009/03/19/260902.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/260902.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2009/03/19/260902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/260902.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/260902.html</trackback:ping><description><![CDATA[<p><font style="background-color: #c7edcc">今天处理一个Java日期时间运算问题：<br />
尝试过几种方法，觉得还是如下方法处理比较灵活，代码如下：<br />
</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.mmc.date.cal;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Date;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Calendar;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.GregorianCalendar;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.SimpleDateFormat;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_169_1044_Open_Image" onclick="this.style.display='none'; Codehighlighter1_169_1044_Open_Text.style.display='none'; Codehighlighter1_169_1044_Closed_Image.style.display='inline'; Codehighlighter1_169_1044_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_169_1044_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_169_1044_Closed_Text.style.display='none'; Codehighlighter1_169_1044_Open_Image.style.display='inline'; Codehighlighter1_169_1044_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DateCal&nbsp;</span><span id="Codehighlighter1_169_1044_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_169_1044_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date();<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;GregorianCalendar&nbsp;gc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GregorianCalendar();<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;&nbsp;sf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleDateFormat(</span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd&nbsp;HH:MM:ss</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_315_419_Open_Image" onclick="this.style.display='none'; Codehighlighter1_315_419_Open_Text.style.display='none'; Codehighlighter1_315_419_Closed_Image.style.display='inline'; Codehighlighter1_315_419_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_315_419_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_315_419_Closed_Text.style.display='none'; Codehighlighter1_315_419_Open_Image.style.display='inline'; Codehighlighter1_315_419_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_315_419_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_315_419_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">12</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;gc.add(1,1)年份加1<br />
</span><span style="color: #008080">14</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;gc.add(2,1)月份加1<br />
</span><span style="color: #008080">15</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;gc.add(3,1)周加1<br />
</span><span style="color: #008080">16</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;gc.add(5,1)天加1<br />
</span><span style="color: #008080">17</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;如果为-1表示是减<br />
</span><span style="color: #008080">18</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getDateCal(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;d,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;beforeMonth)<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img id="Codehighlighter1_471_631_Open_Image" onclick="this.style.display='none'; Codehighlighter1_471_631_Open_Text.style.display='none'; Codehighlighter1_471_631_Closed_Image.style.display='inline'; Codehighlighter1_471_631_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_471_631_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_471_631_Closed_Text.style.display='none'; Codehighlighter1_471_631_Open_Image.style.display='inline'; Codehighlighter1_471_631_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_471_631_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_471_631_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.setTime(date);<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.add(d,beforeMonth);<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.set(gc.get(Calendar.YEAR),gc.get(Calendar.MONTH),gc.get(Calendar.DATE));<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sf.format(gc.getTime());<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getCurrentDate()<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img id="Codehighlighter1_666_695_Open_Image" onclick="this.style.display='none'; Codehighlighter1_666_695_Open_Text.style.display='none'; Codehighlighter1_666_695_Closed_Image.style.display='inline'; Codehighlighter1_666_695_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_666_695_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_666_695_Closed_Text.style.display='none'; Codehighlighter1_666_695_Open_Image.style.display='inline'; Codehighlighter1_666_695_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_666_695_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_666_695_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;sf.format(date);<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;&nbsp;main(String[]&nbsp;args)<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img id="Codehighlighter1_740_1041_Open_Image" onclick="this.style.display='none'; Codehighlighter1_740_1041_Open_Text.style.display='none'; Codehighlighter1_740_1041_Closed_Image.style.display='inline'; Codehighlighter1_740_1041_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_740_1041_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_740_1041_Closed_Text.style.display='none'; Codehighlighter1_740_1041_Open_Image.style.display='inline'; Codehighlighter1_740_1041_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_740_1041_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_740_1041_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateCal&nbsp;ud</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DateCal();<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">当前时间&nbsp;&nbsp;：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ud.getCurrentDate());<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">前一年&nbsp;&nbsp;&nbsp;&nbsp;：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ud.getDateCal(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">));<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">前一个月&nbsp;&nbsp;：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ud.getDateCal(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">));<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">前一个星期：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ud.getDateCal(</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">));<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">前一天&nbsp;&nbsp;&nbsp;&nbsp;：</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">ud.getDateCal(</span><span style="color: #000000">5</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">));<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p><br />
输出结果：<br />
<br />
<font style="background-color: #c7edcc"><font style="background-color: #c7edcc">当前时间&nbsp; ：2009-03-19 21:03:48<br />
前一年&nbsp;&nbsp;&nbsp; ：2008-03-19 21:03:48<br />
前一个月&nbsp; ：2009-02-19 21:02:48<br />
前一个星期：2009-03-12 21:03:48<br />
前一天&nbsp;&nbsp;&nbsp; ：2009-03-18 21:03:48<br />
分析：<br />
深入<font style="background-color: #c7edcc">GregorianCalendar</font>中的add方法源码，代码比较长想研究的自己看源代码。<br />
</font></font><br />
<br />
</font>&nbsp;</p><img src ="http://www.blogjava.net/apple0668/aggbug/260902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2009-03-19 21:56 <a href="http://www.blogjava.net/apple0668/archive/2009/03/19/260902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中使用功能强悍的正则表达式</title><link>http://www.blogjava.net/apple0668/archive/2008/12/06/244820.html</link><dc:creator>apple0668</dc:creator><author>apple0668</author><pubDate>Sat, 06 Dec 2008 15:42:00 GMT</pubDate><guid>http://www.blogjava.net/apple0668/archive/2008/12/06/244820.html</guid><wfw:comment>http://www.blogjava.net/apple0668/comments/244820.html</wfw:comment><comments>http://www.blogjava.net/apple0668/archive/2008/12/06/244820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/apple0668/comments/commentRss/244820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/apple0668/services/trackbacks/244820.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近深入看struts2的validation校验框架，看到底层的很多的实现都用到正则表达式来实现。其中用得比较多的是两个类，一个是java.util.regex.Matcher和java.util.regex.Pattern&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/apple0668/archive/2008/12/06/244820.html'>阅读全文</a><img src ="http://www.blogjava.net/apple0668/aggbug/244820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/apple0668/" target="_blank">apple0668</a> 2008-12-06 23:42 <a href="http://www.blogjava.net/apple0668/archive/2008/12/06/244820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>