<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>cnhzliye</title>
    <description>性格决定命运，气度影响格局！</description>
    <link>http://cnhzliye.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>知识点</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/155561" style="color:red;">http://cnhzliye.javaeye.com/blog/155561</a>&nbsp;
          发表时间: 2008年01月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1,组合与继承的区别。<br />  优先使用对象组合，而不是类继承。 <br />  类继承被认为“破坏了封装性”，因为对子类而言，父类的内部细节是可见的！ <br />  父类与子类之间的强耦合关系也不符合面向对象设计的思想。 <br /><br />  对象组合技术认为，你只需要通过组装已有的构件就能获得你要的功能。但事实是，因为可用构件的集合并不足够丰富。这时候，使用继承的复用来获得新的构件比组装旧的构件来得容易，所以继承和对象组合常常一起使用。<br /><br />2,策略模式和模板模式的区别。<br />3,webwork和struts的体系结构。<br />4,oracle删除重复记录。<br />5,truncate与delete的区别。<br />  相同点：truncate是不带where的delete语句。<br />  不同点：truncate是DDL，不会回滚，而delete会产生log，所以，在删除大量的数据时，用truncate效率会更高。<br />6,什么是webservice，其优缺点。
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/155561#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Jan 2008 10:02:51 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/155561</link>
        <guid>http://cnhzliye.javaeye.com/blog/155561</guid>
      </item>
      <item>
        <title>个人知识点map</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/145587" style="color:red;">http://cnhzliye.javaeye.com/blog/145587</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.google android</p>
<p>2.struts2/struts2与jsonplug</p>
<p>3.BeanShell and antlr</p>
<p>4.flex</p>
<p>&nbsp;</p>
<p>。。。。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/145587#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 13:55:04 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/145587</link>
        <guid>http://cnhzliye.javaeye.com/blog/145587</guid>
      </item>
      <item>
        <title>java垃圾收集算法</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/144859" style="color:red;">http://cnhzliye.javaeye.com/blog/144859</a>&nbsp;
          发表时间: 2007年11月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font color="#0000ff" face="Arial"><strong>1.垃圾收集算法的核心思想</strong></font></p>
<p><font face="Arial">　　Java语言建立了垃圾收集机制，用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险：因内存垃圾过多而引发的内存耗尽，以及不恰当的内存释放所造成的内存非法引用。</font></p>
<p><font face="Arial">　　垃圾收集算法的核心思想是：对虚拟机可用内存空间，即堆空间中的对象进行识别，如果对象正在被引用，那么称其为存活对象，反之，如果对象不再被引用，则为垃圾对象，可以回收其占据的空间，用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能，因此需要开发人员做比较深入的了解。</font></p>
<p><font face="Arial"><font color="#0000ff"><strong>2.触发主GC(Garbage Collector)的条件</strong></font></font></p>
<p><font face="Arial">　　JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:<br />
&nbsp; </font></p>
<p><font face="Arial">　　①当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。</font></p>
<p><font face="Arial">　　②Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报&ldquo;out of memory&rdquo;的错误,Java应用将停止。</font></p>
<p><font face="Arial">　　由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。</font></p>
<p><font face="Arial"><font color="#0000ff"><strong>3.减少GC开销的措施</strong></font></font></p>
<p><font face="Arial">　　根据上述GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:</font></p>
<p><font face="Arial">　　(1)不要显式调用System.gc()</font></p>
<p><font face="Arial">　　此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。</font></p>
<p><font face="Arial">　　(2)尽量减少临时对象的使用</font></p>
<p><font face="Arial">　　临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。</font></p>
<p><font face="Arial">　　(3)对象不用时最好显式置为Null</font></p>
<p><font face="Arial">　　一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。</font></p>
<p><font face="Arial">　　(4)尽量使用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)</font></p>
<p><font face="Arial">　　由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作&ldquo;+&rdquo;操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer是可变长的,它在原有基础上进行扩增,不会产生中间对象。</font></p>
<p><font face="Arial">　　(5)能用基本类型如Int,Long,就不用Integer,Long对象</font></p>
<p><font face="Arial">　　基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。</font></p>
<p><font face="Arial">　　(6)尽量少用静态对象变量</font></p>
<p><font face="Arial">　　静态变量属于全局变量,不会被GC回收,它们会一直占用内存。</font></p>
<p><font face="Arial">　　(7)分散对象创建或删除的时间</font></p>
<p><font face="Arial">　　集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片,从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC的机会。</font></p>
<p><font face="Arial"><font color="#0000ff"><strong>4.gc与finalize方法</strong></font></font></p>
<p><font face="Arial">　　⑴gc方法请求垃圾回收</font></p>
<p><font face="Arial">　　使用System.gc()可以不管JVM使用的是哪一种垃圾回收的算法，都可以请求Java的垃圾回收。需要注意的是，调用System.gc()也仅仅是一个请求。JVM接受这个消息后，并不是立即做垃圾回收，而只是对几个垃圾回收算法做了加权，使垃圾回收操作容易发生，或提早发生，或回收较多而已。</font></p>
<p><font face="Arial">　　⑵finalize方法透视垃圾收集器的运行</font></p>
<p><font face="Arial">　　在JVM垃圾收集器收集一个对象之前 ，一般要求程序调用适当的方法释放资源，但在没有明确释放资源的情况下，Java提供了缺省机制来终止化该对象释放资源，这个方法就是finalize()。它的原型为：</font></p>
<p><font face="Arial">　　protected void finalize() throws Throwable</font></p>
<p><font face="Arial">　　在finalize()方法返回之后，对象消失，垃圾收集开始执行。原型中的throws Throwable表示它可以抛出任何类型的异常。</font></p>
<p><font face="Arial">　　因此，当对象即将被销毁时，有时需要做一些善后工作。可以把这些操作写在finalize()方法里。</font></p>
<p><font face="Arial"></font>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;finalize()&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>　　&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="comment">//&nbsp;finalization&nbsp;code&nbsp;here&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p>⑶代码示例<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">class</span><span>&nbsp;Garbage{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">int</span><span>&nbsp;index;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;count;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;Garbage()&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;count++;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;System.out.println(</span><span class="string">&quot;object&nbsp;&quot;</span><span>+count+</span><span class="string">&quot;&nbsp;construct&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;setID(count);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">void</span><span>&nbsp;setID(</span><span class="keyword">int</span><span>&nbsp;id)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;index=id;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;finalize()&nbsp;</span><span class="comment">//重写finalize方法&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;System.out.println(</span><span class="string">&quot;object&nbsp;&quot;</span><span>+index+</span><span class="string">&quot;&nbsp;is&nbsp;reclaimed&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">new</span><span>&nbsp;Garbage();&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">new</span><span>&nbsp;Garbage();&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">new</span><span>&nbsp;Garbage();&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">new</span><span>&nbsp;Garbage();&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;System.gc();&nbsp;</span><span class="comment">//请求运行垃圾收集器&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><font face="Arial"><font color="#0000ff"><strong>5.Java 内存泄漏 <br />
</strong></font>　　由于采用了垃圾回收机制，任何不可达对象(对象不再被引用)都可以由垃圾收集线程回收。因此通常说的Java 内存泄漏其实是指无意识的、非故意的对象引用，或者无意识的对象保持。无意识的对象引用是指代码的开发人员本来已经对对象使用完毕，却因为编码的错误而意外地保存了对该对象的引用(这个引用的存在并不是编码人员的主观意愿)，从而使得该对象一直无法被垃圾回收器回收掉，这种本来以为可以释放掉的却最终未能被释放的空间可以认为是被&ldquo;泄漏了&rdquo;。</font></p>
<p><font face="Arial">　　考虑下面的程序,在ObjStack类中,使用push和pop方法来管理堆栈中的对象。两个方法中的索引(index)用于指示堆栈中下一个可用位置。push方法存储对新对象的引用并增加索引值,而pop方法减小索引值并返回堆栈最上面的元素。在main方法中,创建了容量为64的栈,并64次调用push方法向它添加对象,此时index的值为64,随后又32次调用pop方法,则index的值变为32,出栈意味着在堆栈中的空间应该被收集。但事实上,pop方法只是减小了索引值,堆栈仍然保持着对那些对象的引用。故32个无用对象不会被GC回收,造成了内存渗漏。</font></p>
<p><font face="Arial"></font>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ObjStack&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">private</span><span>&nbsp;Object[]&nbsp;stack;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;index;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;ObjStack(</span><span class="keyword">int</span><span>&nbsp;indexcount)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;stack&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[indexcount];&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;index&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;push(Object&nbsp;obj)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;stack[index]&nbsp;=&nbsp;obj;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;index++;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;pop()&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;index--;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">return</span><span>&nbsp;stack[index];&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Pushpop&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;Object&nbsp;tempobj;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//new一个ObjStack对象，并调用有参构造函数。分配stack&nbsp;Obj数组的空间大小为64，可以存64个对象，从0开始存储 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;ObjStack&nbsp;stack1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjStack(</span><span class="number">64</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">while</span><span>&nbsp;(i&nbsp;&lt;&nbsp;</span><span class="number">64</span><span>)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;tempobj&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object();</span><span class="comment">//循环new&nbsp;Obj对象，把每次循环的对象一一存放在stack&nbsp;Obj数组中。&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;stack1.push(tempobj);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;i++;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;System.out.println(</span><span class="string">&quot;第&quot;</span><span>&nbsp;+&nbsp;i&nbsp;+&nbsp;</span><span class="string">&quot;次进栈&quot;</span><span>&nbsp;+&nbsp;</span><span class="string">&quot;\t&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="keyword">while</span><span>&nbsp;(i&nbsp;&gt;&nbsp;</span><span class="number">32</span><span>)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;tempobj&nbsp;=&nbsp;stack1.pop();</span><span class="comment">//这里造成了空间的浪费。&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;</span><span class="comment">//正确的pop方法可改成如下所指示,当引用被返回后,堆栈删除对他们的引用,因此垃圾收集器在以后可以回收他们。&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;</span><span class="comment">/*&nbsp; </span>&nbsp;</li>
    <li class=""><span><span class="comment">　　&nbsp;*&nbsp;public&nbsp;Object&nbsp;pop()&nbsp;{index&nbsp;-&nbsp;-;Object&nbsp;temp&nbsp;=&nbsp;stack&nbsp;[index];stack&nbsp;[index]=null;return&nbsp;temp;}&nbsp; </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">　　&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>　　&nbsp;i--;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;System.out.println(</span><span class="string">&quot;第&quot;</span><span>&nbsp;+&nbsp;(</span><span class="number">64</span><span>&nbsp;-&nbsp;i)&nbsp;+&nbsp;</span><span class="string">&quot;次出栈&quot;</span><span>&nbsp;+&nbsp;</span><span class="string">&quot;\t&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>　　&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>　　&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><font color="#0000ff" face="Arial"><strong>6.如何消除内存泄漏</strong></font></p>
