﻿<?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-Fingki 's Blog-随笔分类-About development</title><link>http://www.blogjava.net/fingki/category/36830.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 04 Mar 2010 16:03:43 GMT</lastBuildDate><pubDate>Thu, 04 Mar 2010 16:03:43 GMT</pubDate><ttl>60</ttl><item><title>使用Iterator 或for-each注意：java.util.ConcurrentModificationException</title><link>http://www.blogjava.net/fingki/archive/2010/03/02/314268.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Tue, 02 Mar 2010 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2010/03/02/314268.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/314268.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2010/03/02/314268.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/314268.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/314268.html</trackback:ping><description><![CDATA[在使用Iterator处理Collection时，注意java.util.ConcurrentModificationException。<br />
1.如果你仅仅是对collection进行遍历查询，那么不必担心什么。<br />
2.但如果你在遍历过程中要对collection进行删除，那么你就要注意了。<br />
For example:<br />
private&nbsp;void&nbsp;testDel()&nbsp;{&nbsp;&nbsp;
<ol start="1">
    <li>&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList&lt;String&gt;();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;"td"&nbsp;+&nbsp;i;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(str);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Iterator&nbsp;it&nbsp;=&nbsp;list.iterator();&nbsp;it.hasNext();)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;(String)&nbsp;it.next();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(str.equals("td5"))&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;list.remove(str);&nbsp;&nbsp;// 删除方法一&nbsp; <br />
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;it.remove();&nbsp;&nbsp;// 删除方法二&nbsp; <br />
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
上面的代码运行没有问题，但如果你用&#8220;方法一&#8221;替代&#8220;方法二&#8221;，则会出现java.util.ConcurrentModificationException。<br />
（用for-each遍历也会出个类似问题）<br />
具体原因是可以看一下<span style="color: #000000;">先看看List中的remove方法源码：<br />
</span>
<ol start="1">
    <li>public&nbsp;boolean&nbsp;remove(Object&nbsp;o)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(o&nbsp;==&nbsp;null)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;index&nbsp;=&nbsp;0;&nbsp;index&nbsp;&lt;&nbsp;size;&nbsp;index++)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(elementData[index]&nbsp;==&nbsp;null)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastRemove(index);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;index&nbsp;=&nbsp;0;&nbsp;index&nbsp;&lt;&nbsp;size;&nbsp;index++)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(o.equals(elementData[index]))&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fastRemove(index);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>private&nbsp;void&nbsp;fastRemove(int&nbsp;index)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;modCount++;&nbsp;//&nbsp;特别注意这里，这里只增加了modCount的值&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;numMoved&nbsp;=&nbsp;size&nbsp;-&nbsp;index&nbsp;-&nbsp;1;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(numMoved&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.arraycopy(elementData,&nbsp;index&nbsp;+&nbsp;1,&nbsp;elementData,&nbsp;index,&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numMoved);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;elementData[--size]&nbsp;=&nbsp;null;&nbsp;//&nbsp;Let&nbsp;gc&nbsp;do&nbsp;its&nbsp;work&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
接着看。删除后得到下一个元素的代码，it.next():&nbsp; it为AbstractList的内部类Iterator的一个实例。<br />
<ol start="1">
    <li>public&nbsp;E&nbsp;next()&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;E&nbsp;next&nbsp;=&nbsp;get(cursor);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastRet&nbsp;=&nbsp;cursor++;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;next;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IndexOutOfBoundsException&nbsp;e)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;NoSuchElementException();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>final&nbsp;void&nbsp;checkForComodification()&nbsp;{&nbsp; //注意这个方法<br />
    </li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(modCount&nbsp;!=&nbsp;expectedModCount)&nbsp; //检查这两个值是否相同</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ConcurrentModificationException();&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
最后看Iterator的remove()方法的源代码：<br />
<ol start="1">
    <li>public&nbsp;void&nbsp;remove()&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lastRet&nbsp;==&nbsp;-1)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;IllegalStateException();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;checkForComodification();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractList.this.remove(lastRet);&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lastRet&nbsp;&lt;&nbsp;cursor)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor--;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastRet&nbsp;=&nbsp;-1;&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expectedModCount&nbsp;=&nbsp;modCount;&nbsp;//&nbsp;设置expectedModCount&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IndexOutOfBoundsException&nbsp;e)&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ConcurrentModificationException();&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>final&nbsp;void&nbsp;checkForComodification()&nbsp;{&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(modCount&nbsp;!=&nbsp;expectedModCount)&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;ConcurrentModificationException();&nbsp;&nbsp;</li>
    <li>}&nbsp; <br />
    </li>
