﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-进行中</title><link>http://www.blogjava.net/kongjia/</link><description>。。。</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 04:32:58 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 04:32:58 GMT</pubDate><ttl>60</ttl><item><title>JAVA的容器---List,Map,Set</title><link>http://www.blogjava.net/kongjia/archive/2008/05/27/203103.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Tue, 27 May 2008 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2008/05/27/203103.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/203103.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2008/05/27/203103.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/203103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/203103.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">JAVA</span><span style="font-size: 10pt; font-family: 宋体;">的容器<span lang="EN-US">---List,Map,Set <br />
Collection<br />
├List<br />
│├LinkedList<br />
│├ArrayList<br />
│└Vector<br />
│</span>　<span lang="EN-US">└Stack<br />
└Set<br />
Map<br />
├Hashtable<br />
├HashMap<br />
└WeakHashMap<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">Collection</span><span style="font-size: 10pt; font-family: 宋体;">接口<span lang="EN-US"><br />
</span>　　<span lang="EN-US">Collection</span>是最基本的集合接口，一个<span lang="EN-US">Collection</span>代表一组<span lang="EN-US">Object</span>，即<span lang="EN-US">Collection</span>的元素（<span lang="EN-US">Elements</span>）。一些<span lang="EN-US"> Collection</span>允许相同的元素而另一些不行。一些能排序而另一些不行。<span lang="EN-US">Java SDK</span>不提供直接继承自<span lang="EN-US">Collection</span>的类，<span lang="EN-US">Java SDK</span>提供的类都是继承自<span lang="EN-US">Collection</span>的<span lang="EN-US">&#8220;</span>子接口<span lang="EN-US">&#8221;</span>如<span lang="EN-US">List</span>和<span lang="EN-US">Set</span>。<span lang="EN-US"><br />
</span>　　所有实现<span lang="EN-US">Collection</span>接口的类都必须提供两个标准的构造函数：无参数的构造函数用于创建一个空的<span lang="EN-US">Collection</span>，有一个<span lang="EN-US"> Collection</span>参数的构造函数用于创建一个新的<span lang="EN-US">Collection</span>，这个新的<span lang="EN-US">Collection</span>与传入的<span lang="EN-US">Collection</span>有相同的元素。后一个构造函数允许用户复制一个<span lang="EN-US">Collection</span>。<span lang="EN-US"><br />
</span>　　如何遍历<span lang="EN-US">Collection</span>中的每一个元素？不论<span lang="EN-US">Collection</span>的实际类型如何，它都支持一个<span lang="EN-US">iterator()</span>的方法，该方法返回一个迭代子，使用该迭代子即可逐一访问<span lang="EN-US">Collection</span>中每一个元素。典型的用法如下：<span lang="EN-US"><br />
</span>　　　　<span lang="EN-US">Iterator it = collection.iterator(); // </span>获得一个迭代子<span lang="EN-US"><br />
</span>　　　　<span lang="EN-US">while(it.hasNext()) {<br />
</span>　　　　　　<span lang="EN-US">Object obj = it.next(); // </span>得到下一个元素<span lang="EN-US"><br />
</span>　　　　<span lang="EN-US">}<br />
</span>　　由<span lang="EN-US">Collection</span>接口派生的两个接口是<span lang="EN-US">List</span>和<span lang="EN-US">Set</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">List</span><span style="font-size: 10pt; font-family: 宋体;">接口<span lang="EN-US"><br />
</span>　　<span lang="EN-US">List</span>是有序的<span lang="EN-US">Collection</span>，使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引（元素在<span lang="EN-US">List</span>中的位置，类似于数组下标）来访问<span lang="EN-US">List</span>中的元素，这类似于<span lang="EN-US">Java</span>的数组。<span lang="EN-US"><br />
</span>和下面要提到的<span lang="EN-US">Set</span>不同，<span lang="EN-US">List</span>允许有相同的元素。<span lang="EN-US"><br />
</span>　　除了具有<span lang="EN-US">Collection</span>接口必备的<span lang="EN-US">iterator()</span>方法外，<span lang="EN-US">List</span>还提供一个<span lang="EN-US">listIterator()</span>方法，返回一个<span lang="EN-US"> ListIterator</span>接口，和标准的<span lang="EN-US">Iterator</span>接口相比，<span lang="EN-US">ListIterator</span>多了一些<span lang="EN-US">add()</span>之类的方法，允许添加，删除，设定元素，还能向前或向后遍历。<span lang="EN-US"><br />
</span>　　实现<span lang="EN-US">List</span>接口的常用类有<span lang="EN-US">LinkedList</span>，<span lang="EN-US">ArrayList</span>，<span lang="EN-US">Vector</span>和<span lang="EN-US">Stack</span>。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">LinkedList</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">LinkedList</span>实现了<span lang="EN-US">List</span>接口，允许<span lang="EN-US">null</span>元素。此外<span lang="EN-US">LinkedList</span>提供额外的<span lang="EN-US">get</span>，<span lang="EN-US">remove</span>，<span lang="EN-US">insert</span>方法在<span lang="EN-US"> LinkedList</span>的首部或尾部。这些操作使<span lang="EN-US">LinkedList</span>可被用作堆栈（<span lang="EN-US">stack</span>），队列（<span lang="EN-US">queue</span>）或双向队列（<span lang="EN-US">deque</span>）。<span lang="EN-US"><br />
</span>　　注意<span lang="EN-US">LinkedList</span>没有同步方法。如果多个线程同时访问一个<span lang="EN-US">List</span>，则必须自己实现访问同步。一种解决方法是在创建<span lang="EN-US">List</span>时构造一个同步的<span lang="EN-US">List</span>：<span lang="EN-US"><br />
</span>　　　　<span lang="EN-US">List list = Collections.synchronizedList(new LinkedList(...));<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">ArrayList</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">ArrayList</span>实现了可变大小的数组。它允许所有元素，包括<span lang="EN-US">null</span>。<span lang="EN-US">ArrayList</span>没有同步。<span lang="EN-US"><br />
size</span>，<span lang="EN-US">isEmpty</span>，<span lang="EN-US">get</span>，<span lang="EN-US">set</span>方法运行时间为常数。但是<span lang="EN-US">add</span>方法开销为分摊的常数，添加<span lang="EN-US">n</span>个元素需要<span lang="EN-US">O(n)</span>的时间。其他的方法运行时间为线性。<span lang="EN-US"><br />
</span>　　每个<span lang="EN-US">ArrayList</span>实例都有一个容量（<span lang="EN-US">Capacity</span>），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并没有定义。当需要插入大量元素时，在插入前可以调用<span lang="EN-US">ensureCapacity</span>方法来增加<span lang="EN-US">ArrayList</span>的容量以提高插入效率。<span lang="EN-US"><br />
</span>　　和<span lang="EN-US">LinkedList</span>一样，<span lang="EN-US">ArrayList</span>也是非同步的（<span lang="EN-US">unsynchronized</span>）。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">Vector</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">Vector</span>非常类似<span lang="EN-US">ArrayList</span>，但是<span lang="EN-US">Vector</span>是同步的。由<span lang="EN-US">Vector</span>创建的<span lang="EN-US">Iterator</span>，虽然和<span lang="EN-US">ArrayList</span>创建的<span lang="EN-US"> Iterator</span>是同一接口，但是，因为<span lang="EN-US">Vector</span>是同步的，当一个<span lang="EN-US">Iterator</span>被创建而且正在被使用，另一个线程改变了<span lang="EN-US">Vector</span>的状态（例如，添加或删除了一些元素），这时调用<span lang="EN-US">Iterator</span>的方法时将抛出<span lang="EN-US">ConcurrentModificationException</span>，因此必须捕获该异常。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">Stack </span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">Stack</span>继承自<span lang="EN-US">Vector</span>，实现一个后进先出的堆栈。<span lang="EN-US">Stack</span>提供<span lang="EN-US">5</span>个额外的方法使得<span lang="EN-US">Vector</span>得以被当作堆栈使用。基本的<span lang="EN-US">push</span>和<span lang="EN-US">pop </span>方法，还有<span lang="EN-US">peek</span>方法得到栈顶的元素，<span lang="EN-US">empty</span>方法测试堆栈是否为空，<span lang="EN-US">search</span>方法检测一个元素在堆栈中的位置。<span lang="EN-US">Stack</span>刚创建后是空栈。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">Set</span><span style="font-size: 10pt; font-family: 宋体;">接口<span lang="EN-US"><br />
</span>　　<span lang="EN-US">Set</span>是一种不包含重复的元素的<span lang="EN-US">Collection</span>，即任意的两个元素<span lang="EN-US">e1</span>和<span lang="EN-US">e2</span>都有<span lang="EN-US">e1.equals(e2)=false</span>，<span lang="EN-US">Set</span>最多有一个<span lang="EN-US">null</span>元素。<span lang="EN-US"><br />
</span>　　很明显，<span lang="EN-US">Set</span>的构造函数有一个约束条件，传入的<span lang="EN-US">Collection</span>参数不能包含重复的元素。<span lang="EN-US"><br />
</span>　　请注意：必须小心操作可变对象（<span lang="EN-US">Mutable Object</span>）。如果一个<span lang="EN-US">Set</span>中的可变元素改变了自身状态导致<span lang="EN-US">Object.equals(Object)=true</span>将导致一些问题。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">Map</span><span style="font-size: 10pt; font-family: 宋体;">接口<span lang="EN-US"><br />
</span>　　请注意，<span lang="EN-US">Map</span>没有继承<span lang="EN-US">Collection</span>接口，<span lang="EN-US">Map</span>提供<span lang="EN-US">key</span>到<span lang="EN-US">value</span>的映射。一个<span lang="EN-US">Map</span>中不能包含相同的<span lang="EN-US">key</span>，每个<span lang="EN-US">key</span>只能映射一个<span lang="EN-US"> value</span>。<span lang="EN-US">Map</span>接口提供<span lang="EN-US">3</span>种集合的视图，<span lang="EN-US">Map</span>的内容可以被当作一组<span lang="EN-US">key</span>集合，一组<span lang="EN-US">value</span>集合，或者一组<span lang="EN-US">key-value</span>映射。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">Hashtable</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">Hashtable</span>继承<span lang="EN-US">Map</span>接口，实现一个<span lang="EN-US">key-value</span>映射的哈希表。任何非空（<span lang="EN-US">non-null</span>）的对象都可作为<span lang="EN-US">key</span>或者<span lang="EN-US">value</span>。<span lang="EN-US"><br />
</span>　　添加数据使用<span lang="EN-US">put(key, value)</span>，取出数据使用<span lang="EN-US">get(key)</span>，这两个基本操作的时间开销为常数。<span lang="EN-US"><br />
Hashtable</span>通过<span lang="EN-US">initial capacity</span>和<span lang="EN-US">load factor</span>两个参数调整性能。通常缺省的<span lang="EN-US">load factor 0.75</span>较好地实现了时间和空间的均衡。增大<span lang="EN-US">load factor</span>可以节省空间但相应的查找时间将增大，这会影响像<span lang="EN-US">get</span>和<span lang="EN-US">put</span>这样的操作。<span lang="EN-US"><br />
</span>使用<span lang="EN-US">Hashtable</span>的简单示例如下，将<span lang="EN-US">1</span>，<span lang="EN-US">2</span>，<span lang="EN-US">3</span>放到<span lang="EN-US">Hashtable</span>中，他们的<span lang="EN-US">key</span>分别是<span lang="EN-US">&#8221;one&#8221;</span>，<span lang="EN-US">&#8221;two&#8221;</span>，<span lang="EN-US">&#8221;three&#8221;</span>：<span lang="EN-US"><br />
</span>　　　　<span lang="EN-US">Hashtable numbers = new Hashtable();<br />
</span>　　　　<span lang="EN-US">numbers.put(&#8220;one&#8221;, new Integer(1));<br />
</span>　　　　<span lang="EN-US">numbers.put(&#8220;two&#8221;, new Integer(2));<br />
</span>　　　　<span lang="EN-US">numbers.put(&#8220;three&#8221;, new Integer(3));<br />
</span>　　要取出一个数，比如<span lang="EN-US">2</span>，用相应的<span lang="EN-US">key</span>：<span lang="EN-US"><br />
</span>　　　　<span lang="EN-US">Integer n = (Integer)numbers.get(&#8220;two&#8221;);<br />
</span>　　　　<span lang="EN-US">System.out.println(&#8220;two = &#8221; + n);<br />
</span>　　由于作为<span lang="EN-US">key</span>的对象将通过计算其散列函数来确定与之对应的<span lang="EN-US">value</span>的位置，因此任何作为<span lang="EN-US">key</span>的对象都必须实现<span lang="EN-US">hashCode</span>和<span lang="EN-US">equals</span>方法。<span lang="EN-US">hashCode</span>和<span lang="EN-US">equals</span>方法继承自根类<span lang="EN-US">Object</span>，如果你用自定义的类当作<span lang="EN-US">key</span>的话，要相当小心，按照散列函数的定义，如果两个对象相同，即<span lang="EN-US">obj1.equals(obj2)=true</span>，则它们的<span lang="EN-US">hashCode</span>必须相同，但如果两个对象不同，则它们的<span lang="EN-US">hashCode</span>不一定不同，如果两个不同对象的<span lang="EN-US">hashCode</span>相同，这种现象称为冲突，冲突会导致操作哈希表的时间开销增大，所以尽量定义好的<span lang="EN-US">hashCode()</span>方法，能加快哈希表的操作。<span lang="EN-US"><br />
</span>　　如果相同的对象有不同的<span lang="EN-US">hashCode</span>，对哈希表的操作会出现意想不到的结果（期待的<span lang="EN-US">get</span>方法返回<span lang="EN-US">null</span>），要避免这种问题，只需要牢记一条：要同时复写<span lang="EN-US">equals</span>方法和<span lang="EN-US">hashCode</span>方法，而不要只写其中一个。<span lang="EN-US"><br />
</span>　　<span lang="EN-US">Hashtable</span>是同步的。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">HashMap</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">HashMap</span>和<span lang="EN-US">Hashtable</span>类似，不同之处在于<span lang="EN-US">HashMap</span>是非同步的，并且允许<span lang="EN-US">null</span>，即<span lang="EN-US">null value</span>和<span lang="EN-US">null key</span>。，但是将<span lang="EN-US">HashMap</span>视为<span lang="EN-US">Collection</span>时（<span lang="EN-US">values()</span>方法可返回<span lang="EN-US">Collection</span>），其迭代子操作时间开销和<span lang="EN-US">HashMap </span>的容量成比例。因此，如果迭代操作的性能相当重要的话，不要将<span lang="EN-US">HashMap</span>的初始化容量设得过高，或者<span lang="EN-US">load factor</span>过低。<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">WeakHashMap</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US"><br />
</span>　　<span lang="EN-US">WeakHashMap</span>是一种改进的<span lang="EN-US">HashMap</span>，它对<span lang="EN-US">key</span>实行<span lang="EN-US">&#8220;</span>弱引用<span lang="EN-US">&#8221;</span>，如果一个<span lang="EN-US">key</span>不再被外部所引用，那么该<span lang="EN-US">key</span>可以被<span lang="EN-US">GC</span>回收。<span lang="EN-US"><o:p></o:p></span></span></p>
<span style="font-size: 10pt; font-family: 宋体;">总结<span lang="EN-US"><br />
</span>　　如果涉及到堆栈，队列等操作，应该考虑用<span lang="EN-US">List</span>，对于需要快速插入，删除元素，应该使用<span lang="EN-US">LinkedList</span>，如果需要快速随机访问元素，应该使用<span lang="EN-US">ArrayList</span>。<span lang="EN-US"><br />
</span>　　如果程序在单线程环境中，或者访问仅仅在一个线程中进行，考虑非同步的类，其效率较高，如果多个线程可能同时操作一个类，应该使用同步的类。<span lang="EN-US"><br />
</span>　　要特别注意对哈希表的操作，作为<span lang="EN-US">key</span>的对象要正确复写<span lang="EN-US">equals</span>和<span lang="EN-US">hashCode</span>方法。<span lang="EN-US"><br />
</span>　　尽量返回接口而非实际的类型，如返回<span lang="EN-US">List</span>而非<span lang="EN-US">ArrayList</span>，这样如果以后需要将<span lang="EN-US">ArrayList</span>换成<span lang="EN-US">LinkedList</span>时，客户端代码不用改变。这就是针对抽象编程。</span>
<img src ="http://www.blogjava.net/kongjia/aggbug/203103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2008-05-27 09:23 <a href="http://www.blogjava.net/kongjia/archive/2008/05/27/203103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网址</title><link>http://www.blogjava.net/kongjia/archive/2008/05/15/200555.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Thu, 15 May 2008 00:41:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2008/05/15/200555.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/200555.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2008/05/15/200555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/200555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/200555.html</trackback:ping><description><![CDATA[<a href="http://taoliyi.maifou.net/">http://taoliyi.maifou.net/</a><br />
<a href="http://www.kulego.com/shopex/">http://www.kulego.com/shopex/</a><br />
<br />
<img src ="http://www.blogjava.net/kongjia/aggbug/200555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2008-05-15 08:41 <a href="http://www.blogjava.net/kongjia/archive/2008/05/15/200555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nokia</title><link>http://www.blogjava.net/kongjia/archive/2006/09/28/nokia.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Thu, 28 Sep 2006 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/09/28/nokia.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/72516.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/09/28/nokia.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/72516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/72516.html</trackback:ping><description><![CDATA[http://club.joyes.com/assort-2.html<img src ="http://www.blogjava.net/kongjia/aggbug/72516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-09-28 11:45 <a href="http://www.blogjava.net/kongjia/archive/2006/09/28/nokia.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant</title><link>http://www.blogjava.net/kongjia/archive/2006/09/08/68539.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Fri, 08 Sep 2006 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/09/08/68539.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/68539.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/09/08/68539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/68539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/68539.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 读书笔记——《Ant – The Definitive Guide，2nd Edition》																		            选择自 hopson 的 Blog    																																																														关键字																				...&nbsp;&nbsp;<a href='http://www.blogjava.net/kongjia/archive/2006/09/08/68539.html'>阅读全文</a><img src ="http://www.blogjava.net/kongjia/aggbug/68539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-09-08 16:07 <a href="http://www.blogjava.net/kongjia/archive/2006/09/08/68539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant task</title><link>http://www.blogjava.net/kongjia/archive/2006/09/08/68440.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Fri, 08 Sep 2006 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/09/08/68440.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/68440.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/09/08/68440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/68440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/68440.html</trackback:ping><description><![CDATA[
		<h1 class="block_title">
				<a id="viewpost1_TitleUrl" href="../../calvin/archive/2006/09/07/68150.html">给编程狂热者的ant task笔记</a>
		</h1>
		<div class="postcontent">
				<p>   作者：<a title="Visit page outside Confluence" href="../../calvin/" rel="nofollow" linktext="江南白衣|http://www.blogjava.net/calvin/" linktype="raw" _fcksavedurl="http://www.blogjava.net/calvin/"><font color="#002c99">江南白衣<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></font></a></p>
				<p>   这篇文档是专门写给那些编程狂热者，在Ant里编程时要留意的重要Task。<br /><br />    不知为何，老外的各种脚本都写得格外漂亮。从Appfuse里学到很多，在编写<a href="http://wiki.javascud.org/display/springs/Home" _fcksavedurl="http://wiki.javascud.org/display/springs/Home">SpringSide2.0</a><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" />的构件安装脚本时又被迫自学了不少，这里作下总结。</p>
				<p>    如果只说一样最重要的事情，就是<span class="nobr"><a title="Visit page outside Confluence" href="http://ant-contrib.sourceforge.net/tasks/index.html" rel="nofollow" _fcksavedurl="http://ant-contrib.sourceforge.net/tasks/index.html">ant-contrib<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>的&lt;if&gt; 和 &lt;for&gt;节点，使Ant 拥有了完整的编程能力。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="15" _fckanchor="true" height="1" width="1" />
						<font size="5">
								<strong>1. 变量</strong>
						</font>
				</p>
				<p>   Ant里的变量有个诡异的特性----一旦被赋值就不会改变，这个特性有时候帮助很大，有时候让人很苦恼，一定要注意。另一样要注意的是，Ant里的变量和其他语言的变量一样，有可效范围。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="14" _fckanchor="true" height="1" width="1" />  <font size="4"><strong> 1.由命令行赋值</strong></font></p>
				<p>      ant build.xml -Dtomcat.home=foo</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="13" _fckanchor="true" height="1" width="1" />   <font size="4"><strong>2.与用户交互输入--<span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/input.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/input.html">Input task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong></font></p>
				<p>      &lt;input message="请选择一个Target "<br />               validargs="compile,jar,test"<br />               addproperty="my.input"/&gt;</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="12" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong> 3.从propertis文件读取并存盘 -- </strong>
						</font>
						<span class="nobr">
								<a title="Visit page outside Confluence" href="http://ant.apache.org/manual/OptionalTasks/propertyfile.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/OptionalTasks/propertyfile.html">
										<font size="4">
												<strong>propertyfile task</strong>
										</font>
										<sup>
												<img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" />
										</sup>
								</a>
						</span>    </p>
				<p>      &lt;propertyfile file="my.properties"&gt;<br />              &lt;entry key="springside.home" default="."/&gt;<br />      &lt;/propertyfile&gt;</p>
				<p>      如果my.properties 不存在，生成my.properties文件，springside.home=.。有一个特别有用的地方：有些properties文件的属性每个开发者都不同，不想放入svn，但又想初始化数值，可以用该命令。</p>
				<p>     &lt;propertyfile file="my.properties"&gt;<br />              &lt;entry key="springside.home" value="....."/&gt;<br />      &lt;/propertyfile&gt;</p>
				<p>      重新写入配置文件。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="11" _fckanchor="true" height="1" width="1" />
						<font size="5">
								<strong>2. 流程控制</strong>
						</font>
				</p>
				<p>     如果没有ant-contrib 贡献的&lt;if&gt; 和&lt;for&gt;节点，Ant的可编程性是极低极低的。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="10" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong> 2.1 <span class="nobr"><a title="Visit page outside Confluence" href="http://ant-contrib.sourceforge.net/tasks/tasks/if.html" rel="nofollow" _fcksavedurl="http://ant-contrib.sourceforge.net/tasks/tasks/if.html">if task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p> ant原来可以在target级进行if判断(unless,if 属性)，但实在太不方便了。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="9" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>2.2 <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/conditions.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/conditions.html">Conditions<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p>但Ant预先封装的一堆condition很是很方便的。这些condition完全从实际出发，包括文件是否存在，<span class="nobr"><a title="Visit page outside Confluence" href="http://localhost:8080/" rel="nofollow" _fcksavedurl="http://localhost:8080/">http://localhost:8080<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>是否连通都可以作为条件，见<span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/conditions.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/conditions.html">Ant的参考手册<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="8" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>2.3 <span class="nobr"><a title="Visit page outside Confluence" href="http://ant-contrib.sourceforge.net/tasks/tasks/for.html" rel="nofollow" _fcksavedurl="http://ant-contrib.sourceforge.net/tasks/tasks/for.html">For task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p>支持"a,b,c,d" 字符串数组的循环与文件目录，Fileset的循环。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="7" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>2.4 <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/parallel.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/parallel.html">Parallel task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p>Parallel非常有用，比如我想一边开tomcat，一边做别的，就需要使用它，否则就只有用spawn=true属性把tomcat放在后台运行。spawn有很多不好的地方，比如不能即时在console看到信息，停止ant运行不能把tomcat关掉等。</p>
				<p>Parallel相当于一个容器，放在里面的每个task都会被并行执行。如果想把某几个task顺序执行，用相当于()的<span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/sequential.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/sequential.html">Sequential task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span> 包起来。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="6" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>2.5 <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/waitfor.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/waitfor.html">Waitfor task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p>暂停ant执行直到条件符合，比如&lt;waitfor&gt;&lt;http url=<span class="nobr"><a title="Visit page outside Confluence" href="http://localhost:8080/" rel="nofollow" _fcksavedurl="http://localhost:8080/">http://localhost:8080/<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>&gt;&lt;/waitfor&gt;就会等待tomcat启动后才会继续往下执行。<span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/macrodef.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/macrodef.html">Macrodef task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="5" _fckanchor="true" height="1" width="1" />
						<font size="5">
								<strong>3. 代码封装</strong>
						</font>
				</p>
				<p> ant 代码最基本的封装是</p>
				<p> 1. ant  task：调用其他脚本的任务，可设定dir 与是否继承本脚本的变量。</p>
				<p> 2. antcall task：调用本脚本内其他task，可设置参数。</p>
				<p> 3. import task ：就像其他语言的include一样，引入其他脚本内容到本脚本里。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="4" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>1. <span class="nobr"><a title="Visit page outside Confluence" href="http://ant-contrib.sourceforge.net/tasks/tasks/antfetch_task.html" rel="nofollow" _fcksavedurl="http://ant-contrib.sourceforge.net/tasks/tasks/antfetch_task.html">AntFetch<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>,  <span class="nobr"><a title="Visit page outside Confluence" href="http://ant-contrib.sourceforge.net/tasks/tasks/antcallback_task.html" rel="nofollow" _fcksavedurl="http://ant-contrib.sourceforge.net/tasks/tasks/antcallback_task.html">AntCallBack task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p>   ant-contrib贡献，对应于Ant 与 AntCall。原版只能向被调用函数传递变量，函数执行后没办法return 值。antcallback的语法如下<br />   &lt;antcallback target="mytarget" return="myresult1,myresult2"/&gt;</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="3" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>2. <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/macrodef.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/macrodef.html">Macrodef task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></strong>
						</font>
				</p>
				<p>   作为最小的封装单位，与以&lt;target&gt;封装再&lt;antcall target="xxx"&gt;调用差不太远，细微之处自行体验了。个人比较喜欢用macrodef。</p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="2" _fckanchor="true" height="1" width="1" />
						<font size="4">
								<strong>3. <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/java.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/java.html">Java task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span> 与 <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/exec.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/exec.html">Exec task<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span> 直接执行Java类或程序</strong>
						</font>
				</p>
				<p>   注意执行目录的定义。另在Windows下如果要直接运行dos窗口中的命令，以下指令启动默认浏览器访问localhost：</p>
				<p>   &lt;exec executable="cmd.exe"&gt;<br />      &lt;arg line="/c start <span class="nobr"><a title="Visit page outside Confluence" href="http://localhost:8080/" rel="nofollow" _fcksavedurl="http://localhost:8080/">http://localhost:8080<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>"/&gt;<br />   &lt;/exec&gt;   </p>
				<p>
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="1" _fckanchor="true" height="1" width="1" />
						<font size="5">
								<strong>4. 扩展Ant的Task</strong>
						</font>
				</p>
				<p>   扩展ant task很简单，实现execute() 方法执行task，实现setter接口让ant框架执行属性注入。继承Task 获得一些ant的能力，比如查询某个变量的值。</p>
				<p>   稍微有点麻烦的是多层嵌套属性的注入。详细请看<span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/developlist.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/developlist.html">http://ant.apache.org/manual/developlist.html<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span></p>
				<p>   SpringSide 2.0 里很简单的实现了一个XML File Merge的task，见XmlMergeTask.java。<br /><br />   <a href="http://blog.sina.com.cn/u/1223801382" target="_blank" rel="nofollow">蛋蛋</a> 说扩展Ant的最方便的方法还是在ANT里嵌套脚本。导入BSF库以后，你就可以用BSF支持的脚本语言了(见<a href="http://ant.apache.org/manual/OptionalTasks/script.html" _fcksavedurl="http://ant.apache.org/manual/OptionalTasks/script.html">Script Task</a>)。接下来有机会尝试一下。<br /></p>
				<p>
						<br />
						<img class="FCK__Anchor" src="http://writeblog.csdn.net/fckeditor/editor/images/spacer.gif" _fckfakelement="true" _fckrealelement="0" _fckanchor="true" height="1" width="1" /> <font size="5"><strong>5. 文件操作</strong></font></p>
				<p>  刚好springside里进行了比较多的文件操作，随便记一下。</p>
				<p>  <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/replace.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/replace.html">replace <sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>与 copy 时加入<span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/filter.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/filter.html">filter<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>, 都可以进行字符串替换.</p>
				<p>  <span class="nobr"><a title="Visit page outside Confluence" href="http://ant.apache.org/manual/CoreTasks/concat.html" rel="nofollow" _fcksavedurl="http://ant.apache.org/manual/CoreTasks/concat.html">concat<sup><img class="rendericon" alt="" src="http://wiki.javascud.org/images/icons/linkext7.gif" _fcksavedurl="http://wiki.javascud.org/images/icons/linkext7.gif" align="absmiddle" border="0" height="7" width="7" /></sup></a></span>在文件末添加其他文件的内容。</p>
				<p>  好困，很多东西没写详细，明天再补充。<br /><br />  
题外话，Ant
完整演示了如何编写XML式的代码，虽然对于开发人员来说XML编码非常麻烦，远远没有Ruby的rake以ruby代码本身来构建系统清晰，但对于
IDE，特别是希望图形化编程的IDE来说，XML比普通代码要容易渲染得多，所以普元EOS的图形化编程也是序列成XML代码。再另外，Ant的
task 和 普元的构件也有相似。</p> 
		</div>
<img src ="http://www.blogjava.net/kongjia/aggbug/68440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-09-08 09:56 <a href="http://www.blogjava.net/kongjia/archive/2006/09/08/68440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>omcat5.5.9+sql2000数据库连接池配置的一些心得体会</title><link>http://www.blogjava.net/kongjia/archive/2006/08/23/65320.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Wed, 23 Aug 2006 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/08/23/65320.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/65320.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/08/23/65320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/65320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/65320.html</trackback:ping><description><![CDATA[
		<center>
				<span style="font-size: 20px;">
						<b>tomcat5.5.9+sql2000数据库连接池配置的一些心得体会</b>
				</span>
		</center>
		<br />
		<center>作者：chiefboy</center>
		<br />
		<br />
		<br />
		<br />
		<span style="color: Red;">版权声明：本文可以自由转载，转载时请务必以超链接形式标明文章原始出处和作者信息及本声明</span>
		<br />
作者:叶枫<br />
原
文:[http://www.matrix.org.cn/resource/article/44/44021_tomcat_sql2000.html]http://www.matrix.org.cn/resource/article/44/44021_tomcat_sql2000.html[/url]<br />
关键字:tomcat sql2000<br /><br />
    
终于解决了困扰多天的连接池的问题，写下这编文章与大家一起分享。我是在tomcat5.5.9下配置的，tomcat5.5.X和以前的版本有一些差
别，所以配置上也有差别。我就说一下在tomcat5.5.9配置的基本步骤：（确定你以安装好tomcat5.5.9、sql2000）<br /><br />
1、把数据库JDBC驱动拷贝到%TOMCAT_HOME%/common/lib和%TOMCAT_HOME%/webapps/yourweb/WEB-INF/lib下（我的web文件夹名字叫quickstart）<br />
这一步大家都知道，不然tomcat无法与数据库连接。<br /><br />
2、修改%TOMCAT_HOME%/conf/server.xml文件,在  &lt;GlobalNamingResources&gt;&lt;/GlobalNamingResources&gt;之间<br />
添加以下内容：<br />
    
<pre class="overflow">&lt;Resource<br />      name="jdbc/quickstart"<br />      type="javax.sql.DataSource"<br />      password="123456"<br />      driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"<br />      maxIdle="2"<br />      maxWait="5000"<br />      username="sa"<br />      url="jdbc:microsoft:sqlserver://localhost;DatabaseName=quickstart"<br />      maxActive="4"/&gt;</pre><br /><br />
以上内容根据大家的具体情况进行相应修改，比如：把name="jdbc/quickstart"中的quickstart改成和你web文件夹名称一样，把password="123456"中的“123456”改成你数据库的密码。<br /><br />
3、在%TOMCAT_HOME%/conf/Catalina/localhost下新建一个与你web文件夹同名的xml文件（我的是quickstart.xml）<br />
这一步非常重要,如果没有这步就会出错,会出现
<pre class="overflow">org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC driver of class '' for connect URL 'null' </pre><br /><br />
这样的错误，在文件中加入第2步的内容，如下：<br /><br /><pre class="overflow">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;Context&gt;<br />     &lt;Resource<br />      name="jdbc/quickstart"<br />      type="javax.sql.DataSource"<br />      password="123456"<br />      driverClassName="com.microsoft.jdbc.sqlserver.SQLServerDriver"<br />      maxIdle="2"<br />      maxWait="5000"<br />      username="sa"<br />      url="jdbc:microsoft:sqlserver://localhost;DatabaseName=quickstart"<br />      maxActive="4"/&gt; <br />&lt;/Context&gt;</pre><br /><br />
根据个人具体情况进行相应修改。<br /><br />
4、修改%TOMCAT_HOME%/webapps/yourweb/WEB-INF下的web.xml文件,在&lt;web-app&gt;&lt;/web-app&gt;之间添加以下内容<br /><br /><pre class="overflow"> &lt;resource-ref&gt;<br /><br />    &lt;description&gt;sqlserverDB Connection&lt;/description&gt;<br /><br />    &lt;res-ref-name&gt;jdbc/quickstart&lt;/res-ref-name&gt;<br /><br />    &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br /><br />    &lt;res-auth&gt;Container&lt;/res-auth&gt;<br /><br />  &lt;/resource-ref&gt;</pre><br /><br />
把&lt;res-ref-name&gt;jdbc/quickstart&lt;/res-ref-name&gt;中的quickstart改成你的web文件夹名称。<br /><br />
5、测试，在quickstart下新建一个index.jsp文件<br /><br /><pre class="overflow">&lt;%@ page contentType="text/html; charset=gb2312" %&gt;<br />&lt;%@ page import="javax.naming.*" %&gt;<br />&lt;%@ page import="javax.sql.*" %&gt;<br />&lt;%@ page import="java.sql.*" %&gt;<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;JDBC Test&lt;/title&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;%<br />        Connection conn=null;<br />        Statement stmt=null;<br />        ResultSet rs=null;<br />        ResultSetMetaData md=null;<br /><br />        try<br />        {<br />                Context initCtx=new InitialContext();<br />                <br />                DataSource ds=(DataSource)initCtx.lookup("java:comp/env/jdbc/quickstart");<br />                if(ds!=null)<br />                {<br />                        out.println("已经获得DataSource");<br />                        out.println(ds.toString());<br />                        conn=ds.getConnection();<br />                        stmt=conn.createStatement();<br />                        out.println("aa");<br />                        rs=stmt.executeQuery("select * from cat");<br />                        md=rs.getMetaData();<br />                        out.println("&lt;table border=1&gt;");<br />                        out.println("&lt;tr&gt;");<br />                        for(int i=0;i&lt;md.getColumnCount();i++)<br />                        {<br />                                out.println("&lt;td&gt;"+md.getColumnName(i+1)+"&lt;/td&gt;");<br /><br />                        }<br />                        while(rs.next())<br />                        {<br />                                out.println("&lt;tr&gt;");<br />                                out.println("&lt;td&gt;"+rs.getString(1)+"&lt;/td&gt;");<br />                                out.println("&lt;td&gt;"+rs.getString(2)+"&lt;/td&gt;");<br />                                out.println("&lt;td&gt;"+rs.getString(3)+"&lt;/td&gt;");<br />                                out.println("&lt;td&gt;"+rs.getString(4)+"&lt;/td&gt;");<br />                                out.println("&lt;/tr&gt;");<br />                        }<br /><br />                        out.println("&lt;/table&gt;");<br />                        conn.close();<br />                }<br />                <br />        }<br />        catch(Exception e)<br />        {<br />                out.println(e.toString());<br />                System.out.println(e.toString());<br />        }<br />%&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;</pre><img src ="http://www.blogjava.net/kongjia/aggbug/65320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-08-23 17:24 <a href="http://www.blogjava.net/kongjia/archive/2006/08/23/65320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat5.x和Hibernate数据库连接池配置方法</title><link>http://www.blogjava.net/kongjia/archive/2006/08/23/65319.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Wed, 23 Aug 2006 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/08/23/65319.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/65319.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/08/23/65319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/65319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/65319.html</trackback:ping><description><![CDATA[Tomcat5.x和Hibernate数据库连接池配置方法


<table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><br /></td></tr></tbody></table><span class="oblog_text">  首先确保你的TOMCAT HIBERNATE SQLSERVER环境运转正常。<br />接着我们到TOMCAT安装目录找到/Conf/server.xml文件在你的标签内部加入下面的红色部分代码<br /><br />代码内容<br />&lt;Context path="" docBase="" debug="0" &gt; <br />&lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt; <br />&lt;Resource name="JNDI/gamvan" auth="Container" <br />type="javax.sql.DataSource" driverClassName="net.sourceforge.jtds.jdbc.Driver" <br />url="jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=GVclub_gamvan" <br />username="sa" password="123" maxActive="100" maxIdle="10" <br />maxWait="-1"/&gt; <br />&lt;/Context&gt; <br /><br /><br />其中net.sourceforge.jtds.jdbc.Driver应该是你的数据库驱动类；jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=GVclub_gamvan 应该是你的数据库连接地址；<br />JNDI/gamvan 连接池名字<br />username="sa" password="123" 你的数据库登陆ID和密码<br /><br />然后到你的网站根目录/WEB-INF/ 打开web.xml 在web-app标签内部加上如下代码<br />代码内容<br />&lt;resource-ref&gt; <br />&lt;description&gt;Oracle Datasource example&lt;/description&gt; <br />&lt;res-ref-name&gt;JNDI/gamvan&lt;/res-ref-name&gt; <br />&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; <br />&lt;res-auth&gt;Container&lt;/res-auth&gt; <br />&lt;/resource-ref&gt; <br /><br /><br />TOMCAT部分我们配置完毕，记下来配置hibernate的配置文件hibernate.cfg.xml<br />代码内容<br />&lt;!-- Datasource Start --&gt; <br />&lt;property name="connection.datasource"&gt;java:comp/env/JNDI/gamvan&lt;/property&gt; <br />&lt;property name="show_sql"&gt;false&lt;/property&gt; <br />&lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt; <br />&lt;!-- Datasource END --&gt; <br /><br />将原来的数据库连接标签部分注销，比如SQLSERVER2000注销以下部分<br />代码内容<br />&lt;property name="connection.driver_class"&gt;net.sourceforge.jtds.jdbc.Driver&lt;/property&gt; <br />&lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt; <br />&lt;property name="connection.url"&gt; <br />jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=GVclub_gamvan; <br />&lt;/property&gt; <br />&lt;property name="connection.username"&gt;sa&lt;/property&gt; <br />&lt;property name="connection.password"&gt;123&lt;/property&gt; <br /><br />接着重起TOMCAT就可以使用连接池了。TOMCAT5.5.9 HIBERNATE3.05版本上测试成功</span><img src ="http://www.blogjava.net/kongjia/aggbug/65319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-08-23 17:22 <a href="http://www.blogjava.net/kongjia/archive/2006/08/23/65319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat5.x和Hibernate数据库连接池配置方法</title><link>http://www.blogjava.net/kongjia/archive/2006/08/23/65316.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Wed, 23 Aug 2006 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/08/23/65316.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/65316.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/08/23/65316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/65316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/65316.html</trackback:ping><description><![CDATA[
		<div id="body_main_L1_top2">
				<strong class="title">Tomcat5.x和Hibernate数据库连接池配置方法</strong>
				<br />
				<span class="zhushi">
						<strong>来源:</strong> <a href="http://www.gamvan.com/" target="_blank" class="zhushi">今晚在线</a>
				  <strong>作者:</strong><a href="mailto:Noteasy@gamvan.com" class="zhushi">我容易么我</a>
				  <strong>类别:</strong> 原创 
				  <strong>时间:</strong> 2005-11-8
				  <strong>浏览:</strong><script language="javascript" src="http://www.gamvan.com/gvScript/ArticleViewCount.asp?aID=682"></script><div align="right">【<a href="javascript:doZoom(16)" class="zhushi">大</a>    <a href="javascript:doZoom(14)" class="zhushi">中</a>    <a href="javascript:doZoom(12)" class="zhushi">小</a>】   <a href="http://www.gamvan.com/doPost.asp?aID=682" class="zhushi">依我之见</a>    <a href="http://www.gamvan.com/SendFriends.asp?aID=682" class="zhushi">推荐给朋友</a>    <a href="http://www.gamvan.com/developer/java/opener/2005/11/682.html#" class="zhushi" onclick="window.print();">打印文档</a></div></span>
		</div>
		<font id="zoom">
				首先确保你的TOMCAT HIBERNATE SQLSERVER环境运转正常。<br /></font>
		<div align="center">
				<font id="zoom">
						<script type="text/javascript">
								<!--
				google_ad_client = "pub-5535238706151070";
				google_ad_width = 468;
				google_ad_height = 60;
				google_ad_format = "468x60_as";
				google_ad_type = "text_image";
				google_ad_channel ="";
				google_color_border = "ffffff";
				google_color_bg = "ffffff";
				google_color_link = "990000";
				google_color_url = "008000";
				google_color_text = "000000";
				//-->
						</script>
						<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
						</script>
						<iframe name="google_ads_frame" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5535238706151070&amp;dt=1156324159359&amp;lmt=1135607029&amp;format=468x60_as&amp;output=html&amp;url=http%3A%2F%2Fwww.gamvan.com%2Fdeveloper%2Fjava%2Fopener%2F2005%2F11%2F682.html&amp;color_bg=ffffff&amp;color_text=000000&amp;color_link=990000&amp;color_url=008000&amp;color_border=ffffff&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.google.cn%2Fsearch%3Fhl%3Dzh-CN%26q%3Dhibernate%2B%25E8%25BF%259E%25E6%258E%25A5%25E6%25B1%25A0%26btnG%3DGoogle%2B%25E6%2590%259C%25E7%25B4%25A2%26meta%3D&amp;cc=100&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=1&amp;u_java=true&amp;u_nplug=14&amp;u_nmime=52" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" frameborder="0" height="60" scrolling="no" width="468">
						</iframe>
				</font>
		</div>
		<font id="zoom">
		</font>
		<p>
				<font id="zoom">接着我们到TOMCAT安装目录找到/Conf/server.xml文件在你的标签内部加入下面的红色部分代码</font>
		</p>
		<p>
		</p>
		<table style="border: 1px none ;" fixed="" table-layout="" align="center" border="1" bordercolor="#e0e0e0" cellpadding="4" cellspacing="1" width="95%">
				<tbody>
						<tr>
								<td style="height: 25px;" bgcolor="#f6f6f6" valign="top">
										<font style="color: rgb(176, 176, 176);">代码内容</font>
										<br />&lt;Context path="" docBase="" debug="0" &gt; <br /><font color="#f70938">&lt;WatchedResource&gt;WEB-INF/web.xml&lt;/WatchedResource&gt; <br />&lt;Resource name="JNDI/gamvan" auth="Container" <br />type="javax.sql.DataSource" driverClassName="net.sourceforge.jtds.jdbc.Driver" <br />url="jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=GVclub_gamvan" <br />username="sa" password="123" maxActive="100" maxIdle="10" <br />maxWait="-1"/&gt;</font><br />&lt;/Context&gt;</td>
						</tr>
				</tbody>
		</table>
		<p>
				<font id="zoom">其中<font color="#f70938">net.sourceforge.jtds.jdbc.Driver</font>应该是你的<a href="http://www.gamvan.com/database/" target="_blank">数据库</a>驱动类；<font color="#f70938">jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=GVclub_gamvan</font> 应该是你的<a href="http://www.gamvan.com/database/" target="_blank">数据库</a>连接地址；<br /><font color="#f70938">JNDI/gamvan </font>连接池名字<br /><font color="#f70938">username="sa" password="123"  </font>你的<a href="http://www.gamvan.com/database/" target="_blank">数据库</a>登陆ID和密码</font>
		</p>
		<p>
				<font id="zoom">然后到你的<a href="http://www.gamvan.com/web/" target="_blank">网站</a>根目录/WEB-INF/ 打开web.xml   在web-app标签内部加上如下代码<br /><table style="border: 1px none ;" fixed="" table-layout="" align="center" border="1" bordercolor="#e0e0e0" cellpadding="4" cellspacing="1" width="95%"><tbody><tr><td style="height: 25px;" bgcolor="#f6f6f6" valign="top"><font style="color: rgb(176, 176, 176);">代码内容</font><br />&lt;resource-ref&gt; <br />&lt;description&gt;Oracle Datasource example&lt;/description&gt; <br />&lt;res-ref-name&gt;<font color="#f70968">JNDI/gamvan</font>&lt;/res-ref-name&gt; <br />&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; <br />&lt;res-auth&gt;Container&lt;/res-auth&gt; <br />&lt;/resource-ref&gt; </td></tr></tbody></table></font>
		</p>
		<font id="zoom">TOMCAT部分我们配置完毕，记下来配置hibernate的配置文件hibernate.cfg.xml<br /><table style="border: 1px none ;" fixed="" table-layout="" align="center" border="1" bordercolor="#e0e0e0" cellpadding="4" cellspacing="1" width="95%"><tbody><tr><td style="height: 25px;" bgcolor="#f6f6f6" valign="top"><font style="color: rgb(176, 176, 176);">代码内容</font><br />&lt;!-- Datasource Start --&gt; <br />&lt;property name="connection.datasource"&gt;java:comp/env/JNDI/gamvan&lt;/property&gt; <br />&lt;property name="show_sql"&gt;false&lt;/property&gt; <br />&lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt; <br />&lt;!-- Datasource END --&gt;</td></tr></tbody></table><br />将原来的<a href="http://www.gamvan.com/database/" target="_blank">数据库</a>连接标签部分注销，比如SQLSERVER2000注销以下部分<br /><table style="border: 1px none ;" fixed="" table-layout="" align="center" border="1" bordercolor="#e0e0e0" cellpadding="4" cellspacing="1" width="95%"><tbody><tr><td style="height: 25px;" bgcolor="#f6f6f6" valign="top"><font style="color: rgb(176, 176, 176);">代码内容</font><br />&lt;property name="connection.driver_class"&gt;net.sourceforge.jtds.jdbc.Driver&lt;/property&gt; <br />&lt;property name="dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt; <br />&lt;property name="connection.url"&gt; <br />jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=GVclub_gamvan; <br />&lt;/property&gt; <br />&lt;property name="connection.username"&gt;sa&lt;/property&gt; <br />&lt;property name="connection.password"&gt;123&lt;/property&gt; </td></tr></tbody></table><br />接着重起TOMCAT就可以使用连接池了。TOMCAT5.5.9  HIBERNATE3.05版本上测试成功。<br />如有什么疑问可以到 <a href="http://club.gamvan.com/">http://club.GamVan.com</a>　技术讨论区内提出，大家共同解决！</font>
<img src ="http://www.blogjava.net/kongjia/aggbug/65316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-08-23 17:14 <a href="http://www.blogjava.net/kongjia/archive/2006/08/23/65316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 使用JIRA搭建企业问题跟踪系统(转自Judy Shen的专栏)</title><link>http://www.blogjava.net/kongjia/archive/2006/08/22/64991.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Tue, 22 Aug 2006 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/08/22/64991.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/64991.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/08/22/64991.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/64991.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/64991.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 使用JIRA搭建企业问题跟踪系统(转自Judy Shen的专栏)																																																										转自：http://blog.csdn.net/judyxm/archive/2006/04/26/678456.asp																												...&nbsp;&nbsp;<a href='http://www.blogjava.net/kongjia/archive/2006/08/22/64991.html'>阅读全文</a><img src ="http://www.blogjava.net/kongjia/aggbug/64991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-08-22 10:40 <a href="http://www.blogjava.net/kongjia/archive/2006/08/22/64991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java API By Example, From Geeks To Geeks.</title><link>http://www.blogjava.net/kongjia/archive/2006/08/21/64742.html</link><dc:creator>kongjia</dc:creator><author>kongjia</author><pubDate>Mon, 21 Aug 2006 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/kongjia/archive/2006/08/21/64742.html</guid><wfw:comment>http://www.blogjava.net/kongjia/comments/64742.html</wfw:comment><comments>http://www.blogjava.net/kongjia/archive/2006/08/21/64742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kongjia/comments/commentRss/64742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kongjia/services/trackbacks/64742.html</trackback:ping><description><![CDATA[http://kickjava.com/<img src ="http://www.blogjava.net/kongjia/aggbug/64742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kongjia/" target="_blank">kongjia</a> 2006-08-21 11:22 <a href="http://www.blogjava.net/kongjia/archive/2006/08/21/64742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>