<p><font face="Arial">　　虽然Java虚拟机(JVM)及其垃圾收集器(garbage collector，GC)负责管理大多数的内存任务，Java软件程序中还是有可能出现内存泄漏。实际上，这在大型项目中是一个常见的问题。避免内存泄漏的第一步是要弄清楚它是如何发生的。本文介绍了编写Java代码的一些常见的内存泄漏陷阱，以及编写不泄漏代码的一些最佳实践。一旦发生了内存泄漏，要指出造成泄漏的代码是非常困难的。因此本文还介绍了一种新工具，用来诊断泄漏并指出根本原因。该工具的开销非常小，因此可以使用它来寻找处于生产中的系统的内存泄漏。</font></p>
<p><font face="Arial">　　垃圾收集器的作用</font></p>
<p><font face="Arial">　　虽然垃圾收集器处理了大多数内存管理问题，从而使编程人员的生活变得更轻松了，但是编程人员还是可能犯错而导致出现内存问题。简单地说，GC循环地跟踪所有来自&ldquo;根&rdquo;对象(堆栈对象、静态对象、JNI句柄指向的对象，诸如此类)的引用，并将所有它所能到达的对象标记为活动的。程序只可以操纵这些对象;其他的对象都被删除了。因为GC使程序不可能到达已被删除的对象，这么做就是安全的。</font></p>
<p><font face="Arial">　　虽然内存管理可以说是自动化的，但是这并不能使编程人员免受思考内存管理问题之苦。例如，分配(以及释放)内存总会有开销，虽然这种开销对编程人员来说是不可见的。创建了太多对象的程序将会比完成同样的功能而创建的对象却比较少的程序更慢一些(在其他条件相同的情况下)。</font></p>
<p><font face="Arial">　　而且，与本文更为密切相关的是，如果忘记&ldquo;释放&rdquo;先前分配的内存，就可能造成内存泄漏。如果程序保留对永远不再使用的对象的引用，这些对象将会占用并耗尽内存，这是因为自动化的垃圾收集器无法证明这些对象将不再使用。正如我们先前所说的，如果存在一个对对象的引用，对象就被定义为活动的，因此不能删除。为了确保能回收对象占用的内存，编程人员必须确保该对象不能到达。这通常是通过将对象字段设置为null或者从集合(collection)中移除对象而完成的。但是，注意，当局部变量不再使用时，没有必要将其显式地设置为null。对这些变量的引用将随着方法的退出而自动清除。</font></p>
<p><font face="Arial">　　概括地说，这就是内存托管语言中的内存泄漏产生的主要原因：保留下来却永远不再使用的对象引用。</font></p>
<p><font face="Arial">　　典型泄漏</font></p>
<p><font face="Arial">　　既然我们知道了在Java中确实有可能发生内存泄漏，就让我们来看一些典型的内存泄漏及其原因。</font></p>
<p><font face="Arial">　　全局集合</font></p>
<p><font face="Arial">　　在大的应用程序中有某种全局的数据储存库是很常见的，例如一个JNDI树或一个会话表。在这些情况下，必须注意管理储存库的大小。必须有某种机制从储存库中移除不再需要的数据。</font></p>
<p><font face="Arial">　　这可能有多种方法，但是最常见的一种是周期性运行的某种清除任务。该任务将验证储存库中的数据，并移除任何不再需要的数据。</font></p>
<p><font face="Arial">　　另一种管理储存库的方法是使用反向链接(referrer)计数。然后集合负责统计集合中每个入口的反向链接的数目。这要求反向链接告诉集合何时会退出入口。当反向链接数目为零时，该元素就可以从集合中移除了。</font></p>
<p><font face="Arial">　　缓存</font></p>
<p><font face="Arial">　　缓存是一种数据结构，用于快速查找已经执行的操作的结果。因此，如果一个操作执行起来很慢，对于常用的输入数据，就可以将操作的结果缓存，并在下次调用该操作时使用缓存的数据。</font></p>
<p><font face="Arial">　　缓存通常都是以动态方式实现的，其中新的结果是在执行时添加到缓存中的。典型的算法是：</font></p>
<p><font face="Arial">　　检查结果是否在缓存中，如果在，就返回结果。</font></p>
<p><font face="Arial">　　如果结果不在缓存中，就进行计算。</font></p>
<p><font face="Arial">　　将计算出来的结果添加到缓存中，以便以后对该操作的调用可以使用。</font></p>
<p><font face="Arial">　　该算法的问题(或者说是潜在的内存泄漏)出在最后一步。如果调用该操作时有相当多的不同输入，就将有相当多的结果存储在缓存中。很明显这不是正确的方法。</font></p>
<p><font face="Arial">　　为了预防这种具有潜在破坏性的设计，程序必须确保对于缓存所使用的内存容量有一个上限。因此，更好的算法是：</font></p>
<p><font face="Arial">　　检查结果是否在缓存中，如果在，就返回结果。</font></p>
<p><font face="Arial">　　如果结果不在缓存中，就进行计算。</font></p>
<p><font face="Arial">　　如果缓存所占的空间过大，就移除缓存最久的结果。</font></p>
<p><font face="Arial">　　将计算出来的结果添加到缓存中，以便以后对该操作的调用可以使用。</font></p>
<p><font face="Arial">　　通过始终移除缓存最久的结果，我们实际上进行了这样的假设：在将来，比起缓存最久的数据，最近输入的数据更有可能用到。这通常是一个不错的假设。</font></p>
<p><font face="Arial">　　新算法将确保缓存的容量处于预定义的内存范围之内。确切的范围可能很难计算，因为缓存中的对象在不断变化，而且它们的引用包罗万象。为缓存设置正确的大小是一项非常复杂的任务，需要将所使用的内存容量与检索数据的速度加以平衡。</font></p>
<p><font face="Arial">　　解决这个问题的另一种方法是使用java.lang.ref.SoftReference类跟踪缓存中的对象。这种方法保证这些引用能够被移除，如果虚拟机的内存用尽而需要更多堆的话。</font></p>
<p><font face="Arial">　　ClassLoader</font></p>
<p><font face="Arial">　　Java ClassLoader结构的使用为内存泄漏提供了许多可乘之机。正是该结构本身的复杂性使ClassLoader在内存泄漏方面存在如此多的问题。ClassLoader的特别之处在于它不仅涉及&ldquo;常规&rdquo;的对象引用，还涉及元对象引用，比如：字段、方法和类。这意味着只要有对字段、方法、类或ClassLoader的对象的引用，ClassLoader就会驻留在JVM中。因为ClassLoader本身可以关联许多类及其静态字段，所以就有许多内存被泄漏了。</font></p>
<p><font face="Arial">　　确定泄漏的位置</font></p>
<p><font face="Arial">　　通常发生内存泄漏的第一个迹象是：在应用程序中出现了OutOfMemoryError。这通常发生在您最不愿意它发生的生产环境中，此时几乎不能进行调试。有可能是因为测试环境运行应用程序的方式与生产系统不完全相同，因而导致泄漏只出现在生产中。在这种情况下，需要使用一些开销较低的工具来监控和查找内存泄漏。还需要能够无需重启系统或修改代码就可以将这些工具连接到正在运行的系统上。可能最重要的是，当进行分析时，需要能够断开工具而保持系统不受干扰。</font></p>
<p><font face="Arial">　　虽然OutOfMemoryError通常都是内存泄漏的信号，但是也有可能应用程序确实正在使用这么多的内存;对于后者，或者必须增加JVM可用的堆的数量，或者对应用程序进行某种更改，使它使用较少的内存。但是，在许多情况下，OutOfMemoryError都是内存泄漏的信号。一种查明方法是不间断地监控GC的活动，确定内存使用量是否随着时间增加。如果确实如此，就可能发生了内存泄漏。</font></p>
<p><font face="Arial"></font>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/144859#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 Nov 2007 15:20:28 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/144859</link>
        <guid>http://cnhzliye.javaeye.com/blog/144859</guid>
      </item>
      <item>
        <title>db4o入门实例</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/144851" style="color:red;">http://cnhzliye.javaeye.com/blog/144851</a>&nbsp;
          发表时间: 2007年11月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">一、db4o简介：<br />