</ol>
这下就明白了，list的remove方法只修改了modCount值，而iterator的remove能同步modCount和expectedModCount.<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/314268.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2010-03-02 12:22 <a href="http://www.blogjava.net/fingki/archive/2010/03/02/314268.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各国语言代码表</title><link>http://www.blogjava.net/fingki/archive/2009/12/23/307062.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Wed, 23 Dec 2009 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/12/23/307062.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/307062.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/12/23/307062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/307062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/307062.html</trackback:ping><description><![CDATA[<p>各国语言代码列表：<br />
English 1033 1033 <br />
German 1031 1031 <br />
French 1036 1036 <br />
Japanese 1041 1041 <br />
Danish 1030 1030 <br />
Spanish 3082 3082 <br />
Italian 1040 1040 <br />
Dutch 1043 1043 <br />
Norwegian 2068 2068 <br />
Portuguese 2070 2070 <br />
Finnish 1035 1035 <br />
Swedish 1053 1053 <br />
Czech 1029 1029 <br />
Hungarian 1038 1038 <br />
Polish 1045 1045 <br />
Romanian 1048 1048 <br />
Croatian 1050 1050 <br />
Slovak 1051 1051 <br />
Slovene 1060 1060 <br />
Greek 1032 1032 <br />
Bulgarian 1026 1026 <br />
Russian 1049 1049 <br />
Turkish 1055 1055 <br />
British English 2057 1033 <br />
Estonian 1061 1061 <br />
Latvian 1062 1062 <br />
Lithuanian 1063 1063 <br />
Brazilian 1046 1046 <br />
Traditional Chinese 1028 1028 <br />
Korean 1042 1042 <br />
Simplified Chinese 2052 2052 <br />
Arabic 1025 1025 <br />
Thai 1054 1054</p>
<img src ="http://www.blogjava.net/fingki/aggbug/307062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-12-23 17:33 <a href="http://www.blogjava.net/fingki/archive/2009/12/23/307062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>要理解IOC，推荐： 看《墨攻》理解IoC概念</title><link>http://www.blogjava.net/fingki/archive/2009/08/13/290949.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Thu, 13 Aug 2009 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/08/13/290949.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/290949.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/08/13/290949.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/290949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/290949.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要理解IOC，推荐： 看《墨攻》理解IoC概念。<br>IOC从字面来看不容易懂，但如果你看了这篇文章，相信你一定会懂。<br>佩服原作者！&nbsp;&nbsp;<a href='http://www.blogjava.net/fingki/archive/2009/08/13/290949.html'>阅读全文</a><img src ="http://www.blogjava.net/fingki/aggbug/290949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-08-13 10:34 <a href="http://www.blogjava.net/fingki/archive/2009/08/13/290949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下application中文显示为方块</title><link>http://www.blogjava.net/fingki/archive/2009/07/06/285640.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Mon, 06 Jul 2009 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/07/06/285640.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/285640.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/07/06/285640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/285640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/285640.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux下application中文显示为方块问题的解决&nbsp;&nbsp;<a href='http://www.blogjava.net/fingki/archive/2009/07/06/285640.html'>阅读全文</a><img src ="http://www.blogjava.net/fingki/aggbug/285640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-07-06 10:27 <a href="http://www.blogjava.net/fingki/archive/2009/07/06/285640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>css hover 与 jquery</title><link>http://www.blogjava.net/fingki/archive/2009/05/21/271887.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Thu, 21 May 2009 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/05/21/271887.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/271887.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/05/21/271887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/271887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/271887.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: jquery css hover&nbsp;&nbsp;<a href='http://www.blogjava.net/fingki/archive/2009/05/21/271887.html'>阅读全文</a><img src ="http://www.blogjava.net/fingki/aggbug/271887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-05-21 10:51 <a href="http://www.blogjava.net/fingki/archive/2009/05/21/271887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DWR对象参数问题</title><link>http://www.blogjava.net/fingki/archive/2009/04/23/267158.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Thu, 23 Apr 2009 07:23:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/04/23/267158.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/267158.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/04/23/267158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/267158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/267158.html</trackback:ping><description><![CDATA[DWR 2.0.5，<br />
方法使用对象参数时报错如下：<br />
Erroring: batchId[0] message[org.directwebremoting.extend.MarshallException: Error marshalling test.User:<br />
<br />
一个最可能的原因是 User没有一个无参的construction。<br />
<br />
晕。。。<br />
朋友们注意呀！<br />
<img src ="http://www.blogjava.net/fingki/aggbug/267158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-04-23 15:23 <a href="http://www.blogjava.net/fingki/archive/2009/04/23/267158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>以太网环境下UDP传输中的数据包长度问题</title><link>http://www.blogjava.net/fingki/archive/2009/04/10/264877.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Fri, 10 Apr 2009 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/04/10/264877.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/264877.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/04/10/264877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/264877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/264877.html</trackback:ping><description><![CDATA[对于以太网环境下UDP传输中的数据包长度问题<br />
<br />
首先要看TCP/IP协议，涉及到四层：链路层，网络层，传输层，应用层。<br />
其中以太网（Ethernet）的数据帧在链路层<br />
IP包在网络层<br />
TCP或UDP包在传输层<br />
TCP或UDP中的数据（Data)在应用层<br />
它们的关系是 数据帧｛IP包｛TCP或UDP包｛Data｝｝｝<br />
在应用程序中我们用到的Data的长度最大是多少，直接取决于底层的限制。<br />
我们从下到上分析一下：<br />
在链路层，由以太网的物理特性决定了数据帧的长度为（46＋18）－（1500＋18），其中的18是数据帧的头和尾，也就是说数据帧的内容最大为1500，即MTU（Maximum Transmission Unit）为1500；<br />
在网络层，因为IP包的首部要占用20字节，所以这的MTU为1500－20＝1480；<br />
在传输层，对于UDP包的首部要占用8字节，所以这的MTU为1480－8＝1472；<br />
所以，在应用层，你的Data最大长度为1472。<br />
（当我们的UDP包中的数据多于MTU(1472)时，发送方的IP层需要分片fragmentation进行传输，而在接收方IP层则需要进行数据报重组，由于UDP是不可靠的传输协议，如果分片丢失导致重组失败，将导致UDP数据包被丢弃）。<br />
从上面的分析来看，在普通的局域网环境下，UDP的数据最大为1472字节最好（避免分片重组）。<br />
但在网络编程中，Internet中的路由器可能有设置成不同的值（小于默认值），Internet上的标准MTU值为576，所以Internet的UDP编程时数据长度最好在576－20－8＝548字节以内。<br />
MTU对我们的UDP编程很重要，那如何查看路由的MTU值呢？<br />
对于windows OS: ping -f -l &lt;data_length&gt; &lt;gateway_IP&gt;<br />
如：ping -f -l 1472 192.168.0.1<br />
如果提示：Packets needs to be fragmented but DF set.<br />
则表明MTU小于1500，不断改小data_length值，可以最终测算出gateway的MTU值；<br />
对于linux OS: ping -c &lt;number&gt; -M do -s &lt;data_length&gt; &lt;gateway_IP&gt;<br />
如： ping -c 1 -M do -s 1472 192.168.0.1<br />
如果提示 Frag needed and DF set&#8230;&#8230;<br />
则表明MTU小于1500，可以再测以推算gateway的MTU。<br />
当然要修改MTU的值，那就是网管的事了（一般人没这权限呀），我们只能申请加等待了 ^-^ .<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/264877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-04-10 16:35 <a href="http://www.blogjava.net/fingki/archive/2009/04/10/264877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSCalendar 使用样例</title><link>http://www.blogjava.net/fingki/archive/2009/02/17/255112.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Tue, 17 Feb 2009 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/02/17/255112.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/255112.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/02/17/255112.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/255112.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/255112.html</trackback:ping><description><![CDATA[<h1>JSCalendar 日历控件 使用样例如下：<br />
</h1>
&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;style type="text/css"&gt;@import url( /js/jscalendar/calendar-win2k-cold-1.css );&lt;/style&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="/js/jscalendar/calendar.js"&gt;&lt;/script&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="/js/jscalendar/i18n.jsp"&gt;&lt;/script&gt;//<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">不用i18n可以指定语言 如：&lt;script type="text/javascript" src="/js/jscalendar/lang/calendar-en.js"&gt;&lt;/script&gt;</span><br />
&nbsp;&nbsp;&nbsp; &lt;script type="text/javascript" src="/js/jscalendar/calendar-setup.js"&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;input type="text" size="10" name="fromDate" id="fromDate" maxlength="10" onchange="checkSpecific();" value=""/&gt;<br />
&lt;img src="images/icon_calendarpicker.gif" id="fromDateCal" /&gt;<br />
&lt;br&gt;<br />
&lt;script type="text/javascript" &gt;<br />
&nbsp;&nbsp;&nbsp; Calendar.setup(<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputField&nbsp; : "fromDate",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // ID of the input field<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ifFormat&nbsp;&nbsp;&nbsp; : "%m/%d/%Y",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // the date format<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; button&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : "fromDateCal",&nbsp;&nbsp;&nbsp; // ID of the button<br />
&nbsp;&nbsp;&nbsp; });<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
上述示例代码在jsp容器中运行完全正常。<br />
<img src ="http://www.blogjava.net/fingki/aggbug/255112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-02-17 15:35 <a href="http://www.blogjava.net/fingki/archive/2009/02/17/255112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关序列化的问题 java.io.InvalidClassException</title><link>http://www.blogjava.net/fingki/archive/2009/01/13/251100.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Tue, 13 Jan 2009 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/01/13/251100.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/251100.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/01/13/251100.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/251100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/251100.html</trackback:ping><description><![CDATA[当一个类实现了序列化接口，有时会遇到 java.io.InvalidClassException 异常出现：<br />
java.io.InvalidClassException: com.test.Test; local class incompatible: stream classdesc serialVersionUID = 7981560250804078637, local class serialVersionUID = -8334405535174160822<br />
这是序列化兼容性所致；<br />
java通过一个名为UID（stream unique
identifier）来控制，这个UID是隐式的，它通过类名，方法名等诸多因素经过计算而得，理论上是一一映射的关系，也就是唯一的。如果UID不一
样的话，就无法实现反序列化了，并且将会得到InvalidClassException。<br />
当要人为的产生一个新的版本（实现并没有改动），而抛弃以前的版本的话，可以通过显式的声名UID来实现：<br />
private static final long serialVersionUID=????;//(你可以编造一个UID，但不能有重复)<br />
<br />
对于上例我们可以在com.test.Test类中加入 ：<br />
private static final long serialVersionUID=7981560250804078637l; <br />
这样就解决了新老版本的兼容性问题。<br />
当然，对于序列化还有很多问题，慢慢研究吧。<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/251100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-01-13 11:46 <a href="http://www.blogjava.net/fingki/archive/2009/01/13/251100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关 volatie 关键字</title><link>http://www.blogjava.net/fingki/archive/2009/01/06/250106.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Tue, 06 Jan 2009 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/01/06/250106.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/250106.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/01/06/250106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/250106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/250106.html</trackback:ping><description><![CDATA[<p>对volatile，看到了个很清楚的解释，摘录下来如下：<br />
</p>
<p>volatile关键字有什么用？<br />
恐怕比较一下volatile和synchronized的不同是最容易解释清楚的。volatile是变量修饰符，而synchronized则作用于一段代码或方法；看如下三句get代码：</p>
<div>
<ol ln-show="" title="Double click to hide line number." ondblclick="linenumber(this)">
    <li>int<span style="color: Blue;">i1</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>int<span style="color: Blue;">geti1</span><span style="color: Olive;">()</span><span style="color: Olive;">{</span><span style="color: Green;">return</span><span style="color: Blue;">i1</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
    <li><span style="color: Green;">volatile</span>&nbsp;int<span style="color: Blue;">i2</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>int<span style="color: Blue;">geti2</span><span style="color: Olive;">()</span><span style="color: Olive;">{</span><span style="color: Green;">return</span><span style="color: Blue;">i2</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
    <li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span>int&nbsp;<span style="color: Blue;">i3</span><span style="color: Gray;">; </span><span style="color: Green;">synchronized</span>int<span style="color: Blue;">geti3</span><span style="color: Olive;">()</span><span style="color: Olive;">{</span><span style="color: Green;">return</span><span style="color: Blue;">i3</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
</ol>
</div>
<p>　　geti1()得到存储在当前线程中i1的数值。多个线程有多个i1变量拷贝，而且这些i1之间可以互不相同。换句话说，另一个线程可能已经改
变了它线程内的i1值，而这个值可以和当前线程中的i1值不相同。事实上，Java有个思想叫&#8220;主&#8221;内存区域，这里存放了变量目前的&#8220;准确值&#8221;。每个线程
可以有它自己的变量拷贝，而这个变量拷贝值可以和&#8220;主&#8221;内存区域里存放的不同。因此实际上存在一种可能：&#8220;主&#8221;内存区域里的i1值是1，线程1里的i1值
是2，线程2里的i1值是3——这在线程1和线程2都改变了它们各自的i1值，而且这个改变还没来得及传递给&#8220;主&#8221;内存区域或其他线程时就会发生。<br />
而geti2()得到的是&#8220;主&#8221;内存区域的i2数值。用volatile修饰后的变量不允许有不同于&#8220;主&#8221;内存区域的变量拷贝。换句话说，一个变量经
volatile修饰后在所有线程中必须是同步的；任何线程中改变了它的值，所有其他线程立即获取到了相同的值。理所当然的，volatile修饰的变量
存取时比一般变量消耗的资源要多一点，因为线程有它自己的变量拷贝更为高效。<br />
既然volatile关键字已经实现了线程间数据同步，又要synchronized干什么呢？呵呵，它们之间有两点不同。首
先，synchronized获得并释放监视器——如果两个线程使用了同一个对象锁，监视器能强制保证代码块同时只被一个线程所执行——这是众所周知的事
实。但是，synchronized也同步内存：事实上，synchronized在&#8220;主&#8221;内存区域同步整个线程的内存。因此，执行geti3()方法做
了如下几步：<br />
1. 线程请求获得监视this对象的对象锁（假设未被锁，否则线程等待直到锁释放）<br />
2. 线程内存的数据被消除，从&#8220;主&#8221;内存区域中读入（Java虚拟机能优化此步。。。[后面的不知道怎么表达,汗]）<br />
3. 代码块被执行<br />
4. 对于变量的任何改变现在可以安全地写到&#8220;主&#8221;内存区域中（不过geti3()方法不会改变变量值）<br />
5. 线程释放监视this对象的对象锁<br />
因此volatile只是在线程内存和&#8220;主&#8221;内存间同步某个变量的值，而synchronized通过锁定和解锁某个监视器同步所有变量的值。显然synchronized要比volatile消耗更多资源。</p>
<p>附英文原文：<br />
What does volatile do? </p>
<p>This is probably best explained by comparing the effects that
volatile and synchronized have on a method. volatile is a field
modifier, while synchronized modifies code blocks and methods. So we
can specify three variations of a simple accessor using those two
keywords: </p>
<div>
<ol ln-show="" title="Double click to hide line number." ondblclick="linenumber(this)">
    <li>int<span style="color: Blue;">i1</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>int<span style="color: Blue;">geti1</span><span style="color: Olive;">()</span><span style="color: Olive;">{</span><span style="color: Green;">return</span><span style="color: Blue;">i1</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
    <li><span style="color: Green;">volatile</span>&nbsp;int<span style="color: Blue;">i2</span><span style="color: Gray;">;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>int<span style="color: Blue;">geti2</span><span style="color: Olive;">()</span><span style="color: Olive;">{</span><span style="color: Green;">return</span><span style="color: Blue;">i2</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
    <li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; </span>int&nbsp;<span style="color: Blue;">i3</span><span style="color: Gray;">; </span><span style="color: Green;">synchronized</span>int<span style="color: Blue;">geti3</span><span style="color: Olive;">()</span><span style="color: Olive;">{</span><span style="color: Green;">return</span><span style="color: Blue;">i3</span><span style="color: Gray;">;</span><span style="color: Olive;">}</span></li>
</ol>
</div>
<p>geti1() accesses the value currently stored in i1 in the current
thread. Threads can have local copies of variables, and the data does
not have to be the same as the data held in other threads. In
particular, another thread may have updated i1 in it&#8217;s thread, but the
value in the current thread could be different from that updated value.
In fact Java has the idea of a &#8220;main&#8221; memory, and this is the memory
that holds the current &#8220;correct&#8221; value for variables. Threads can have
their own copy of data for variables, and the thread copy can be
different from the &#8220;main&#8221; memory. So in fact, it is possible for the
&#8220;main&#8221; memory to have a value of 1 for i1, for thread1 to have a value
of 2 for i1 and for thread2 to have a value of 3 for i1 if thread1 and
thread2 have both updated i1 but those updated value has not yet been
propagated to &#8220;main&#8221; memory or other threads. </p>
<p>On the other hand, geti2() effectively accesses the value of i2 from
&#8220;main&#8221; memory. A volatile variable is not allowed to have a local copy
of a variable that is different from the value currently held in &#8220;main&#8221;
memory. Effectively, a variable declared volatile must have it&#8217;s data
synchronized across all threads, so that whenever you access or update
the variable in any thread, all other threads immediately see the same
value. Of course, it is likely that volatile variables have a higher
access and update overhead than &#8220;plain&#8221; variables, since the reason
threads can have their own copy of data is for better efficiency. </p>
<p>Well if volatile already synchronizes data across threads, what is
synchronized for? Well there are two differences. Firstly synchronized
obtains and releases locks on monitors which can force only one thread
at a time to execute a code block, if both threads use the same monitor
(effectively the same object lock). That&#8217;s the fairly well known aspect
to synchronized. But synchronized also synchronizes memory. In fact
synchronized synchronizes the whole of thread memory with &#8220;main&#8221;
memory. So executing geti3() does the following: </p>
<p>1. The thread acquires the lock on the monitor for object this
(assuming the monitor is unlocked, otherwise the thread waits until the
monitor is unlocked).<br />
2. The thread memory flushes all its variables, i.e. it has all of its
variables effectively read from &#8220;main&#8221; memory (JVMs can use dirty sets
to optimize this so that only &#8220;dirty&#8221; variables are flushed, but
conceptually this is the same. See section 17.9 of the Java language
specification).<br />
3. The code block is executed (in this case setting the return value to
the current value of i3, which may have just been reset from &#8220;main&#8221;
memory).<br />
4. (Any changes to variables would normally now be written out to &#8220;main&#8221; memory, but for geti3() we have no changes.)<br />
5. The thread releases the lock on the monitor for object this. </p>
<p>So where volatile only synchronizes the value of one variable
between thread memory and &#8220;main&#8221; memory, synchronized synchronizes the
value of all variables between thread memory and &#8220;main&#8221; memory, and
locks and releases a monitor to boot. Clearly synchronized is likely to
have more overhead than volatile.</p>
<p>摘自：http://bianbian.org/technology/java/88.html</p>
<img src ="http://www.blogjava.net/fingki/aggbug/250106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-01-06 15:24 <a href="http://www.blogjava.net/fingki/archive/2009/01/06/250106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有关 this$0 问题</title><link>http://www.blogjava.net/fingki/archive/2009/01/06/250074.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Tue, 06 Jan 2009 04:24:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/01/06/250074.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/250074.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/01/06/250074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/250074.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/250074.html</trackback:ping><description><![CDATA[<span id="text130996">有synthetic标记的field和method是class内部使用的，正常的源代码里不会出现synthetic field。小颖编译工具用的就是jad.所有反编译工具都不能保证完全正确地反编译class。所以你不能要求太多。<br />
下面我给大家介绍一下synthetic <br />
<br />
下面的例子是最常见的synthetic field <br />
class parent<br />
{<br />
public void foo()<br />
{<br />
}<br />
class inner<br />
{<br />
inner()<br />
{<br />
foo();<br />
}<br />
}<br />
}<br />
非static的inner class里面都会有一个this$0的字段保存它的父对象。编译后的inner class 就像下面这样：<br />
class parent$inner<br />
{<br />
synthetic parent this$0;<br />
parent$inner(parent this$0)<br />
{<br />
this.this$0 = this$0;<br />
this$0.foo();<br />
}<br />
}<br />
所有父对象的非私有成员都通过 this$0来访问。<br />
<br />
还有许多用到synthetic的地方。比如使用了assert 关键字的class会有一个<br />
synthetic static boolean $assertionsDisabled 字段<br />
使用了assert的地方<br />
assert condition;<br />
在class里被编译成<br />
if(!$assertionsDisabled &amp;&amp; !condition)<br />
{<br />
throw new AssertionError();<br />
}<br />
<br />
还有，在jvm里，所有class的私有成员都不允许在其他类里访问，包括它的inner class。在java语言里inner class是可以访问父类的私有成员的。在class里是用如下的方法实现的：<br />
class parent<br />
{<br />
private int value = 0;<br />
synthetic static int access$000(parent obj)<br />
{<br />
return value;<br />
}<br />
}<br />
在inner class里通过access$000来访问value字段。<br />
<br />
摘自：</span>http://www.cjsdn.net/post/print?bid=1&amp;id=130784
<img src ="http://www.blogjava.net/fingki/aggbug/250074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-01-06 12:24 <a href="http://www.blogjava.net/fingki/archive/2009/01/06/250074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Simple Certificate Enrollment Protocol(SCEP)</title><link>http://www.blogjava.net/fingki/archive/2009/01/04/249732.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Sun, 04 Jan 2009 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2009/01/04/249732.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/249732.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2009/01/04/249732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/249732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/249732.html</trackback:ping><description><![CDATA[相关资料：<br />
IETF ： http://www.potaroo.net/ietf/idref/draft-nourse-scep/<br />
Java SCEP ： http://www.urut.ch/scep/<br />
OpenSCEP ： http://openscep.othello.ch/<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/249732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2009-01-04 14:25 <a href="http://www.blogjava.net/fingki/archive/2009/01/04/249732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于 Exception: An invalid XML character (Unicode: 0x0) was found</title><link>http://www.blogjava.net/fingki/archive/2008/09/04/226969.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Thu, 04 Sep 2008 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/09/04/226969.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/226969.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/09/04/226969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/226969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/226969.html</trackback:ping><description><![CDATA[About Exception:<br />
An invalid XML character (Unicode: 0x0) was found in the element content of the document.<br />
<br />
问题描述：<br />
当我们用<br />
byte[] info ;<br />
DocumentHelper.parseText(new String(info));<br />
将一个字节数组转成字符串再转成Document（XML格式）时，常常会遇到上述异常。<br />
特别是当字符串有加、解密，或编码等情况时。<br />
<br />
原因：<br />
从异常来看，很明显是因为字节数组中存在 Unicode: 0x0,而这个字节在Xml中被认为是非法字符。<br />
<br />
对于一些经过编码或加、解密的字符串中，很容易会出现这个 0x0,<br />
特别是在加、解密中，经常会涉及到字符填充，而填充物通常是 0x0，<br />
需对于0x00-0x20 都会引起一定的问题，又因为这些字符不可见，因此用通常的编辑器进行编辑的时候找不到问题所在。<br />
而在转成String后也觉察不到任何异常。<br />
所以在转成XML格式时要对字符串进行检测：<br />
*&nbsp; Verify that no character has a hex value greater than 0xFFFD, or less than 0x20.<br />
* Check that the character is not equal to the tab ("t), the newline ("n), the carriage return ("r), or is an invalid XML character below the range of 0x20. If any of these characters occur, an exception is thrown.<br />
<br />
pubic void CheckUnicodeString(String value) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; for (int i=0; i &lt; value.Length; ++i) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value[i] &gt; 0xFFFD) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("Invalid Unicode");//或者直接替换掉0x0 value[i]='"n';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (value[i] &lt; 0x20 &amp;&amp; value[i] != '"t' &amp; value[i] != '"n' &amp; value[i] != '"r')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception("Invalid Xml Characters");//或者直接替换掉0x0 value[i]='"n';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
相关资源：<br />
http://msdn.microsoft.com/en-us/library/k1y7hyy9.aspx<br />
http://gceclub.sun.com.cn/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/226969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-09-04 15:18 <a href="http://www.blogjava.net/fingki/archive/2008/09/04/226969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些关于随机数的理解</title><link>http://www.blogjava.net/fingki/archive/2008/08/28/225442.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Thu, 28 Aug 2008 15:46:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/08/28/225442.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/225442.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/08/28/225442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/225442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/225442.html</trackback:ping><description><![CDATA[<p>以往有听说过&#8220;Microsoft Windows、FreeBSD不安全随机数生成器信息泄露漏洞&#8221;之类的文章，大都是因为随机函数存在漏洞生成不安全的随机，导致可预测的加密密钥。<br />
About Random<br />
随机数是密码学的一个重要部分，它通常作为初始化向量用于密钥生成中。有许多测试根据数字计算给定数字序列的随机性，它们考虑给定数定在序列中出现的周期，做更细致的测量，包括相同数字或其他重复形式出现的周期。<br />
但统计随机性的要求与加密随机性不同。<br />
一个数字序列在统计上是随机的，但如果攻击者可以推算出数字的序列（通过了解使用的算法和随机种子值），那么加密是变得不安全了。<br />
About Pseudo Random 伪随机数<br />
对于一串随机的数字，最常见的描述就是没有从前一个数字推算出后一个数字的数学方法。最好的随机数是从物理过程中获得的，因为实际物理程才是真正随机的。事实上，一些随机数生成器就是使用硬件设置来实现，如音频输入或二极管。<br />
&nbsp;&nbsp;&nbsp; 从设计上来说，计算机是很确定的，因此不是生成随机数的就好选择。它们通常求助于一个生成统计上随机的数字串的算法。为了确定在该算法中使用的输入值，它们要求用户提供一个种子值，这通常来自于系统时钟、网卡MAC地址以及其他不同的系统参数。<br />
&nbsp;&nbsp;&nbsp; 这些随机数字很适合于计算机游戏中的示例数据或建模物理过程。不过，它们不适合于加密。它的弱点包括以下几点：<br />
●&nbsp;&nbsp;&nbsp;&nbsp; 伪随机数是周期性的。最终将重复数字序列。<br />
●&nbsp;&nbsp;&nbsp;&nbsp; 如果使用相同的种子值，将接收到序列完全一样的&#8220;随机&#8221;数。因此，随机序列与种子值一样多。<br />
●&nbsp;&nbsp;&nbsp;&nbsp; 随机数可使用逆向工程。运用算法知识，强力攻击会立即猜测到种子值。如果种子值和时间之间有相关性，攻击者将会推算出所有后面的&#8220;随机&#8221;数。<br />
&nbsp;<br />
伪随机数是出现许多臭名昭著的攻击的主要原因。破解56 位DES从1997年1月的96 天到1999 年1月的22 小时15 分钟,由于DES使用的伪随机数生成算法导致了这个结果，有一种攻击就是针对赌博应用程序，这种应用程序使用一个随机数种子值来对纸牌进行排序，而洗牌的可能性是有限的。在看完开始的几张牌后，用户可以将当前发的牌与某种可能的洗牌序列匹配，来确定剩下牌的顺序。</p>
<p>另一个著名的例子就是Netscape Navigator 早期版本中的取决于时间的随机数字生成器，它泄露了动态生成的用于加密运用SSL的会话中数据的密钥。<br />
About Random encrypted 加密的随机数<br />
随机数生成是许多加密操作不可分割的组成部分。例如，加密密钥需要尽可能地随机，以便使它们很难被复制。加密随机数生成器必须生成在计算上无法进行推算（低于 p &lt; .05 的概率）的输出；即，任何推算下一个输出位的方法不得具有比随机猜测更高的成功几率。<br />
为了说明一连串的随机数字是加密安全的，必须使得用户不可能通过计算重新生成同样序列的随机数。遗憾的是，运用伪随机数字，可以很容易地重新生成同样的序列。用户需要知道的知识就是伪随机数生成器算法和种子值。<br />
&nbsp;&nbsp;&nbsp; 通过加密保护数据基于加密算法和更为随机的种子值就是本文要提出的方法,一个带加密功能的随机数产生器，可以应用于需要加密随机数的场合.为了构成种子值，需要用不同的值组合成一个系统范围内的种子值。这些值包括调用的应用程序可以提供的位，例如鼠标或键盘动作之间的用户反应时间、象进程ID和线程ID这样的系统和用户数据、系统时钟、系统计数器、自由磁盘集群属和散列的用户环境块。接着使用SHA-1散列这个值，输出用于创建一个随机数据流（用于更新系统种子值）。这可以起作用，是因为散列值生成了看似随机的数据，只改变源文档（种子值）中的一个位，任何两个输出的散列共享它们50%的位，尽管两个输出只有一位之差。当然，从理论上讲，有些过程还是周期性的。例如磁盘搜索时间看似随机的，实际取决于易于确定的因素，可以被推测出来。为了获取更好的随机数生成，可以采用硬件生成器，例如Intel的随机数生成器。<br />
&nbsp;&nbsp;&nbsp; <br />
说明：<br />
&nbsp;&nbsp;&nbsp; 创建加密安全的随机数需要更多的时间，这意味着如果需要快速地在一个短时间内生成大量随机数（例如百万级的数据）是不适合的。在一个简单测试中，用本文提到的RNG生成一百万个随机数的时间花费差不多是伪随机数生成器所用时间的八倍之多。<br />
<br />
相关资源：http://www.xfocus.net/articles/200209/451.html<br />
</p>
<img src ="http://www.blogjava.net/fingki/aggbug/225442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-08-28 23:46 <a href="http://www.blogjava.net/fingki/archive/2008/08/28/225442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 探测网络资源是否可用</title><link>http://www.blogjava.net/fingki/archive/2008/07/28/218072.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Mon, 28 Jul 2008 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/07/28/218072.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/218072.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/07/28/218072.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/218072.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/218072.html</trackback:ping><description><![CDATA[要用java检测网络资源是否可用，我们可以采用以下两种方法：<br />
一种方法是调用ping命令，<br />
如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Process &nbsp; process= &nbsp; Runtime.getRuntime().exec("ping &nbsp; 192.168.0.5"); &nbsp; <br />
&nbsp;  &nbsp;  &nbsp; InputStreamReader &nbsp; return &nbsp; = &nbsp; new &nbsp; InputStreamReader(process.getInputStream()); &nbsp; <br />
&nbsp;  &nbsp;  &nbsp; LineNumberReader &nbsp; returnData &nbsp; = &nbsp; new &nbsp; LineNumberReader &nbsp; (return);&nbsp;&nbsp;  &nbsp; <br />
&nbsp;  &nbsp; <br />
&nbsp;  &nbsp;  &nbsp; String &nbsp; line=""; &nbsp; <br />
&nbsp;  &nbsp;  &nbsp; while((line=returnData.readLine())!=null){ &nbsp; <br />
&nbsp;  &nbsp;  &nbsp;  &nbsp;  &nbsp; System.out.println(line); &nbsp; <br />
&nbsp;  &nbsp;  &nbsp; }<br />
通用对返回数据进行分析，来探测网络资源的可用性；<br />
这种方法有一个缺点：就是许多网络资源是不允许被ping的，从而针对这类资源无法探测。<br />
另一种方法是使用URL,<br />
如：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url = new URL("http://localhost"); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpURLConnection connection = (HttpURLConnection) url.openConnection(); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int state = connection.getResponseCode(); &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String responseContent = connection.getResponseMessage();<br />
通过分析ResponseCode来探测网络资源的可用性。<br />
另外，当指定的网络资源走SSL时，即用https协议时，需要加入可信证书到trust.keystore.<br />
通常情况下，我的用的是jre的keystore：cacerts，如jdk6下的路径为：jdk1.6.0_05/jre/lib/security/cacerts<br />
我们需要把指定资源的数字证书导入到信任库 cacerts.<br />
可以使用keytool工具：keytool -import -alias localhost -file localhost.cer -keystore cacerts<br />
如果我们不想使用jre的keystore，我们可以建立自己的keystore,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.setProperty("javax.net.ssl.trustStore", "/home/liqingfeng/workspace/Test/mystore/localhost.keystore");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.setProperty("javax.net.ssl.trustStorePassword","changeit");<br />
用keytool命令把localhost的证书导入到指定的localhost.keystore中。这样我们就可以用URL来探测SSL网络资源的可用性了。<br />
<br />
这里必须注意的是指定网络资源的证书的CN，必须与资源访问地址一致，否则会报错。<br />
以下是常见异常：<br />
当keystore中没有指定资源的证书时：<br />
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target<br />
当指定资源证书的CN与资源访问地址不匹配时：<br />
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/218072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-07-28 15:16 <a href="http://www.blogjava.net/fingki/archive/2008/07/28/218072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Good Adress</title><link>http://www.blogjava.net/fingki/archive/2008/07/21/216316.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Mon, 21 Jul 2008 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/07/21/216316.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/216316.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/07/21/216316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/216316.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/216316.html</trackback:ping><description><![CDATA[<h1 style4="" align="left">Good Address:</h1>
Command Line Tools for win32&nbsp;&nbsp; <br />
<a href="http://www.vkill.net/tools.html">http://www.vkill.net/tools.html</a><br />
<br />
脚本中心脚本库网址:<br />
<a href="http://www.microsoft.com/china/technet/community/scriptcenter/scripts/default.mspx">http://www.microsoft.com/china/technet/community/scriptcenter/scripts/default.mspx</a><br />
<br />
<a href="http://www.microsoft.com/china/technet/community/scriptcenter/scripts/default.mspx"></a>有关用户和组的脚本(找得我好辛苦呀)<br />
<a href="http://www.microsoft.com/china/technet/community/scriptcenter/user/default.mspx">http://www.microsoft.com/china/technet/community/scriptcenter/user/default.mspx</a><br />
<br />
最近发现一个不错的jdk6 source网站,收藏一下:<br />
<a href="http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/krb5/internal/ktab/KeyTab.java.htm">http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/krb5/internal/ktab/KeyTab.java.htm</a><br />
<br />
http://developer.classpath.org/doc/<br />
<br />
http://fuseyism.com/classpath/doc/<br />
<br />
http://kickjava.com/src/<br />
<br />
http://www.docjar.com/<br />
<br />
VbScript语言参考<br />
<a href="http://book.chinaz.com/VBScript/vbsdocs/vbstoc.htm">http://book.chinaz.com/VBScript/vbsdocs/vbstoc.htm</a><br />
<br />
SUN网站<br />
http://www.java.sun.com<br />
http://java.sun.com/javase/technologies/security/<br />
<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/216316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-07-21 11:50 <a href="http://www.blogjava.net/fingki/archive/2008/07/21/216316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>About JDK6 source </title><link>http://www.blogjava.net/fingki/archive/2008/07/14/214823.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Mon, 14 Jul 2008 13:32:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/07/14/214823.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/214823.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/07/14/214823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/214823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/214823.html</trackback:ping><description><![CDATA[<p>最近发现一个不错的jdk6 source网站,收藏一下:<br />
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/krb5/internal/ktab/KeyTab.java.htm</p>
<img src ="http://www.blogjava.net/fingki/aggbug/214823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-07-14 21:32 <a href="http://www.blogjava.net/fingki/archive/2008/07/14/214823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>About log4j</title><link>http://www.blogjava.net/fingki/archive/2008/06/25/210488.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Wed, 25 Jun 2008 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/06/25/210488.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/210488.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/06/25/210488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/210488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/210488.html</trackback:ping><description><![CDATA[最近越发感到日志对于软件调试的重要，尤其是远程调试。<br />
Log4j有三个主要的组件：Loggers，Appenders和Layouts.<br />
Loggers:日志类别<br />
Appenders日志要输出的地方<br />
Layouts日志以何种形式输出。<br />
1.Loggers 日志类别<br />
Loggers组件在此系统中被分为五个级别：DEBUG、INFO、WARN、ERROR和FATAL。<br />
这五个级别是有顺序的，DEBUG &lt; INFO &lt; WARN &lt; ERROR &lt; FATAL<br />
说明：假设你的Logger级别为A，则所有级别大于等于A的方法的参数信息都将输出到指定位置。<br />
（举个例子更易懂）如果你的Logger级别为INFO,则所有用.info(somemessage),.warn(somemessage),.error(somemessage),.fatal(somemessage)方法的参数信息都将输出到指定位置；但调用.debug(somemessage)方法参数信息不会输出。<br />
2.Appenders 日志要输出的地方<br />
Log4j日志系统允许把日志输出到不同的地方，如控制台（Console）、文件（Files）、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。<br />
org.apache.log4j.ConsoleAppender（控制台）<br />
org.apache.log4j.FileAppender（文件）<br />
org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />
org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生一个新的文件）<br />
org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />
3.Layouts 日志以何种形式输出<br />
Layouts提供了四种日志输出样式，如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。<br />
org.apache.log4j.HTMLLayout（以HTML表格形式布局）<br />
org.apache.log4j.PatternLayout（可以灵活地指定布局模式）<br />
org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串）<br />
org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息）<br />
<br />
log4j的具体使用请参照http://logging.apache.org/log4j/1.2/apidocs/index.html(log4j API)<br />
<img src ="http://www.blogjava.net/fingki/aggbug/210488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-06-25 12:15 <a href="http://www.blogjava.net/fingki/archive/2008/06/25/210488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cvs不能提交 Permission denied</title><link>http://www.blogjava.net/fingki/archive/2008/06/05/206042.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Thu, 05 Jun 2008 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/06/05/206042.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/206042.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/06/05/206042.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/206042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/206042.html</trackback:ping><description><![CDATA[今天一个朋友问题我一个CVS ERROR。<br />
﻿<font size="3"><font color="#000000"><font face="宋体">The server reported an error while performing the "cvs commit" command.
<br />
ccookteammeal: cvs [server aborted]: cannot rename file /web/***/WebRoot/WEB-INF/,web.xml, to /web/***/WebRoot/WEB-INF/web.xml,v: Permission denied</font></font></font><br />
回想之前用CVS时也遇到过这个经典问题，用户权限问题：<br />
&nbsp;&nbsp;&nbsp; 问题就出现在目录的权限上.我们安装CVS服务器时一般都用的是混合模式登录，需要windows和CVS共同验证。<br />
要登录CVS，必须同时是CVS用户和WINDOW用户，并且这个用户要对CVS目录有读写权限。<br />
一般我们新建的CVS用户，默认在WINDOW里只是普通用户，对CVS目录只有读权限，但没有写权限，所以可以获取文件，但当CVS 提交commit时，会报错 Permission denied.<br />
&nbsp;&nbsp;&nbsp; 所以，遇到这种情况，就把你的CVS用户在window（CVS服务器所在的机器）上修改为Administrator权限。<br />
在网上又摘录一些问题及解决如下：<br />
<span style="font-size: 12px;">症状1：<br />
cvs chacl default:n<br />
cvs [chacl aborted]: server does not support chacl<br />
***** CVS exited normally with code 1 *****<br />
解决：是python跟wincvs不兼容，最后用python221+cvsnt-2.0.41+wincvs1.3中文版<br />
<br />
症状2：无法checkout模块<br />
cvs checkout 大狼的工作目录 (in directory E:\CVS\sssss)<br />
cvs server: User user4 cannot access lxwDIR<br />
***** CVS exited normally with code 1 *****<br />
解决：没有给user4的用户此工作目录的读写权限<br />
<br />
症状3：无法提交修改，加文件等<br />
cvs commit -m "no message" "新建 文本文档.txt" (in directory E:\CVS\sssss\zylDIR\)<br />
cvs [server aborted]: "commit" requires write access to the repository<br />
***** CVS exited normally with code 1 *****<br />
解决：没有把user4加到writers中去<br />
<br />
症状4：无法提交修改，加文件等<br />
cvs add: Empty password used - try 'cvs login' with a real password<br />
cvs [add aborted]: authorization failed: server 192.168.0.105 rejected access to E:/cvs/KHRoot for user user2<br />
***** CVS exited normally with code 1 *****<br />
解决：应为我用user1用户checkout了模块，但用user2修改文件并提交，或加文件，重新用user2再在其他目录checkout一下模块，修改提交就可以了<br />
<br />
症状5：无法给模块附用户<br />
cvs chacl user4:rcw<br />
***** CVS exited normally with code 1 *****<br />
cvs [server aborted]: "chacl" requires write access to the repository<br />
解决，我用user4登录了，只有administrator有此权限</span>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/206042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-06-05 14:27 <a href="http://www.blogjava.net/fingki/archive/2008/06/05/206042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ant 条件判断 condition</title><link>http://www.blogjava.net/fingki/archive/2008/05/21/201919.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Wed, 21 May 2008 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/05/21/201919.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/201919.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/05/21/201919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/201919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/201919.html</trackback:ping><description><![CDATA[最近收到一个ticket，用ant写个build.xml，用到condition，作笔记如下：<br />
<br />
&nbsp;&nbsp;&nbsp; basic elements: istrue isfalse not and or xor available isset equals&nbsp; filesmatch<br />
&nbsp;&nbsp;&nbsp; 1、istrue isfalse:断言 真 假<br />
&lt;project name="testCondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;istrue value="true"/&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 2、逻辑运算<br />
&nbsp;&nbsp;&nbsp; 2.1、not 逻辑非&nbsp; <br />
&lt;project name="testCondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ＜not&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;istrue value="true"/&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/not&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;<br />
&nbsp;&nbsp;&nbsp; 2.2、and 逻辑与<br />
&lt;project name="testCondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ＜and&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;istrue value="true"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;istrue value="false"/&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/and&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;<br />
&nbsp;&nbsp;&nbsp; 2.3、or 逻辑或 xor异或 (语法上与and类似)<br />
<br />
&nbsp;&nbsp;&nbsp; 3、available 是否可用<br />
&lt;project name="testCondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;path id="all.test.classes"&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;pathelement location="bin"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;/path&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!--在指定的classpath路径下是否存在资源 TestTest.class--&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;available resource="TestTest.class"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;classpath refid="all.test.classes" /&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/available&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; 4、isset 指定属性是否存在<br />
&lt;project name="testCondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--属性也可以通过ant参数-D来设置--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="name" value="this is name"/&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!--如果属性name不存在则返回false--&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;isset property="name"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;<br />
&nbsp;&nbsp;&nbsp; 5、equals 是否相等<br />
&lt;project name="testCondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;!--属性也可以通过ant参数-D来设置--&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;property name="name" value="this is name"/&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!--如果arg1的值与arg2的值相等返回true，否则为false--&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;equals arg1="${name}" arg2="this is name"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 6、filesmatch 比较文件<br />
&lt;project name="testCondition"&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;target name="test"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;condition property="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;!--如果file1所代表的文件与file2所代表的文件相等返回true，否则为false--&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;filesmatch file1="testfile1.txt" file2="testfile2.txt"/&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/condition&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isTrue"&gt;&lt;/antcall&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;antcall target="isFalse"&gt;&lt;/antcall&gt;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isTrue" if="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is ture&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;target name="isFalse" unless="scondition"&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;echo&gt;is false&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/target&gt;<br />
&lt;/project&gt;&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
更多内容可以参考:http://ant.apache.org/manual/CoreTasks/conditions.html<br />
<img src ="http://www.blogjava.net/fingki/aggbug/201919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-05-21 15:26 <a href="http://www.blogjava.net/fingki/archive/2008/05/21/201919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse自动提示功能</title><link>http://www.blogjava.net/fingki/archive/2008/05/07/198983.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Wed, 07 May 2008 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/05/07/198983.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/198983.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/05/07/198983.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/198983.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/198983.html</trackback:ping><description><![CDATA[<p>Eclispe自动提示功能设置如下：</p>
<p>第一步：<br />
</p>
<p>windows－&gt;preferences-&gt;java-&gt;Editor-&gt;Code &nbsp; Assist&nbsp;&nbsp; 中</p>
<p>将auto－activetion中的Enable auto-activetion选项要勾选上</p>
<p>这里面有个时间的设定是为提示代码设定的显示时间。你可以根据自己的情况设定。</p>
<p>第二步：<br />
</p>
window-&gt;Preferences-&gt;Java-&gt;Editor-&gt;Content
Assist-&gt;Advanced&nbsp;&nbsp; 上面的选项卡Select the proposal kinds contained in the
'default' content assist list: 中把 <span style="color: rgb(255, 1, 2);">Other Java Proposals 选项打上勾就可以了。</span>
<p>另注：也可以直接恢复成默认设置。</p>
<img src ="http://www.blogjava.net/fingki/aggbug/198983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-05-07 15:26 <a href="http://www.blogjava.net/fingki/archive/2008/05/07/198983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单步调试 eclipse</title><link>http://www.blogjava.net/fingki/archive/2008/05/06/198702.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Tue, 06 May 2008 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/05/06/198702.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/198702.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/05/06/198702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/198702.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/198702.html</trackback:ping><description><![CDATA[<font size="2">1、单步调试快捷键<br />
以debug方式运行java程序后<br />
（F8）直接执行程序。遇到断点时暂停；<br />
（F5）单步执行程序，遇到方法时进入；<br />
（F6）单步执行程序，遇到方法时跳过；<br />
（F7）单步执行程序，从当前方法跳出。<br />
<br />
2、</font><font size="2">改变变量的值</font><br />
<font size="2">右击变量，在弹出的菜单中选择[change variable value]，弹出修改画面。<br />
改变其值后，按下ok；这时，变量的值就改为修改后的值了。<br />
3、检查代码段是否正确<br />
选择一句或一段代码，右键单击在弹出的菜单中选择Inspect项，<br />
此时，代码的执行结果将显示在Expressions窗口中。</font><br />
<img src ="http://www.blogjava.net/fingki/aggbug/198702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-05-06 14:37 <a href="http://www.blogjava.net/fingki/archive/2008/05/06/198702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Eclipse:Error logged from Ant UI:</title><link>http://www.blogjava.net/fingki/archive/2008/03/21/Error_logged_from_Ant_UI.html</link><dc:creator>Fingki.li</dc:creator><author>Fingki.li</author><pubDate>Fri, 21 Mar 2008 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/fingki/archive/2008/03/21/Error_logged_from_Ant_UI.html</guid><wfw:comment>http://www.blogjava.net/fingki/comments/187724.html</wfw:comment><comments>http://www.blogjava.net/fingki/archive/2008/03/21/Error_logged_from_Ant_UI.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fingki/comments/commentRss/187724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fingki/services/trackbacks/187724.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 今天用Eclipse中用ant运行build.xml脚本打包工程，突然ant不工作了，<br />
&nbsp;&nbsp;&nbsp; 查看Eclipse的Error log，显示<br />
&nbsp;&nbsp;&nbsp; Error logged from Ant UI:
<pre>	Exception Stack Trace:<br />
<br />
java.net.SocketTimeoutException: Accept timed out<br />
<br />
at java.net.PlainSocketImpl.socketAccept(Native Method)<br />
<br />
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:353)<br />
<br />
at java.net.ServerSocket.implAccept(ServerSocket.java:448)<br />
<br />
at java.net.ServerSocket.accept(ServerSocket.java:419)<br />
<br />
查看build.xml文件无异常，让我好是奇怪，明明昨天还是正常的呀。<br />
<br />
后来查看一下Ant Home,发现只有四项，觉得有点不对劲，他细一看，居然指到了/home/fingki/eclipse/plugins/Axis2_service_Archiver_1.3.0/lib下，<br />
<br />
重新指定一下Ant Home,运行ant，运行了。<br />
<br />
后来研究才发现，原来之前刚装了Axis2的plugins,Axis2_service_Archiver_1.3.0，这样Eclipse重启后优先把Ant Home指向那了，导致ant不工作了。<br />
<br />
看来Axis2_service_Archiver_1.3.0这个plugins还是有些bug呀。<br />
<br />
具体设置Ant Home如下：在Eclipse中－＞window－＞preferences－＞Ant－＞Runtime－＞Classpath，点击Ant home按钮，重新让其指向eclipse中的ant的plugins文件夹处，<br />
<br />
一般都在%Eclipse_home%/plugins/org.apache.ant_1.x.x。<br />
<br />
</pre>
<br />
<img src ="http://www.blogjava.net/fingki/aggbug/187724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fingki/" target="_blank">Fingki.li</a> 2008-03-21 16:08 <a href="http://www.blogjava.net/fingki/archive/2008/03/21/Error_logged_from_Ant_UI.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>