&nbsp;&nbsp;&nbsp; 简单的说，就是可以用对象的方式存储数据，比如java的集合对象，javabean,pojo对象等。<br />
&nbsp;&nbsp;&nbsp; 开源,可以基于dboGPL协议免费使用，最新版本目前到了6.1版本（java）。官方网站有基于MySql数据库和其他存取方式性能比较的数据，性能十分不错。传闻应用十分广泛，从金融系统到战斗机控制系统都有使用。</font></p>
<p><font face="Arial">db4o 为我们带来的是这样一种面向对象的查询方式:<br />
1.完全原生，目前查询语言能用Java和.NET表达 <br />
2.100% 面向对象, 抛开对象-关系映射 <br />
3.100% 的类型安全 查询语言能完全获取现代IDE的特性，<br />
&nbsp;&nbsp;&nbsp; 比如语法检测、类型检测、重构，等等。 </font></p>
<p><font face="Arial">二、安装<br />
只要将jar文件加到classpath中即可。</font></p>
<p><font face="Arial">下载了之后，有PDF格式和HTML格式的指南文档。<br />
&nbsp;<br />
三、入门实例：(运行以后将在当前目录中产生db.data数据库文件)</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.db4o.Db4o; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;com.db4o.ObjectContainer; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;com.db4o.ObjectSet; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;FirstStepsExample{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectContainer&nbsp;db=Db4o.openFile(</span><span class="string">&quot;db.data&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storeFirstPilot(db); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;storeSecondPilot(db); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrieveAllPilots(db); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrievePilotByName(db); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrievePilotByExactPoints(db); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updatePilot(db); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deleteFirstPilotByName(db); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deleteSecondPilotByName(db); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;accessDb4o()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectContainer&nbsp;db=Db4o.openFile(</span><span class="string">&quot;db.data&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;do&nbsp;something&nbsp;with&nbsp;db4o </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;storeFirstPilot(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;pilot1=</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="string">&quot;Michael&nbsp;Schumacher&quot;</span><span>,</span><span class="number">100</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.set(pilot1); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Stored&nbsp;&quot;</span><span>+pilot1); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;storeSecondPilot(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;pilot2=</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="string">&quot;Rubens&nbsp;Barrichello&quot;</span><span>,</span><span class="number">99</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.set(pilot2); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Stored&nbsp;&quot;</span><span>+pilot2); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;retrieveAllPilotQBE(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;proto=</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="keyword">null</span><span>,</span><span class="number">0</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(proto); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listResult(result); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;retrieveAllPilots(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(Pilot.</span><span class="keyword">class</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listResult(result); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;retrievePilotByName(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;proto=</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="string">&quot;Michael&nbsp;Schumacher&quot;</span><span>,</span><span class="number">0</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(proto); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listResult(result); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;retrievePilotByExactPoints(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;proto=</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="keyword">null</span><span>,</span><span class="number">100</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(proto); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listResult(result); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;updatePilot(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="string">&quot;Michael&nbsp;Schumacher&quot;</span><span>,</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;found=(Pilot)result.next(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;found.addPoints(</span><span class="number">11</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.set(found); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Added&nbsp;11&nbsp;points&nbsp;for&nbsp;&quot;</span><span>+found); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrieveAllPilots(db); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;deleteFirstPilotByName(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="string">&quot;Michael&nbsp;Schumacher&quot;</span><span>,</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;found=(Pilot)result.next(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.delete(found); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Deleted&nbsp;&quot;</span><span>+found); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrieveAllPilots(db); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;deleteSecondPilotByName(ObjectContainer&nbsp;db)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectSet&nbsp;result=db.get(</span><span class="keyword">new</span><span>&nbsp;Pilot(</span><span class="string">&quot;Rubens&nbsp;Barrichello&quot;</span><span>,</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pilot&nbsp;found=(Pilot)result.next(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;db.delete(found); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Deleted&nbsp;&quot;</span><span>+found); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retrieveAllPilots(db); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;listResult(ObjectSet&nbsp;result)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result.size()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(result.hasNext())&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result.next()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Pilot&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;points;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Pilot(String&nbsp;name,</span><span class="keyword">int</span><span>&nbsp;points)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name=name; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.points=points; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getPoints()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;points; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;addPoints(</span><span class="keyword">int</span><span>&nbsp;points)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.points+=points; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;toString()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name+</span><span class="string">&quot;/&quot;</span><span>+points; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>运行结果： C:\Test&gt;java FirstStepsExample<br />
Stored Michael Schumacher/100<br />
Stored Rubens Barrichello/99<br />
2<br />
Michael Schumacher/100<br />
Rubens Barrichello/99<br />
1<br />
Michael Schumacher/100<br />
1<br />
Michael Schumacher/100<br />
Added 11 points for Michael Schumacher/111<br />
2<br />
Michael Schumacher/111<br />
Rubens Barrichello/99<br />
Deleted Michael Schumacher/111<br />
1<br />
Rubens Barrichello/99<br />
Deleted Rubens Barrichello/99<br />
0 </p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/144851#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 Nov 2007 15:06:00 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/144851</link>
        <guid>http://cnhzliye.javaeye.com/blog/144851</guid>
      </item>
      <item>
        <title>修饰符的一点迷惑。。。</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/144740" style="color:red;">http://cnhzliye.javaeye.com/blog/144740</a>&nbsp;
          发表时间: 2007年11月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p dir="ltr" style="MARGIN-RIGHT: 0px">在类的方法或成员变量前加修饰符pirvate，表示该方法只能在该类中被访问。。。</p>
<p dir="ltr" style="MARGIN-RIGHT: 0px">但是，我在别的类中，通过反射，可以&ldquo;暴力&rdquo;的执行加private的方法或者得到加private的成员变量。。。</p>
<p dir="ltr" style="MARGIN-RIGHT: 0px">&nbsp;</p>
<p dir="ltr" style="MARGIN-RIGHT: 0px">是不是&ldquo;自相矛盾&rdquo;啊？那位牛人可否解释一下。。。谢谢</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/144740#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 Nov 2007 10:11:56 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/144740</link>
        <guid>http://cnhzliye.javaeye.com/blog/144740</guid>
      </item>
      <item>
        <title>建立Android中文网, 正在文档中文化 [收藏]</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/143507" style="color:red;">http://cnhzliye.javaeye.com/blog/143507</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.javaeye.com/topic/140725" target="_blank">http://www.javaeye.com/topic/140725</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/143507#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 Nov 2007 09:09:43 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/143507</link>
        <guid>http://cnhzliye.javaeye.com/blog/143507</guid>
      </item>
      <item>
        <title>google android 初体验两个不爽【ZT】</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/143505" style="color:red;">http://cnhzliye.javaeye.com/blog/143505</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.javaeye.com/topic/141854?page=1" target="_blank">http://www.javaeye.com/topic/141854?page=1</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/143505#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 Nov 2007 09:03:54 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/143505</link>
        <guid>http://cnhzliye.javaeye.com/blog/143505</guid>
      </item>
      <item>
        <title>在WebWork中实现自己的Result Type</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/131283" style="color:red;">http://cnhzliye.javaeye.com/blog/131283</a>&nbsp;
          发表时间: 2007年10月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          飞云小侠 2005-7-27  http://www.jscud.com 转载请注明作者 <br /><br /><br />我在项目中经常用到这样的功能:例如添加完一个文章,我通常会提示用户"操作完成",然后转向到文章列表页面或者文章详情页面.以前的做法是使用WebWork本身的dispatcher结果类型,设置结果页面为信息提示页面,在程序中设置目标页面和提示信息.这样虽然也可以完成我的目标,但是目标页面是在程序里面写死的,无法放在配置里.<br /><br />这几天研究了一下WebWork的Result Type,发现写一个新的Result Type很容易,于是诞生了我的一个新的Result Type:<br /><br />功能:信息提示并转向到目标页面<br />流程:在Action中设置提示信息(当然也可以改到配置文件里,但是配置起来略麻烦,所以还是写在程序里了),然后使用我的结果类型msgto,在配置文件里面配置目标页面.<br /><br /><br />代码如下<br /><br />1.页面信息提示类(包含页面提示信息和目标页面,停留时间)<br /><br />   <br /> package com.jscud.www.support.web;<br /> <br /> <br /> /*<br />  * Created Date  2004-11-23<br />  *<br />  */<br /> <br /> /**<br />  * 用于页面提示的信息类.<br />  * <br />  * @author scud<br />  *  <br />  */<br /> public class PageMessage<br /> {<br />     /**标题*/<br />     private String msgTitle;<br /> <br />     /**内容体*/<br />     private String msgContent;<br /> <br />     /**要转向到的网址*/<br />     private String msgToURL;<br /> <br />     /**停留时间*/<br />     private int msgToTime = 1 ;<br /> <br />     <br />     public String getMsgContent()<br />     {<br />         return msgContent;<br />     }<br /> <br />     public void setMsgContent(String msgContent)<br />     {<br />         this.msgContent = msgContent;<br />     }<br /> <br />     public String getMsgTitle()<br />     {<br />         return msgTitle;<br />     }<br /> <br />     public void setMsgTitle(String msgTitle)<br />     {<br />         this.msgTitle = msgTitle;<br />     }<br /> <br />     public int getMsgToTime()<br />     {<br />         <br />         return msgToTime;<br />     }<br /> <br />     public void setMsgToTime(int msgToTime)<br />     {<br />         this.msgToTime = msgToTime;<br />     }<br /> <br />     public String getMsgToURL()<br />     {<br />         return msgToURL;<br />     }<br /> <br />     public void setMsgToURL(String msgToURL)<br />     {<br />         this.msgToURL = msgToURL;<br />     }<br /> }<br /> <br /><br /> <br /> <br /> <br />2."msgto" Result Type ,借鉴了WebWork本身的几个ResultType,部分代码是copy过来的<br /><br />   package com.jscud.www.support.web;<br /> <br /> //import com.jscud.util.LogMan;<br /> import com.opensymphony.webwork.config.Configuration;<br /> import com.opensymphony.webwork.dispatcher.ServletDispatcher;<br /> import com.opensymphony.webwork.dispatcher.WebWorkResultSupport;<br /> <br /> import com.opensymphony.webwork.ServletActionContext;<br /> import com.opensymphony.xwork.ActionContext;<br /> import com.opensymphony.xwork.ActionInvocation;<br /> import com.opensymphony.xwork.util.OgnlValueStack;<br /> <br /> import javax.servlet.RequestDispatcher;<br /> import javax.servlet.http.HttpServletRequest;<br /> import javax.servlet.http.HttpServletResponse;<br /> <br /> /*<br />  * Created on 2005-7-26<br />  *<br />  */<br /> <br /> /**<br />  * WebWork Result Type for "msgto".<br />  * <br />  * Message Hint to User then Refresh to another Page.<br />  *<br />  * @author scud.<br />  *<br />  */<br /> public class ServletMessageToResult extends WebWorkResultSupport<br /> {<br /> <br />     //~ Static fields/initializers /////////////////////////////////////////////<br /> <br />     private static final String DefaultMessagePage = "/WEB-INF/public/page/msgto.jsp";<br /> <br />     protected String messagePage;<br />     <br />     protected boolean prependServletContext = true;<br /> <br /> <br />     //~ Methods ////////////////////////////////////////////////////////////////<br /> <br />     public void setMessagePage(String sPagePath)<br />     {<br />         this.messagePage = sPagePath;<br />     }<br /> <br />     public String getMessagePage()<br />     {<br />         if (null == messagePage)<br />         {<br />             if (Configuration.isSet("jscud.page.messageto"))<br />             {<br />                 this.messagePage = Configuration.getString("jscud.page.messageto");<br />             }<br />             else<br />             {<br />                 this.messagePage = DefaultMessagePage;<br />             }<br />         }<br /> <br />         return messagePage;<br />     }<br /> <br />     <br />     /**<br />      * Sets whether or not to prepend the servlet context path to the redirected URL.<br />      *<br />      * @param prependServletContext &lt;tt>true&lt;/tt> to prepend the location with the servlet context path,<br />      *                              &lt;tt>false&lt;/tt> otherwise.<br />      */<br />     public void setPrependServletContext(boolean prependServletContext) {<br />         this.prependServletContext = prependServletContext;<br />     }<br />     <br />     /**<br />      * Dispatches to the Message Page. Does its forward via a RequestDispatcher. If the<br />      * dispatch fails a 404 error will be sent back in the http response.<br />      *<br />      * @param finalLocation the location to dispatch to.<br />      * @param invocation    the execution state of the action<br />      * @throws Exception if an error occurs. If the dispatch fails the error will go back via the<br />      *                   HTTP request.<br />      */<br />     public void doExecute(String finalLocation, ActionInvocation invocation)<br />             throws Exception<br />     {<br />         String messageLocation = getMessagePage();<br /> <br />         HttpServletRequest request = ServletActionContext.getRequest();<br />         HttpServletResponse response = ServletActionContext.getResponse();<br /> <br />         RequestDispatcher dispatcher = request.getRequestDispatcher(messageLocation);<br /> <br />         // if the view doesn't exist, let's do a 404<br />         if (dispatcher == null)<br />         {<br />             response.sendError(404, "message page '" + messageLocation + "' not found");<br /> <br />             return;<br />         }<br /> <br />         request.setAttribute("webwork.view_uri", messageLocation);<br />         request.setAttribute("webwork.request_uri", request.getRequestURI());<br /> <br />         //set refresh target url<br />         if (isPathUrl(finalLocation))<br />         {<br />             if (!finalLocation.startsWith("/"))<br />             {<br />                 String actionPath = request.getServletPath();<br />                 String namespace = ServletDispatcher<br />                         .getNamespaceFromServletPath(actionPath);<br /> <br />                 if ((namespace != null) && (namespace.length() > 0))<br />                 {<br />                     finalLocation = namespace + "/" + finalLocation;<br />                 }<br />                 else<br />                 {<br />                     finalLocation = "/" + finalLocation;<br />                 }<br />             }<br /> <br />             // if the URL's are relative to the servlet context, append the servlet context path<br />             if (prependServletContext && (request.getContextPath() != null)<br />                     && (request.getContextPath().length() > 0))<br />             {<br />                 finalLocation = request.getContextPath() + finalLocation;<br />             }<br /> <br />             finalLocation = response.encodeRedirectURL(finalLocation);<br />         }<br /> <br />         //LogMan.debug("Refreshing to finalLocation " + finalLocation);<br />         <br />         //设置属性<br />         OgnlValueStack stack = ActionContext.getContext().getValueStack();<br />         <br />         PageMessage aPageMessage = (PageMessage)stack.findValue("pagemessage",PageMessage.class);<br />         <br />         if(null!=aPageMessage)<br />         {<br />             aPageMessage.setMsgToURL(finalLocation);<br />         }<br />         <br />         dispatcher.forward(request, response);<br />     }<br /> <br />     //copy from ServletRedirectResult<br />     private static boolean isPathUrl(String url)<br />     {<br />         // filter out "http:", "https:", "mailto:", "file:", "ftp:"<br />         // since the only valid places for : in URL's is before the path specification<br />         // either before the port, or after the protocol<br />         return (url.indexOf(':') == -1);<br />     } <br /> }<br /> <br /> <br /><br /><br /> <br />3.信息提示页面<br /><br /> 缺省为/WEB-INF/public/page/msgto.jsp,可以在webwork.properties里面配置"jscud.page.messageto",还可以通过配置文件配置.<br /> <br /> 可以根据自己需要更改页面内容.<br /> <br />   &lt;%@ page contentType="text/html; charset=GBK" %><br /> &lt;%@ taglib uri="webwork" prefix="ww" %><br /> <br /> &lt;html><br /> &lt;head><br /> &lt;meta http-equiv="pragma" content="no-cache"><br /> &lt;meta http-equiv="Cache-Control" content="no-cache, must-revalidate"><br /> &lt;meta http-equiv="expires" content="0"><br /> <br /> &lt;meta http-equiv="Content-Type" content="text/html; charset=GBK"><br /> <br /> &lt;meta http-equiv="refresh" content="&lt;ww:property value="pagemessage.msgToTime" />;URL=&lt;ww:property value="pagemessage.msgToURL" />"><br /> <br /> &lt;title>&lt;ww:property value="pagemessage.msgTitle" />&lt;/title><br /> &lt;/head><br /> &lt;body ><br /> &lt;div align=center><br /> &lt;table width=90% border="0" cellspacing="0" cellpadding="0" align="center" bgcolor=#ffffff><br />   &lt;tr valign="top"><br />     &lt;td width="2">       　<br />     &lt;/td><br />     &lt;td width="5">&lt;/td><br />     &lt;td colspan="3"><br /> &lt;center>&lt;br>&lt;br><br /> &lt;table align="center" border="0" cellpadding="5" cellspacing="0" width="100%"><br /> &lt;tbody><br /> &lt;tr><br /> &lt;td>&lt;ww:property value="pagemessage.msgTitle" /><br /> &lt;hr noshade size="1" color="#808000"><br /> &lt;/td><br /> &lt;/tr><br /> &lt;tr><br /> &lt;td>&lt;ww:property value="pagemessage.msgContent" />&lt;br>&lt;br>&lt;br><br /> 请稍后......&lt;br><br /> &lt;/td><br /> &lt;/tr><br /> &lt;/tbody><br /> &lt;/table><br /> &lt;/center><br /> <br />     &lt;/td><br />   &lt;/tr><br /> &lt;/table><br /> <br /> &lt;/div><br /> &lt;/body><br /> &lt;/html><br /> <br /><br /><br /> <br /> <br /> <br />4.配置示例<br /><br />     &lt;result-types><br />   &lt;result-type name="msgto" class="com.jscud.www.support.web.ServletMessageToResult" /><br />  &lt;/result-types> <br /><br /><br /> &lt;action name="doAddCata" class="catagoryAction" method="doSet"><br />   &lt;result name="input" type="dispatcher"><br />    &lt;param name="location">/WEB-INF/jsp/news/catagory_add.jsp&lt;/param><br />   &lt;/result><br />   &lt;result name="success" type="msgto"><br />    &lt;param name="location">/news/admin/admin.jspa&lt;/param><br />   &lt;/result><br />  &lt;/action> <br /> <br /><br /><br />   <br /><br />5.Action中的代码示例<br /><br /> <br /><br />     /**<br />     * 增加/编辑类别<br />     * <br />     * @return 结果<br />     */<br />    public String doSet()<br />    {<br />        //输入界面<br />        if (null == catagory)<br />        {<br />            return INPUT;<br />        } <br />        catagoryManager.updateCatagory(getCatagory(), getWork());<br />            //return goException("设置分类时发生了错误",ex);<br /><br />        setPageMessageProp("操作成功", "操作成功");<br /><br />        return SUCCESS;<br />    }<br /> <br /><br /><br /><br /><br /><br /> <br /> <br /> <br /> 以下代码放在基础Action里:(自己要做适当修改)<br /> <br /><br />    /**<br />     * 设置信息提示的内容.<br />     * <br />     * @param sTitle<br />     * @param sHintMsg<br />     */<br />    protected void setPageMessageProp(String sTitle, String sHintMsg)<br />    {<br />        PageMessage apm = new PageMessage(); <br />        if ((null == sTitle) || (sTitle.equals("")))<br />        {<br />            sTitle = getText("core.errorhint.title.default");<br />        }<br /><br />        apm.setMsgTitle(sTitle);<br />        apm.setMsgContent(sHintMsg);<br /><br />        setPagemessage(apm);<br />    }<br /><br />    /**<br />     * 设置信息提示的参数.(转向)<br />     * <br />     * @param sTitle<br />     * @param sHintMsg<br />     * @param toURL<br />     * @param nToTime<br />     */<br />    protected void setPageMessageProp(String sTitle, String sHintMsg,int nToTime)<br />    {<br />        PageMessage apm = new PageMessage();<br /><br />        if ((null == sTitle) || (sTitle.equals("")))<br />        {<br />            sTitle = getText("core.errorhint.title.default");<br />        }<br /><br />        apm.setMsgTitle(sTitle);<br />        apm.setMsgContent(sHintMsg);<br />        //apm.setMsgToURL(toURL);<br />        apm.setMsgToTime(nToTime);<br /><br />        setPagemessage(apm);<br />    }<br /><br /><br />    public PageMessage getPagemessage()<br />    {<br />        return pagemessage;<br />    }<br /><br />    public void setPagemessage(PageMessage pagemessage)<br />    {<br />        this.pagemessage = pagemessage;<br />    }<br /> <br />  <br /> <br /><br />ok,很简单,不是吗?
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/131283#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 12 Oct 2007 10:15:47 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/131283</link>
        <guid>http://cnhzliye.javaeye.com/blog/131283</guid>
      </item>
      <item>
        <title>时区转换代码</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/127969" style="color:red;">http://cnhzliye.javaeye.com/blog/127969</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>timeZone_digital&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date().getTimezoneOffset()&nbsp;得到时区时间差值&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>以上是JS得到的&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;TimeZone&nbsp;getTimeZone(String&nbsp;timeZone_digital)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;gmt&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(timeZone_digital&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;length&nbsp;=&nbsp;timeZone_digital.length();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;d&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;f&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(length&nbsp;==&nbsp;</span><span class="number">1</span><span>)&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmt&nbsp;=&nbsp;</span><span class="string">&quot;GMT&quot;</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(timeZone_digital.startsWith(</span><span class="string">&quot;-&quot;</span><span>))&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d&nbsp;=&nbsp;timeZone_digital.substring(</span><span class="number">0</span><span>,&nbsp;</span><span class="number">1</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;=&nbsp;timeZone_digital.substring(</span><span class="number">1</span><span>,&nbsp;length);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmt&nbsp;=&nbsp;</span><span class="string">&quot;GMT+&quot;</span><span>&nbsp;+&nbsp;Integer.parseInt(f)&nbsp;/&nbsp;</span><span class="number">60</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gmt&nbsp;=&nbsp;</span><span class="string">&quot;GMT-&quot;</span><span>&nbsp;+&nbsp;Integer.parseInt(timeZone_digital)&nbsp;/&nbsp;</span><span class="number">60</span><span>;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;北京时区&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;TimeZone.getTimeZone(</span><span class="string">&quot;GMT+8&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;TimeZone.getTimeZone(gmt);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/127969#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 17:07:51 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/127969</link>
        <guid>http://cnhzliye.javaeye.com/blog/127969</guid>
      </item>
      <item>
        <title>Spring 的优秀工具类盘点，第 2 部分: 特殊字符转义和方法入参检测工具类</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/127809" style="color:red;">http://cnhzliye.javaeye.com/blog/127809</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          级别： 初级<br /><br />陈 雄华 (quickselect@163.com), 技术总监, 宝宝淘网络科技有限公司<br /><br /><br />2007 年 8 月 31 日<br /><br />Spring 不但提供了一个功能全面的应用开发框架，本身还拥有众多可以在程序编写时直接使用的工具类，您不但可以在 Spring 应用中使用这些工具类，也可以在其它的应用中使用，这些工具类中的大部分是可以在脱离 Spring 框架时使用的。了解 Spring 中有哪些好用的工具类并在程序编写时适当使用，将有助于提高开发效率、增强代码质量。<br /><br />在这个分为两部分的文章中，我们将从众多的 Spring 工具类中遴选出那些好用的工具类介绍给大家。第 1 部分 介绍了与文件资源操作和 Web 相关的工具类。在第 2 部分中将介绍特殊字符转义和方法入参检测工具类。<br /><br />特殊字符转义<br /><br />由于 Web 应用程序需要联合使用到多种语言，每种语言都包含一些特殊的字符，对于动态语言或标签式的语言而言，如果需要动态构造语言的内容时，一个我们经常会碰到的问题就是特殊字符转义的问题。下面是 Web 开发者最常面对需要转义的特殊字符类型：<br /><br />HTML 特殊字符； <br />JavaScript 特殊字符； <br />SQL 特殊字符； <br />如果不对这些特殊字符进行转义处理，则不但可能破坏文档结构，还可以引发潜在的安全问题。Spring 为 HTML 和 JavaScript 特殊字符提供了转义操作工具类，它们分别是 HtmlUtils 和 JavaScriptUtils。<br /><br />HTML 特殊字符转义<br /><br />HTML 中 &lt;，>，& 等字符有特殊含义，它们是 HTML 语言的保留字，因此不能直接使用。使用这些个字符时，应使用它们的转义序列：<br /><br />&：&amp; <br />" ：&quot; <br />&lt; ：&lt; <br />> ：&gt; <br />由于 HTML 网页本身就是一个文本型结构化文档，如果直接将这些包含了 HTML 特殊字符的内容输出到网页中，极有可能破坏整个 HTML 文档的结构。所以，一般情况下需要对动态数据进行转义处理，使用转义序列表示 HTML 特殊字符。下面的 JSP 网页将一些变量动态输出到 HTML 网页中：<br /><br /><br />清单 1. 未进行 HTML 特殊字符转义处理网页<br />                <br />&lt;%@ page language="java" contentType="text/html; charset=utf-8"%><br />&lt;%!<br />   String userName = "&lt;/td>&lt;tr>&lt;/table>";<br />   String address = " \" type=\"button";<br /> %><br />&lt;table border="1"><br />   &lt;tr><br />     &lt;td>姓名：&lt;/td>&lt;td>&lt;%=userName%>&lt;/td> ①<br />   &lt;/tr><br />   &lt;tr><br />     &lt;td>年龄：&lt;/td>&lt;td>28&lt;/td><br />   &lt;/tr><br />&lt;/table><br /> &lt;input value="&lt;%=address%>"  type="text" /> ②<br /> <br /><br /><br />在 ① 和 ② 处，我们未经任何转义处理就直接将变量输出到 HTML 网页中，由于这些变量可能包含一些特殊的 HTML 的字符，它们将可能破坏整个 HTML 文档的结构。我们可以从以上 JSP 页面的一个具体输出中了解这一问题：<br /><br />&lt;table border="1"><br />   &lt;tr><br />     &lt;td>姓名：&lt;/td>&lt;td>&lt;/td>&lt;tr>&lt;/table>&lt;/td> <br />     ① 破坏了 &lt;table> 的结构<br />   &lt;/tr><br />   &lt;tr><br />     &lt;td>年龄：&lt;/td>&lt;td>28&lt;/td><br />   &lt;/tr><br />&lt;/table><br /> &lt;input value=" " type="button"  type="text" /> <br /> ② 将本来是输入框组件偷梁换柱为按钮组件<br /> <br /><br /><br />融合动态数据后的 HTML 网页已经面目全非，首先 ① 处的 &lt;table> 结构被包含 HTML 特殊字符的 userName 变量截断了，造成其后的 &lt;table> 代码变成无效的内容；其次，② 处 &lt;input> 被动态数据改换为按钮类型的组件（type="button"）。为了避免这一问题，我们需要事先对可能破坏 HTML 文档结构的动态数据进行转义处理。Spring 为我们提供了一个简单适用的 HTML 特殊字符转义工具类，它就是 HtmlUtils。下面，我们通过一个简单的例子了解 HtmlUtils 的具体用法：<br /><br /><br />清单 2. HtmpEscapeExample<br />                <br />package com.baobaotao.escape;<br />import org.springframework.web.util.HtmlUtils;<br />public class HtmpEscapeExample {<br />    public static void main(String[] args) {<br />        String specialStr = "&lt;div id=\"testDiv\">test1;test2&lt;/div>";<br />        String str1 = HtmlUtils.htmlEscape(specialStr); ①转换为HTML转义字符表示<br />        System.out.println(str1);<br />       <br />        String str2 = HtmlUtils.htmlEscapeDecimal(specialStr); ②转换为数据转义表示<br />        System.out.println(str2);<br />       <br />        String str3 = HtmlUtils.htmlEscapeHex(specialStr); ③转换为十六进制数据转义表示<br />        System.out.println(str3);<br />       <br />        ④下面对转义后字符串进行反向操作<br />        System.out.println(HtmlUtils.htmlUnescape(str1));<br />        System.out.println(HtmlUtils.htmlUnescape(str2));<br />        System.out.println(HtmlUtils.htmlUnescape(str3));<br />    }<br />}<br /> <br /><br /><br />HTML 不但可以使用通用的转义序列表示 HTML 特殊字符，还可以使用以 # 为前缀的数字序列表示 HTML 特殊字符，它们在最终的显示效果上是一样的。HtmlUtils 提供了三个转义方法：<br /><br />方法 说明 <br />static String htmlEscape(String input)  将 HTML 特殊字符转义为 HTML 通用转义序列； <br />static String htmlEscapeDecimal(String input)  将 HTML 特殊字符转义为带 # 的十进制数据转义序列； <br />static String htmlEscapeHex(String input)  将 HTML 特殊字符转义为带 # 的十六进制数据转义序列； <br /><br />此外，HtmlUtils 还提供了一个能够将经过转义内容还原的方法：htmlUnescape(String input)，它可以还原以上三种转义序列的内容。运行以上代码，您将可以看到以下的输出：<br /><br />str1:&lt;div id=&quot;testDiv&quot;&gt;test1;test2&lt;/div&gt;<br />str2:&#60;div id=&#34;testDiv&#34;&#62;test1;test2&#60;/div&#62;<br />str3:&#x3c;div id=&#x22;testDiv&#x22;&#x3e;test1;test2&#x3c;/div&#x3e;<br />&lt;div id="testDiv">test1;test2&lt;/div><br />&lt;div id="testDiv">test1;test2&lt;/div><br />&lt;div id="testDiv">test1;test2&lt;/div><br /> <br /><br /><br />您只要使用 HtmlUtils 对代码 清单 1 的 userName 和 address 进行转义处理，最终输出的 HTML 页面就不会遭受破坏了。<br /><br />JavaScript 特殊字符转义<br /><br />JavaScript 中也有一些需要特殊处理的字符，如果直接将它们嵌入 JavaScript 代码中，JavaScript 程序结构将会遭受破坏，甚至被嵌入一些恶意的程序。下面列出了需要转义的特殊 JavaScript 字符：<br /><br />' ：\' <br />" ：\" <br />\ ：\\ <br />走纸换页： \f <br />换行：\n <br />换栏符：\t <br />回车：\r <br />回退符：\b <br /> <br />我们通过一个具体例子演示动态变量是如何对 JavaScript 程序进行破坏的。假设我们有一个 JavaScript 数组变量，其元素值通过一个 Java List 对象提供，下面是完成这一操作的 JSP 代码片断：<br /><br /><br />清单 3. jsTest.jsp：未对 JavaScript 特殊字符进行处理<br />                <br />&lt;%@ page language="java" contentType="text/html; charset=utf-8"%><br />&lt;jsp:directive.page import="java.util.*"/><br />&lt;%<br />  List textList = new ArrayList();<br />  textList.add("\";alert();j=\"");<br />%><br />&lt;script><br />  var txtList = new Array();<br />   &lt;% for ( int i = 0 ; i &lt; textList.size() ; i++) { %><br />     txtList[&lt;%=i%>] = "&lt;%=textList.get(i)%>"; <br />	 ① 未对可能包含特殊 JavaScript 字符的变量进行处理<br />   &lt;% } %><br />&lt;/script><br /> <br /><br /><br />当客户端调用这个 JSP 页面后，将得到以下的 HTML 输出页面：<br /><br />&lt;script><br />  var txtList = new Array();<br />   txtList[0] = "";alert();j=""; ① 本来是希望接受一个字符串，结果被植入了一段JavaScript代码<br />&lt;/script><br /> <br /><br /><br />由于包含 JavaScript 特殊字符的 Java 变量直接合并到 JavaScript 代码中，我们本来期望 ① 处所示部分是一个普通的字符串，但结果变成了一段 JavaScript 代码，网页将弹出一个 alert 窗口。想像一下如果粗体部分的字符串是“";while(true)alert();j="”时会产生什么后果呢？<br /><br />因此，如果网页中的 JavaScript 代码需要通过拼接 Java 变量动态产生时，一般需要对变量的内容进行转义处理，可以通过 Spring 的 JavaScriptUtils 完成这件工作。下面，我们使用 JavaScriptUtils 对以上代码进行改造：<br /><br />&lt;%@ page language="java" contentType="text/html; charset=utf-8"%><br />&lt;jsp:directive.page import="java.util.*"/><br />&lt;jsp:directive.page import="org.springframework.web.util.JavaScriptUtils"/><br />&lt;%<br />  List textList = new ArrayList();<br />  textList.add("\";alert();j=\"");<br />%><br />&lt;script><br />   var txtList = new Array();<br />   &lt;% for ( int i = 0 ; i &lt; textList.size() ; i++) { %><br />   ① 在输出动态内容前事先进行转义处理<br />   txtList[&lt;%=i%>] = "&lt;%=JavaScriptUtils.javaScriptEscape(""+textList.get(i))%>";<br />   &lt;% } %><br />&lt;/script><br /> <br /><br /><br />通过转义处理后，这个 JSP 页面输出的结果网页的 JavaScript 代码就不会产生问题了：<br /><br />&lt;script><br />   var txtList = new Array();<br />   txtList[0] = "\";alert();j=\"";<br />   ① 粗体部分仅是一个普通的字符串，而非一段 JavaScript 的语句了<br />&lt;/script><br /> <br /><br /><br />SQL特殊字符转义<br /><br />应该说，您即使没有处理 HTML 或 JavaScript 的特殊字符，也不会带来灾难性的后果，但是如果不在动态构造 SQL 语句时对变量中特殊字符进行处理，将可能导致程序漏洞、数据盗取、数据破坏等严重的安全问题。网络中有大量讲解 SQL 注入的文章，感兴趣的读者可以搜索相关的资料深入研究。<br /><br />虽然 SQL 注入的后果很严重，但是只要对动态构造的 SQL 语句的变量进行特殊字符转义处理，就可以避免这一问题的发生了。来看一个存在安全漏洞的经典例子：<br /><br />SELECT COUNT(userId) <br />FROM t_user <br />WHERE userName='"+userName+"' AND password ='"+password+"';<br /> <br /><br /><br />以上 SQL 语句根据返回的结果数判断用户提供的登录信息是否正确，如果 userName 变量不经过特殊字符转义处理就直接合并到 SQL 语句中，黑客就可以通过将 userName 设置为 “1' or '1'='1”绕过用户名/密码的检查直接进入系统了。<br /><br />所以除非必要，一般建议通过 PreparedStatement 参数绑定的方式构造动态 SQL 语句，因为这种方式可以避免 SQL 注入的潜在安全问题。但是往往很难在应用中完全避免通过拼接字符串构造动态 SQL 语句的方式。为了防止他人使用特殊 SQL 字符破坏 SQL 的语句结构或植入恶意操作，必须在变量拼接到 SQL 语句之前对其中的特殊字符进行转义处理。Spring 并没有提供相应的工具类，您可以通过 jakarta commons lang 通用类包中（spring/lib/jakarta-commons/commons-lang.jar）的 StringEscapeUtils 完成这一工作：<br /><br /><br />清单 4. SqlEscapeExample<br />                <br />package com.baobaotao.escape;<br />import org.apache.commons.lang.StringEscapeUtils;<br />public class SqlEscapeExample {<br />    public static void main(String[] args) {<br />        String userName = "1' or '1'='1";<br />        String password = "123456";<br />        userName = StringEscapeUtils.escapeSql(userName);<br />        password = StringEscapeUtils.escapeSql(password);<br />        String sql = "SELECT COUNT(userId) FROM t_user WHERE userName='"<br />            + userName + "' AND password ='" + password + "'";<br />        System.out.println(sql);<br />    }<br />}<br /> <br /><br /><br />事实上，StringEscapeUtils 不但提供了 SQL 特殊字符转义处理的功能，还提供了 HTML、XML、JavaScript、Java 特殊字符的转义和还原的方法。如果您不介意引入 jakarta commons lang 类包，我们更推荐您使用 StringEscapeUtils 工具类完成特殊字符转义处理的工作。<br /><br /><br /><br /> <br /><br /><br /> 回页首 <br /> <br /><br /><br /><br />方法入参检测工具类<br /><br />Web 应用在接受表单提交的数据后都需要对其进行合法性检查，如果表单数据不合法，请求将被驳回。类似的，当我们在编写类的方法时，也常常需要对方法入参进行合法性检查，如果入参不符合要求，方法将通过抛出异常的方式拒绝后续处理。举一个例子：有一个根据文件名获取输入流的方法：InputStream getData(String file)，为了使方法能够成功执行，必须保证 file 入参不能为 null 或空白字符，否则根本无须进行后继的处理。这时方法的编写者通常会在方法体的最前面编写一段对入参进行检测的代码，如下所示：<br /><br />public InputStream getData(String file) {<br />    if (file == null || file.length() == 0|| file.replaceAll("\\s", "").length() == 0) {<br />        throw new IllegalArgumentException("file入参不是有效的文件地址");<br />    }<br />…<br />}<br /> <br /><br /><br />类似以上检测方法入参的代码是非常常见，但是在每个方法中都使用手工编写检测逻辑的方式并不是一个好主意。阅读 Spring 源码，您会发现 Spring 采用一个 org.springframework.util.Assert 通用类完成这一任务。<br /><br />Assert 翻译为中文为“断言”，使用过 JUnit 的读者都熟知这个概念，它断定某一个实际的运行值和预期想一样，否则就抛出异常。Spring 对方法入参的检测借用了这个概念，其提供的 Assert 类拥有众多按规则对方法入参进行断言的方法，可以满足大部分方法入参检测的要求。这些断言方法在入参不满足要求时就会抛出 IllegalArgumentException。下面，我们来认识一下 Assert 类中的常用断言方法：<br /><br />断言方法 说明 <br />notNull(Object object)  当 object 不为 null 时抛出异常，notNull(Object object, String message) 方法允许您通过 message 定制异常信息。和 notNull() 方法断言规则相反的方法是 isNull(Object object)/isNull(Object object, String message)，它要求入参一定是 null； <br />isTrue(boolean expression) / isTrue(boolean expression, String message)  当 expression 不为 true 抛出异常； <br />notEmpty(Collection collection) / notEmpty(Collection collection, String message)  当集合未包含元素时抛出异常。notEmpty(Map map) / notEmpty(Map map, String message) 和 notEmpty(Object[] array, String message) / notEmpty(Object[] array, String message) 分别对 Map 和 Object[] 类型的入参进行判断； <br />hasLength(String text) / hasLength(String text, String message)  当 text 为 null 或长度为 0 时抛出异常； <br />hasText(String text) / hasText(String text, String message)  text 不能为 null 且必须至少包含一个非空格的字符，否则抛出异常； <br />isInstanceOf(Class clazz, Object obj) / isInstanceOf(Class type, Object obj, String message)  如果 obj 不能被正确造型为 clazz 指定的类将抛出异常； <br />isAssignable(Class superType, Class subType) / isAssignable(Class superType, Class subType, String message)  subType 必须可以按类型匹配于 superType，否则将抛出异常； <br /><br />使用 Assert 断言类可以简化方法入参检测的代码，如 InputStream getData(String file) 在应用 Assert 断言类后，其代码可以简化为以下的形式：<br /><br />public InputStream getData(String file){<br />    Assert.hasText(file,"file入参不是有效的文件地址"); <br />    ① 使用 Spring 断言类进行方法入参检测<br />…<br />}<br /> <br /><br /><br />可见使用 Spring 的 Assert 替代自编码实现的入参检测逻辑后，方法的简洁性得到了不少的提高。Assert 不依赖于 Spring 容器，您可以大胆地在自己的应用中使用这个工具类。<br /><br /><br /><br /> <br /><br /><br /> 回页首 <br /> <br /><br /><br /><br />小结<br /><br />本文介绍了一些常用的 Spring 工具类，其中大部分 Spring 工具类不但可以在基于 Spring 的应用中使用，还可以在其它的应用中使用。<br /><br />对于 Web 应用来说，由于有很多关联的脚本代码，如果这些代码通过拼接字符串的方式动态产生，就需要对动态内容中特殊的字符进行转义处理，否则就有可能产生意想不到的后果。Spring 为此提供了 HtmlUtils 和 JavaScriptUtils 工具类，只要将动态内容在拼接之前使用工具类进行转义处理，就可以避免类似问题的发生了。如果您不介意引入一个第三方类包，那么 jakarta commons lang 通用类包中的 StringEscapeUtils 工具类可能更加适合，因为它提供了更加全面的转义功能。<br /><br />最后我们还介绍了 Spring 的 Assert 工具类，Assert 工具类是通用性很强的工具类，它使用面向对象的方式解决方法入参检测的问题，您可以在自己的应用中使用 Assert 对方法入参进行检查。
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/127809#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 10:33:20 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/127809</link>
        <guid>http://cnhzliye.javaeye.com/blog/127809</guid>
      </item>
      <item>
        <title>webwork + ajax 整合实例 </title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/127252" style="color:red;">http://cnhzliye.javaeye.com/blog/127252</a>&nbsp;
          发表时间: 2007年09月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先, 配置好webwork环境. <br /><br /><br />在webwork中应用ajax技术,只要在webwork的返回值上加以区别就可以把 动态取得的值,返回给前台浏览器. <br /><br /><br />在这个实例中,我们有一个html页面,一个java文件,然后再配置文件中写上相关映射就OK了.<br /><br />代码如下:<br /><br />dynamicUpdate.html<br /><br /><br />&lt;html><br />&lt;head><br />    &lt;title>update of ajax&lt;/title><br />    &lt;script type="text/javascript">...<br />        var xmlHttp;<br />        var dom;<br />        function createXMLHttpRequest()...{<br />           if(window.ActiveXObject)...{<br />               xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br />           }else...{<br />               xmlHttp = new XMLHttpRequest();<br />           }<br />        }<br /><br />        function doStart()...{<br />            createXMLHttpRequest();<br />            var url = "dynamicUpdate.action?task=reset";<br />            xmlHttp.open("GET",url,true);<br />            xmlHttp.onreadystatechange = startCallback;<br />            xmlHttp.send(null);<br />        }<br />        <br />        function startCallback()...{<br />            if(xmlHttp.readyState == 4)...{<br />                if(xmlHttp.status == 200 )...{<br />                    setTimeout("pollServer()",5000);<br />                    refreshTime();<br />                }<br />            }<br />        }<br />        <br />        function pollServer()...{<br />            createXMLHttpRequest();<br />            var url = "dynamicUpdate.action?task=foo";<br />            xmlHttp.open("GET",url,true);<br />            xmlHttp.onreadystatechange = pollCallback;<br />            xmlHttp.send(null);<br />        }<br />        <br />        function refreshTime()...{<br />            var time_span = document.getElementById("time");<br />            var time_val = time_span.innerHTML;<br />            var int_val = parseInt(time_val);<br />            var new_int_val = int_val -1;<br />            <br />            if(new_int_val > -1)...{<br />                setTimeout("refreshTime()",5000);<br />                time_span.innerHTML = new_int_val;<br />            }else...{<br />                time_span.innerHTML = 5;<br />            }<br />        }<br />        <br />        function pollCallback()...{<br />            if(xmlHttp.readyState == 4)...{<br />                if(xmlHttp.status == 200)...{<br />                    //alert(xmlHttp.responseText)<br />                   // alert(xmlHttp.responseXML.childNodes.length)<br />                //    alert(xmlHttp.responseXML.getElementsByTagName("message")[0]);<br />                    createXMLParser(xmlHttp.responseText);<br />                    var message = dom.getElementsByTagName("message")[0].firstChild.data;<br />                    <br />                    if(message != "done")...{<br />                        var new_row = createRow(message);<br />                        var table = document.getElementById("dynamicUpdateArea");<br />                        var table_body = table.getElementsByTagName("tbody").item(0);<br />                        var first_row = table_body.getElementsByTagName("tr").item(1);<br />                        table_body.insertBefore(new_row,first_row);<br />                        setTimeout("pollServer()",5000);<br />                    }<br />                }<br />            }<br />        }<br />        <br />        function createRow(message)...{<br />            var row = document.createElement("tr");<br />            var cell = document.createElement("td");<br />            var cell_data = document.createTextNode(message);<br />            cell.appendChild(cell_data);<br />            row.appendChild(cell);<br />            return row;<br />        }<br />        <br />        //初始化XML解析器<br />        function createXMLParser(text)...{<br />            if(window.ActiveXObject)...{<br />                dom = new ActiveXObject("Microsoft.XMLDOM");<br />                dom.async = false;<br />                dom.loadXML(text);<br />            }else...{<br />                var parser = new DOMParser();<br />                dom = parser.parseFromString(text,"text/html");<br />            }<br />        }<br />    &lt;/script><br />&lt;/head><br /><br />&lt;body><br />&lt;h1>Ajax Dynamic Update Example&lt;/h1><br />This page will automatically update itself:<br />&lt;input type="button" value="Launch" id="go" onclick="doStart()"/><br />&lt;p><br />    Page will refresh in &lt;span id="time">5&lt;/span> seconds <br />&lt;/p><br />&lt;table id="dynamicUpdateArea" align="left"><br />    &lt;tbody><br />        &lt;tr id="row0">&lt;td>&lt;/td>&lt;/tr><br />    &lt;/tbody><br />&lt;/table><br />&lt;/body><br />&lt;/html><br /><br /><br /><br />DynamicUpdate.java<br /><br /><br />package control;<br /><br />import java.io.PrintWriter;<br />import java.math.*;<br />import javax.servlet.http.HttpServletResponse;<br /><br />import com.opensymphony.webwork.ServletActionContext;<br /><br />import core.BookActionSupport;<br /><br />public class DynamicUpdate extends BookActionSupport...{<br />    private int counter = 1;<br />    private double random;<br />    public String execute()...{<br />        String res = "";<br />        String task = getParameter("task");<br />        String message = "";<br />        random = Math.floor(Math.random()*100);<br />        while(random > 7)...{<br />            random = Math.sin(random)*10 ;<br />            random = Math.abs(Math.floor(random));<br />            System.out.println(random);<br />        }<br />        counter = (int)random;<br />        if(task.equals("reset"))...{<br />            counter = 1;<br />        }else...{<br />            switch(counter)...{<br />            case 1: message = "Steve walks on stage"; break;<br />            case 2: message = "iPods rock"; break;<br />            case 3: message = "Steve says Macs rule"; break;<br />            case 4: message = "Change is coming"; break;<br />            case 5: message = "Yes,OS X runs on Intel-has for years"; break;<br />            case 6: message = "Macs will soon have Intel chips"; break;<br />            case 7: message = "done"; break;<br />            }<br />        }<br />        res = "&lt;message>" + message + "&lt;/message>";<br />        try...{<br />            HttpServletResponse response = ServletActionContext.getResponse();<br />            PrintWriter out = response.getWriter();<br />            response.setContentType("text/html");<br />            response.setHeader("Cache-Control","no-cache");<br />            out.write(res);<br />            out.close();<br />            <br />        }catch(Exception e)...{<br />            System.out.println(e.getMessage());<br />        }<br />        <br />        <br />        return "";<br />    }<br />}<br /><br /><br />  xwork.xml<br />在此配文件需要注意你的包名,我的包名是helloWorld; <br />&lt;?xml version="1.0" encoding="UTF-8"?><br /><br />&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "X:WorkSpaceBFPPropertyconfigwebxwork-1.0.dtd"><br /><br />&lt;xwork><br /><br />&lt;include file="webwork-default.xml"/><br />     <br />     &lt;package name="helloWorld" extends="webwork-default"><br />         &lt;interceptors><br />             &lt;interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/><br />         &lt;/interceptors>    <br /><br />        &lt;default-interceptor-ref name="defaultStack"/><br /><br />         &lt;action name="dynamicUpdate" class="control.DynamicUpdate"><br />               &lt;result name="success">/jsp/domainS.jsp&lt;/result><br />               &lt;interceptor-ref name="model-driven"/><br />              &lt;interceptor-ref name="params"/>             <br />         &lt;/action><br />     &lt;/package><br /><br />&lt;/xwork><br />OK,如果你是copy 的代码,在配置文件正确的情况下,应该可以运行了. 看看结果吧. 一定要注意配置文件和浏览器版本.在IE5以下的版本是不支持ajax的.<br /><br /><br />Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1799725
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/127252#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 26 Sep 2007 12:23:20 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/127252</link>
        <guid>http://cnhzliye.javaeye.com/blog/127252</guid>
      </item>
      <item>
        <title>eclipse启动参数</title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/125902" style="color:red;">http://cnhzliye.javaeye.com/blog/125902</a>&nbsp;
          发表时间: 2007年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">@echo off<br />
@start eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M<br />
@exit</font></p>
<p>&nbsp;</p>
<p>ps：</p>
<p>安装eclipse+myeclipse开发环境：</p>
<p>1,解压eclipseSDK</p>
<p>2,安装myeclipse</p>
<p>3,将myeclipse 的<font face="Arial">plugins和<font face="Arial">features里的文件coby并覆盖eclipse的<font face="Arial">plugins和<font face="Arial">features</font></font>的文件</font></font></p>
<p>4,卸载myeclipse</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cnhzliye.javaeye.com/blog/125902#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Sep 2007 13:09:25 +0800</pubDate>
        <link>http://cnhzliye.javaeye.com/blog/125902</link>
        <guid>http://cnhzliye.javaeye.com/blog/125902</guid>
      </item>
      <item>
        <title>学习maven的使用，看到一篇很实用的入门教程(菜鸟级入门) </title>
        <author>cnhzliye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cnhzliye.javaeye.com">cnhzliye</a>&nbsp;
          链接：<a href="http://cnhzliye.javaeye.com/blog/125871" style="color:red;">http://cnhzliye.javaeye.com/blog/125871</a>&nbsp;
          发表时间: 2007年09月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="10" border="0" id="content" width="650" cellpadding="0" style="TABLE-LAYOUT: fixed; WIDTH: 650px">
    <tbody>
        <tr>
            <td>
            <div><font face="Arial">一、前言<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 早就知道maven 在java 项目的管理方面名声显赫，于是就想着学习掌握之，于是查阅了大量文档。发现这些文档的作者都是java 的大腕，大多都是站在掌握了一定maven 基础的角度上进行介绍，让我这初学者看的云里雾里不知所云。于是又去查看maven 的官方网站，总算是有所了解，但一旦动手实际操作却又雾里看花。唉，没办法，就只有一遍一遍的动手尝试，经过种<br />
            种磨难总算是有一点眉目了。现在就将我的经验写出来，一来避免将来遗忘，二来也给和我一样的菜鸟们提供一点点的方便。呵呵。本文的主题在于实用操作，个中原理还是麻烦大家去查一下java大腕们的文章吧。这里推荐两篇文章：</font>
            <div align="left"><br />
            <font face="Arial">Maven 2.0:编译、测试、部署、运行<br />
            </font><a href="http://www.ideagrace.com/html/doc/2006/06/14/00847.html"><font face="Arial"></font></a><a href="http://www.ideagrace.com/html/doc/2006/06/14/00847.html" target="_blank">http://www.ideagrace.com/html/doc/2006/06/14/00847.html</a></div>
            <div align="left"><font face="Arial"><br />
            Maven2 的新特性<br />
            <a href="http://www-128.ibm.com/developerworks/cn/opensource/os-maven2/index.html"></a><a href="http://www-128.ibm.com/developerworks/cn/opensource/os-maven2/index.html" target="_blank">http://www-128.ibm.com/developerworks/cn/opensource/os-maven2/index.html</a></font></div>
            <font face="Arial">
            <div align="left"><br />
            二、maven2安装<br />
            1、首先去官方网站下载之：<a href="http://maven.apache.org/download.html"></a><a href="http://maven.apache.org/download.html" target="_blank">http://maven.apache.org/download.html</a>，我选择的是截至目前最新版本maven2.0.4版本<br />
            2、设置环境变量：Maven2下载完后，我将其解压到我的计算机的d:\maven204下，目录结构如下：<br />
            D:\<br />
            |--Maven204<br />
            |-- bin<br />
            |-- conf<br />
            |-- core<br />
            |-- lib<br />
            |-- local</div>
            <div align="left"><br />
            环境变量：（操作系统windows2003）<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的电脑----属性----高级----环境变量，点击&ldquo;系统变量&rdquo;下的新建，输入：变量名 MAVEN_HOME; 变量值d:\Maven204，在系统变量列表中找到系统变量path，打开之，在变量值中追加&rdquo;;%MAVEN_HOME%\bin&rdquo;，至此环境变量设置完毕。<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检查一下是否已经完成安装，打开dos窗口，输入mvn &ndash;v，如果出现以下信息则表示maven2已经安装成功：<br />
            X：〉mvn &ndash;v<br />
            Maven Version 2.0.4</div>
            <div align="left"><br />
            我已经说得够详细了，还不行？那我只能说你比我还菜。<img src="http://city-moon.javaeye.com/javascripts/fckeditor/editor/images/smiley/msn/regular_smile.gif" onclick="window.open(&quot;http://blog.51cto.com/viewpic.php?refimg=&quot; + this.src)" alt="" /></div>
            <div align="left">&nbsp;</div>
            <div align="left">三、用maven2创建第一个java工程<br />
            1、选择一个根目录，我的java工作目录是D:\eclipse\workspace<br />
            2、打开dos窗口采用cd命令进入D:\eclipse\workspace目录下<br />
            3、输入下列指令<br />
            D:\eclipse\workspace&gt;mvn archetype:create -DgroupId=com.efn -DartifactId=study<br />
            指令执行完毕会出现如下的目录结构：<br />
            study<br />
            |-- pom.xml<br />
            `-- src<br />
            |-- main<br />
            | `-- java<br />
            | `-- com<br />
            | `-- mycompany<br />
            | `-- app<br />
            | `-- App.java<br />
            `-- test<br />
            `-- java<br />
            `-- com<br />
            `-- mycompany<br />
            `-- app<br />
            `-- AppTest.java</div>
            <div align="left"><br />
            四、生成eclipse工程文件<br />
            我采用的开发工具是eclipse,所以用maven的eclipse参数生成eclipse工程文件。输入如下<br />
            1、 采用dos的cd命令进入study目录<br />
            2、 输入指令：mvn eclipse:eclipse 如下所示：<br />
            D:\eclipse\workspace\study&gt;mvn eclipse:eclipse<br />
            指令执行完毕后，发现多了两个文件：.classpath和.project</div>
            <div align="left"><br />
            五、下载maven的eclipse插件<br />
            1、打开eclipse<br />
            2、打开菜单 help -Software updates-Find and Install<br />
            3、选择第二项，进入下一步<br />
            4、点击按钮&ldquo;New Remote Site&hellip;&rdquo;<br />
            5、在Name中输入：Maven2，在URL中输入<a href="http://m2eclipse.codehaus.org/" target="_blank">http://m2eclipse.codehaus.org/</a><br />
            Ok,现在一切都是自动化的，你所需要做的就是等待并按提示按按钮。</div>
            <div align="left"><br />
            六、导入工程<br />
            刚才已经生成了eclipse的工程文件，现在导入之。菜单File-import ，按&ldquo;下一步&rdquo;，选择工程文件导入完毕后，工程管理透视图就会出现study节点了，在工程节点上，按鼠标右键，打开弹出菜单，选择maven2菜单项，弹出子菜单-&gt;Enable，点击之打开，在Group Id中输入：study即可。</div>
            <div align="left"><br />
            打开study的pom.xml文件，会有如下类似内容：</div>
            <div align="left"><br />
            </div>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">project</span><span>&nbsp;&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://maven.apache.org/POM/4.0.0&quot;</span><span>&nbsp;&nbsp;</span><span class="attribute">xmlns:xsi</span><span>=</span><span class="attribute-value">http</span><span>://www.w3.org/2001/XMLSchema-instance&nbsp;</span><span class="attribute">xsi:schemaLocation</span><span>=</span><span class="attribute-value">&quot;http://maven.apache.org/POM/4.0.0&nbsp;<a href="http://maven.apache.org/maven-v4_0_0.xsd" target="_blank">http://maven.apache.org/maven-v4_0_0.xsd</a>&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
                <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">modelVersion</span><span class="tag">&gt;</span><span>4.0.0</span><span class="tag">&lt;/</span><span class="tag-name">modelVersion</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>com.efn</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>study</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">packaging</span><span class="tag">&gt;</span><span>jar</span><span class="tag">&lt;/</span><span class="tag-name">packaging</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>1.0-SNAPSHOT</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>Maven&nbsp;Quick&nbsp;Start&nbsp;Archetype</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">url</span><span class="tag">&gt;</span><span><a href="http://maven.apache.org/" target="_blank">http://maven.apache.org</a></span><span class="tag">&lt;/</span><span class="tag-name">url</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">project</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <div align="left"><br />
            注意：有关这个文件的作用和各节点的作用不是本文的描述重点，可以到maven的官方网站查阅<a href="http://maven.apache.org/"></a><a href="http://maven.apache.org/" target="_blank">http://maven.apache.org/</a>目前为止，所有的准备工作都已经就绪，现在我们就以一个主main函数访问数据库为例介绍在实际开发中的使用。</div>
            <div align="left"><br />
            七、搭建架包<br />
            每一个java工程都不免使用第三方的架包，Maven的好处就是可以统一管理这些架包，并使多个java工程共享这些架包。我们所需要做的就是按规则编辑pom.xml文件。Maven已经非常智能，使用maven的eclipse插件的向导，只要输入参数就可以将配置文件生成出来。我们的例子是用jdbc方式访问oracle的数据库。所以需要jdbc和oracle的架包的支持。下面我们就来搭建这两个架包到study工程里来。</div>
            <div align="left"><br />
            有两种方式可以采用：<br />
            1、自动向导<br />
            第一种是采用向导方式并让向导直接去maven的服务器上下载你需要的架包，这种方式存在一定的风险，一来可能maven的服务器上并没有你需要的东东，二来每次智能的maven总是去寻找那并不存在的东东。抛出一大堆红字提示不说，达不到预期目标才是让人郁闷。不过为了保证文档的完整性，还是给出操作步骤。以junit为例（这个东东倒是没有问题，呵呵）当工程的maven被Enable后，弹出菜单的maven2子菜，选择子菜单的&ldquo;Add Dependency&rdquo;菜单项，在Query中输入&ldquo;junit&rdquo;，向导会自动列出相关列表供选择。选择你最需要的架包，按&ldquo;OK&rdquo; 按钮。<br />
            如果你的本地仓库已经存在该架包，则向导只在pom.xml加入依赖项信息，pom.xml文件的内容如下</div>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">project</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://maven.apache.org/POM/4.0.0&quot;</span><span>&nbsp;</span><span class="attribute">xmlns:xsi</span><span>=&quot;http://</span></span><span><a href="http://www.w3.org/2001/XMLSchema-instance" target="_blank">www.w3.org/2001/XMLSchema-instance</a>&quot;&nbsp;&nbsp;</span><span class="attribute">xsi:schemaLocation</span><span>=&quot;http://maven.apache.org/POM/4.0.0&nbsp;<a href="http://maven.apache.org/maven-v4_0_0.xsd"></a><a href="http://maven./" target="_blank">http://maven.</a>&quot;</span><span>apache.org/maven-v4_0_0.xsd</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">modelVersion</span><span class="tag">&gt;</span><span>4.0.0</span><span class="tag">&lt;/</span><span class="tag-name">modelVersion</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>com.efn</span><span class="tag">&lt;/</span><span class="tag-name">groupId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>study</span><span class="tag">&lt;/</span><span class="tag-name">artifactId</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">packaging</span><span class="tag">&gt;</span><span>jar</span><span class="tag">&lt;/</span><span class="tag-name">packaging</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>1.0-SNAPSHOT</span><span class="tag">&lt;/</span><span class="tag-name">version</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>Maven&nbsp;Quick&nbsp;Start&nbsp;Archetype</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">url</span><span class="tag">&gt;</span><span><a href="http://maven.apache.org/" target="