﻿<?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-Jeff on Java </title><link>http://www.blogjava.net/jeff-lau/</link><description>谁给我一滴水， 我便回报他整个大海。</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 00:05:10 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 00:05:10 GMT</pubDate><ttl>60</ttl><item><title>XHTML 搜神记</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/18/176144.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Fri, 18 Jan 2008 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/18/176144.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/176144.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/18/176144.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/176144.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/176144.html</trackback:ping><description><![CDATA[<div id="content"> <p class="red">每个人对小时候都有些怀念的东西，我也不例外。现在每当我刮胡子的时候，就怀念小时候，爷爷的花白胡子刺在我幼嫩的脸上痒痒的感觉。更怀念在我3-4岁的一段时间，那时候每天睡觉前，爸爸都会给我讲一段故事，尤其是神话故事。讲盘古开天地，讲女娲造人，一直讲到西游记。我希望将来也会在我孩子每天睡觉前，讲故事给他听。只可惜我现在连女朋友都没有，有意者(只限女性)请留下联系方式。</p> <p class="red">在我读书后，我才知道爸爸给我讲的很多神话故事，都是来自一本书，这本书叫做《搜神记》。在这里，我也讲个关于XHTML的神话故事，所以就取名叫《XHTML搜神记》。如果你的孩子要学XHTML的话，你也可以把这个故事讲给他听。首先向各位介绍故事里的人物和环境。</p> <ul> <li>计算机世界  <li>SGML女娲 - 女娲级的人物  <li>HTML书神 - SGML女娲造的第一神物，书神  <li>XML万能之神 - SGML女娲造的第二个神物，万能之神  <li>XHTML女神 - HTML书神和XML万能之神的女儿  <li>Interne河流，起源地美国  <li>MathML - XML万能之神的一个数学家的化身  <li>Microsoft帝国，现任国王Bill Gates  <li>Mac共和国  <li>Unix王国  <li>Linux联盟  <li>IE舞台 - HTML书神的主要表演舞台  <li>IE3、NN3原始部落  <li>Netscape文明古国 </li></ul> <p>1989年，计算机世界的Internet河流才刚刚解封，那时候计算机世界人们的要求还很简单，只要有个说书的，就够了。于是SGML女娲，就在欧洲粒子物理实验室依照自己的原型，做了一个简单版本，取名为HTML。这个HTML的主要职责就是说书。所以称为HTML书神。为什么这么称呼呢?你看HTML中的标签就知道了，都是些H1~H6标题，P段落，IMG插图之类的东西，这些都只是增加说书过程中的情趣而已。HTML书神通过Internet这条近光速的河流，几乎走遍了整个计算机世界。虽然在Internet河流中走动的还有FTP，EMail等其他神，但他们的足迹远远不及HTML书神的多。</p> <p>HTML书神也造就了像Netscape这样的一代文明古国，Netscape最终被Microsoft帝国打垮了，现已经没落。但世界上那里有强权，那里就有斗争。像FIREFOX这样的第三世界现正在崛起。HTML女神使计算机世界发展壮大，她自己也变得也越来越强大，说书的本领也越来越高，HTML女神现已经能播放音乐、电影。也越来越多的出版商、娱乐公司来找HTML女神，像BBS出版商、门户网站出版商和音频视频娱乐公司都找上了HTML女神，HTML女神好像对所有的来者不拒。HTML女神的责任也越来越大，HTML女神有点不堪重负。</p> <p>就在HTML女神有点不堪重负的时侯，SGML女娲造了一个更强大的神，XML万能之神。XML万能之神被鼓吹的能描述真实世界上的万物。MathML就是XML万能之神的一个数学家的化身，也许将来会有XML万能之神还会化身为CookML厨神、MusicML音乐之神等等。</p> <p>HTML女神平易近人，但功能有限；XML万能之神虽然魔法无比，但难以掌控。为了结合这两者的优点，得到一个他们两个的优良品种，在W3C这个媒婆和接生婆的帮助下，XHTML女神出世了。XHTML女神和她妈妈像极了。先写到这里。祝愿XHTML女神一路好走。</p> <p><strong>作者云：这是初稿，我会完善这个故事，并有待大家的批评和指正。大家有什么意见，可以通过评论、或者发电子邮件给我。在后续的版本，我会增加一个感谢列表，感谢所有提过意见的人，尤其意见中肯的。又重大贡献的甚至可以加入到作者列表中。</strong></p> <p>要完善的列表</p> <ul> <li>浏览器对HTML和XHTML的支持  <li>CSS和HTML、XHTML的关系  <li>Javascript和HTML、XHTML的关系  <li>浏览器大战  <li>RIA的应用 </li></ul></div><img src ="http://www.blogjava.net/jeff-lau/aggbug/176144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-18 11:26 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/18/176144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>长度单位</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/17/176064.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Thu, 17 Jan 2008 13:15:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/17/176064.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/176064.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/17/176064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/176064.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/176064.html</trackback:ping><description><![CDATA[<div id="content"> <p>长度单位经常用来表示字体大小。</p> <p>长度单位有两种</p> <ul> <li>绝对长度  <li>相对长度 </li></ul> <p>绝对长度就是不管在那里，用尺子量出来都一样的。绝对长度不受字号和屏幕分辨率的影响。在Web中有以下的表示</p> <ul> <li>in 英寸。 1 in = 25.4 mm  <li>cm 厘米。1 cm = 10 mm  <li>mm 毫米。  <li>pt 磅。 1pt = 1/72 in  <li>pc picas。 1 pc = 1/6 in。1 pc = 12pt </li></ul> <p>相对单位指定一个与另一个值成比例的值。这个比例由Web的环境指定。与分辨率有关的相对长度单位有</p> <ul> <li>px 像素 </li></ul> <p>在我这台19in的LCD显示器上，分辨率为1280*1024。所以我现在看到的 1 in = ? px</p> <p>与字体有关的相对长度单位有</p> <ul> <li>em 字体中M的宽度  <li>ex 字体中x的宽度，还是X的宽度？ </li></ul> <p>与字体有关的相对长度单位还有</p> <ul> <li>预定义尺寸。<strong>推荐在body中将基本字号设为一个预定义的尺寸。 </strong>medium为基值，变小就减去一个因数，变大就增加一个因数，等等。CSS2规范定义的比例因数为1.2，这个值也可能依浏览器而变化。  <table cellpadding="4" border="1"> <tbody> <tr> <td style="font-size: xx-small">xx-small</td> <td style="font-size: x-small">x-small</td> <td style="font-size: small">small</td> <td style="font-size: medium">medium</td> <td style="font-size: large">large</td> <td style="font-size: x-large">x-large</td> <td style="font-size: xx-large">xx-larger</td></tr></tbody></table> <li>相对与父元素的字号大小  <ul> <li>smaller  <li>larger  <li>xx% </li></ul></li></ul> <div class="codeConvention"> <p>长度单位设定规范</p> <ul> <li>设置内容的根块，如body的字体大小为samll。  <li>其他非常规字体的大小设为百分比。 </li></ul></div> <p>在长度值前面可加上+或-号。这个很少用到。</p></div><img src ="http://www.blogjava.net/jeff-lau/aggbug/176064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-17 21:15 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/17/176064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XHTML中的文本模块</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/16/175772.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Wed, 16 Jan 2008 12:40:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/16/175772.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/175772.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/16/175772.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/175772.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/175772.html</trackback:ping><description><![CDATA[<p>文本模块</p> <ul> <li>标题 h1~h6  <li>段落 p pre br  <li>引文 blockquote q cite  <li>语气 strong em  <li>缩写 abbr acronym  <li>地址 address  <li>程序相关 code dfn var kbd samp  <li>逻辑区 div span </li></ul> <p>文章的各章各节的标题应该用h1~h6依次表示。文章的章节层次最好不要过多，复杂一点的文章有个3、4层就可以了，也就是说，使用h1~h4也就行了，h5和h6很少用到。那正文标题，用什么表示？我个人认为可以用<code>&lt;p class="caption"&gt;TEXT CAPTION&lt;/p&gt;</code>来表示正文标题。章节在HTML中不会自动编号，需要手工编号或通过其他程序来完成。有以下几种建议</p> <ul> <li>手工编写章节的编号。维护起来比较麻烦，尤其在插入或删除章节的时候。  <li>用像word的这样的文字编辑器，辅助完成编号。但word会在html文档中加入很多垃圾信息，并且不符合XHTML规范。  <li>由于XHTML文档能像XML一样被处理，因此可以自己编写一个XHTML处理程序，或利用别人编写好的处理程序，像编译源代码一样，从一个无编号的XHTML文档中，重新输出一个有编号XHML文档。这个XHTML处理程序要能批处理。能处理某个目录里的所有XHTML文档、或处理匹配某个命名规定的XHTML文档、或只处理XHTML文档中class="auto"的标题。  <li>用Javascript，完成XHTML文档的自动编号。 </li></ul> <p>内容在逻辑相关的一个小块，就是段落。 最常用的段落标签就是<strong> p</strong>。pre是预先设定格式的段落，&lt;pre&gt; = &lt;p xml:space="preserve"&gt;。br表示一个换行。</p> <div class="notice"> <p>HTML把下列列表中的字符看成空白字符。在一般情况下，所有连续的空白字符只显示为一个空格。这叫<dfn>空白折叠</dfn>。元素的xml:space属性可以设置是否进行空白折叠。xml:space的属性于有两个：default或preserve。default表示进行空白折叠，preserver表示不进行空白折叠。除了pre元素外，所有元素的默认值都是default。</p> <ul> <li>空格 &amp;#x0020;  <li>TAB &amp;#x0009;  <li>进纸符 &amp;#x000C;  <li>0宽度空格 &amp;#x200B; </li></ul> <p>HTML按下列的方式管理换行的</p> <ul> <li>要强制换行，用&lt;br /&gt;  <li>按单词方式自动换行。每个汉字都算一个单词。  <li>要使两个单词之间不换行，就应该用 代替这两个单词之间的空格。  <li>要使一个长单词可以换行，把&amp;shy;放在长单词可以断开的地方。 </li></ul></div> <p>如果从其他地方摘抄过来文本，可用引文标签表示。有3种引文标签(参见下面的列表)。blockquote和q标签都有一个cite属性。如果需要链接到原文，需要超链接标签。如：<code>&lt;p&gt;And &lt;cite&gt;Bob&lt;/cite&gt; said &lt;q&gt;No, I think it's a banana&lt;/q&gt;.&lt;/p&gt; </code></p> <ul> <li>blockquote(引文块)  <li>q(内联引文)  <li>cite(引文地址) </li></ul> <p>为文章的某些文字加强语气，可用em(强调)和strong(强烈强调)标签。为了强调这是几个缩写的字母，可用abbr(缩写)或acronym(首字母缩写)标签。address表示地址。</p> <p>为了说明程序种的相关事物，可用程序相关的标签。他们是</p> <ul> <li>code 代码  <li>dfn 定义。常用强调一个术语的定义。<code>&lt;dfn title=“Java key word"&gt;class&lt;/dfn&gt; HelloWord</code>，也可用与普通的术语的定义，如<br><code>&lt;p&gt;&lt;dfn title="Microsoft web browser"&gt;IE&lt;/dfn&gt; is the most popular browser.&lt;/p&gt; </code> <li>var 变量。<code>变量&lt;var&gt;$i&lt;/var&gt;,代表循环次数. </code> <li>kbd 键盘输入。<code>To exit, type &lt;kbd&gt;QUIT&lt;/kbd&gt;. </code> <li>samp 程序输出。samp是sample output from programs,scripts,etc的意思。<code>程序的输出是&lt;samp&gt;x+y&lt;/samp&gt; </code></li></ul> <p>div和span并无实际的意义。可以通过CSS样式(style)为其赋予不同的表现。div和span的区别在于div表示的一个块，而span表示的是一个Inline(内联)。</p> <div class="notice"> <p>块元素(block)和内联元素(Inline)。</p> <p>块元素相当于段落的元素。显示时，块元素总是另起一行，块元素其后的元素也另起一行。块元素有：h1~h6 p pre blockquote address div。</p> <p>内联元素相当于块中的字符、单词和短语。文本模块提到的所有其他元素都是Inline。a和img元素也是Inline的。</p> <p><strong>body元素里只能包含块级元素，不能把独立文本和内联元素直接放在body元素中。</strong></p></div> <p>这些文本元素的表现形似在CSS中介绍。</p> <p>除了br blockquote元素外，所有的其他元素里可以再包含Inline元素和PCDATA(独立文本，无格式文本)。<br>br 是个空元素。也就是说 br 元素里不能在包含其他元素和独立文本。<br>blockquote 和 body 元素一样，只能包含块级元素。</p><img src ="http://www.blogjava.net/jeff-lau/aggbug/175772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-16 20:40 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/16/175772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重读XHTML(一)</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/15/175561.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Tue, 15 Jan 2008 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/15/175561.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/175561.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/15/175561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/175561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/175561.html</trackback:ping><description><![CDATA[<div class="codeConvention"><strong>新建立的Web页面，必须遵守XHTML1.1规范标准。 </strong>原因请见<br><a href="http://www.transwiki.org/cn/xhtmlfaq.htm#XHTML.E6.AF.94HTML.E6.9C.89.E5.93.AA.E4.BA.9B.E4.BC.98.E7.82.B9.EF.BC.9F" target="_blank">http://www.transwiki.org/cn/xhtmlfaq.htm#XHTML.E6.AF.94HTML.E6.9C.89.E5.93.AA.E4.BA.9B.E4.BC.98.E7.82.B9.EF.BC.9F</a></div> <p>XHTML页面有3部分。</p> <ul> <li>XML声明  <li>DTD声明  <li>html元素 </li></ul> <p>XML声明<strong>推荐</strong>使用，但不是必须的。为什么推荐使用呢？请参考</p> <ul> <li><a href="http://www.souzz.net/online/xml/xmlbook/0202-0200.htm" target="_blank">http://www.souzz.net/online/xml/xmlbook/0202-0200.htm</a>  <li><a href="http://www.ibm.com/developerworks/cn/xml/x-tipdecl.html" target="_blank">http://www.ibm.com/developerworks/cn/xml/x-tipdecl.html</a>  <li><a href="http://msdn2.microsoft.com/zh-cn/library/ms256048(VS.80).aspx">http://msdn2.microsoft.com/zh-cn/library/ms256048(VS.80).aspx</a> </li></ul> <p>所有的XHTML1.1的DTD声明都一样。请见</p> <p><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&gt; </code></p> <p>html元素是XHTML文档的根元素。html元素的属性有</p> <ul> <li>(可选的)xmlns。(URI = "http://www.w3.org/1999/xhtml")  <li>(可选的)I18N, id, version </li></ul> <p>html元素可包含的元素有</p> <ul> <li>(必须)head  <li>(必须)body </li></ul><img src ="http://www.blogjava.net/jeff-lau/aggbug/175561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-15 23:02 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/15/175561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我给电脑喝&amp;ldquo;剑南春&amp;rdquo;了</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/15/175343.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Mon, 14 Jan 2008 18:21:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/15/175343.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/175343.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/15/175343.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/175343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/175343.html</trackback:ping><description><![CDATA[<p>最近，显卡风扇的噪音很大。拍机箱、上油都试过了，安静一会儿，它又有上诉了。我都想直接枪毙了它。今天，打电话给一个熟悉的修电脑的师傅，他建议我用酒精洗一洗。我住的地方附近没有医院和药店，我只有忍痛开了一瓶52度的“剑南春”，倒了一点酒，给显卡的风扇喝。</p> <p>洗好后，晾干。装上风扇，OK了！电脑又安静了。扇出来风还有一股酒香了。</p><img src ="http://www.blogjava.net/jeff-lau/aggbug/175343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-15 02:21 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/15/175343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用程序的配置</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/10/174156.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Wed, 09 Jan 2008 20:40:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/10/174156.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/174156.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/10/174156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/174156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/174156.html</trackback:ping><description><![CDATA[<p>摘要：大多数应用程序都可以由用户配置。配置文件是实现应用程序灵活性的一个有效手段。Hibernate、Spring等应用都需要配置文件。国际化的应用程序也是通过和Locale有关配置文件来实现的。</p> <p>&nbsp;</p> <p>下面的内容和Java应用程序配置有关。</p> <ul> <li>properties  <ul> <li>properties文件  <li>系统信息</li></ul> <li>preferences</li></ul> <p>&nbsp;</p> <h1>properties的使用</h1> <h2>加载</h2> <p class="code">Properties prop = new Properties();<br>prop.load(new FileInputStream("filename"));<br>String value = prop.getProperties("key");</p> <p>&nbsp;</p> <h2>存储</h2> <p class="code">Properties prop = new Properties();<br>prop.setProperties("key", "value");<br>...<br>prop.store(new FileOutputStream("filename.properties"), "comments");</p> <p>&nbsp;</p> <h2>默认值</h2> <p class="code">prop.getProperties("key", "default");</p> <p>或者：</p> <p class="code">Properties defaultProp = new Properties();<br>defaultProp.setProperties("key", "value");<br>...<br></p> <p class="code">Properties prop = new Properties(defaultProp);<br>prop.load(new FileInputStream("filename"));<br>prop.getProperties("key");</p> <p>&nbsp;</p> <h2>汉字</h2> <p>手写的Properties文件，如果含有非ISO-8859-1的字符，就要用native2ascii.exe工具来编译了。eclipse中也有工具可以实现该功能。native2ascii的使用很简单。</p> <p>&nbsp;</p> <p>结构化的key</p> <p>font.name=Monospaced<br>font.size=12</p> <p>&nbsp;</p> <h2>枚举key和values</h2> <p class="code">public Enumeration&lt;?&gt; propertyNames()</p> <p class="code">size(), keys(), values</p> <p>&nbsp;</p> <h2>XML</h2> <p class="code">&lt;properties&gt;<br>&nbsp;&nbsp;&nbsp; &lt;comment&gt;comments&lt;/comment&gt;<br>&nbsp;&nbsp;&nbsp; &lt;entry key="key"&gt;value&lt;/entry&gt;<br>&nbsp;&nbsp;&nbsp; ... ...<br>&lt;/properties&gt;</p> <p>&nbsp;</p> <h2>Properties和Hashtabel的关系？</h2> <p>Properties是Hashtable的子类。 这是一个坏的设计。Hashtable应当只是Properties的一个实例变量。</p> <p>class Properties {<br>&nbsp;&nbsp;&nbsp; public String getProperty(String) {...}<br>&nbsp;&nbsp;&nbsp; public String setProperty(String, String) {...}<br>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; private Hashtable entry;<br>&nbsp;&nbsp;&nbsp; protected Properties defaults;<br>}</p> <p>在Properties的API中有下面的一段话，Sun通过文档来弥补设计上的缺陷。</p> <blockquote>因为 Properties 继承于 Hashtable，所以可对 Properties 对象应用 put 和 putAll 方法。但强烈反对使用这两个方法，因为它们允许调用方插入其键或值不是 Strings 的项。相反，应该使用 setProperty 方法。如果在“有危险”的 Properties 对象（即包含非 String 的键或值）上调用 store 或 save 方法，则该调用将失败。</blockquote><img src ="http://www.blogjava.net/jeff-lau/aggbug/174156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-10 04:40 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/10/174156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>禁用Windows XP的自动播放</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/08/173817.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Tue, 08 Jan 2008 14:14:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/08/173817.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/173817.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/08/173817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/173817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/173817.html</trackback:ping><description><![CDATA[<p>禁用Windows XP的自动播放，有两种方法： <p>【方法一】<br>插入移动存储设备后按SHIFT键不松即可。  <p>【方法二】<br>用组策略可以全部禁用Windows XP的自动播放功能，步骤如下：  <p>1、点击Windows“开始”－“运行”，键入“gpedit.msc”，点击确定按钮，打开“组策略”窗口；  <p>2、在窗口左栏的“本地计算机策略”下，打开“计算机配置/管理模板/系统”，然后在右栏的“设置”标题下，鼠标双击打开“关闭自动播放”；  <p>3、选择“设置”选项卡，勾选“已启用”复选钮，然后在“关闭自动播放”框中选择“所有驱动器”，单击“确定”按钮，退出“组策略”窗口。  <p>原地址：<a title="http://csc.rising.com.cn/KnowledgeBase/detailInfo.aspx?Action=ViewInfo&amp;InfoID=757&amp;Channel=RSQ" href="http://csc.rising.com.cn/KnowledgeBase/detailInfo.aspx?Action=ViewInfo&amp;InfoID=757&amp;Channel=RSQ">http://csc.rising.com.cn/KnowledgeBase/detailInfo.aspx?Action=ViewInfo&amp;InfoID=757&amp;Channel=RSQ</a></p><img src ="http://www.blogjava.net/jeff-lau/aggbug/173817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-08 22:14 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/08/173817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代理(Proxy)</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/06/173122.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Sun, 06 Jan 2008 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/06/173122.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/173122.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/06/173122.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/173122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/173122.html</trackback:ping><description><![CDATA[<p>如果想在运行时生成新的对象，并且这个对象的类型是全新的，是现有系统中没有的。就可以用Proxy类中的静态方法newProxyInstance来实现。其API如下：</p> <p>public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler handler);</p> <p>参数：</p> <ul> <li>loader: 类加载器。如果为null，就要默认类加载器  <li>interfaces: 这个新类要实现的接口组  <li>调用处理器。</li></ul> <p>函数返回的对象类型是$Proxy<u>n</u>, (n &gt;= 0. 第一次调用这个方法，新类名为$Proxy0, 第二个新类名为$Proxy1, 以此类推)</p> <p>生成的$Proxy<u>n</u> 的源代码大致类似如此：</p> <p class="code">public final class $Proxy0 implements <em><font color="#ff0000">interfaces</font></em> { <br>&nbsp;&nbsp;&nbsp; InvocationHandler <font color="#ff0000">handler</font>;<br><br>&nbsp;&nbsp;&nbsp; public String toString() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = this.getClass().getMethod("toString");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.invoke(this, m, m.getParameters());<br>&nbsp;&nbsp;&nbsp; } </p>&nbsp;&nbsp;&nbsp; public int hashCode() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = this.getClass().getMethod("hashCode");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.invoke(this, m, m.getParameters());<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; public String equals() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = this.getClass().getMethod("equals");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.invoke(this, m, m.getParameters());<br>&nbsp;&nbsp;&nbsp; } <br> <p>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; // 以下是实现interfaces的方法<br>&nbsp;&nbsp;&nbsp; public return_type interfaces_method(args...) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = this.getClass().getMethod("equals");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; handler.invoke(this, m, m.getParameters());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp; }<br><br>&nbsp;&nbsp; ... ...接口interfaces中的其他方法&nbsp;&nbsp; <br>}</p> <p>&nbsp;</p> <p>当我们这样调用时: Object o = Proxy.newProxyInstance(null, interfaces, handler0); </p> <p>就生成一个新$Proxy0类的对象o, 这个对象o的字段handler被赋值为handler0。$Proxy0实现了interfaces中所有的接口，其实现方式都一样，就是调用字段handler的invoke方法。其UML图如下：</p> <p><a href="http://www.blogjava.net/images/blogjava_net/jeff-lau/WindowsLiveWriter/Proxy_965E/proxy_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="311" alt="proxy" src="http://www.blogjava.net/images/blogjava_net/jeff-lau/WindowsLiveWriter/Proxy_965E/proxy_thumb.png" width="383" border="0"></a></p><img src ="http://www.blogjava.net/jeff-lau/aggbug/173122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-06 14:11 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/06/173122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>闹钟程序</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/04/172627.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Thu, 03 Jan 2008 22:21:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/04/172627.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/172627.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/04/172627.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/172627.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/172627.html</trackback:ping><description><![CDATA[<p>“干得比驴累,吃得比猪差,起得比鸡早,看上去比谁都好,五年后比谁都老”相信很多程序员朋友都曾这样感慨和抱怨过自己的生活状态.的确,日复一日地手按键盘、目盯显示器,在实现一个个程序和任务的同时,有时候我们的健康也慢慢流失在那一段段整齐的代码中.</p> <p>程序员的健康问题，是个很容易被程序员自己忽略的问题。关注一段程序，一晃就是好几个小时。眼睛越来越近视，颈椎越来越酸。如何解决这个问题？</p> <p>要是有个闹钟，来个整点报时就好了。整点一到，从座位起来，打杯水，泡杯咖啡，做做颈部和四肢的伸展运动，长此以往，健康自然回来了。</p> <p>空闲之余，就用Java做了这样的一个闹钟程序。启动后，程序就在系统托盘中，图标是这样的<a href="http://www.blogjava.net/images/blogjava_net/jeff-lau/WindowsLiveWriter/c20587c55223_594E/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="21" alt="image" src="http://www.blogjava.net/images/blogjava_net/jeff-lau/WindowsLiveWriter/c20587c55223_594E/image_thumb_1.png" width="22" border="0"></a> 。</p> <p><strong>程序必须运行在jdk6+中。</strong></p> <p>下载地址：<a title="http://www.blogjava.net/Files/jeff-lau/clock.zip" href="http://www.blogjava.net/Files/jeff-lau/clock.zip">http://www.blogjava.net/Files/jeff-lau/clock.zip</a></p><img src ="http://www.blogjava.net/jeff-lau/aggbug/172627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-04 06:21 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/04/172627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交换</title><link>http://www.blogjava.net/jeff-lau/archive/2008/01/03/172392.html</link><dc:creator>Jeff Lau</dc:creator><author>Jeff Lau</author><pubDate>Thu, 03 Jan 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/jeff-lau/archive/2008/01/03/172392.html</guid><wfw:comment>http://www.blogjava.net/jeff-lau/comments/172392.html</wfw:comment><comments>http://www.blogjava.net/jeff-lau/archive/2008/01/03/172392.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jeff-lau/comments/commentRss/172392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jeff-lau/services/trackbacks/172392.html</trackback:ping><description><![CDATA[<p>在程序开发的过程，要交换两个变量的内容，是一种比较常见的事情。在排序算法中，就有一种就叫做“交换排序法”。在所有的排序算法，交换要排序的集合中的两个元素，几乎是必须的过程。在Java中交换两个元素的内容，如果你是程序员新手，你可能碰到意想不到的问题。</p> <p>首先，来看看交换下面的程序。为了交换两个整数变量的内容，写了下面这样的一个方法实现：</p> <p class="code">public void swap(int i, int j) {<br>&nbsp;&nbsp;&nbsp; int t = i;<br>&nbsp;&nbsp;&nbsp; i = j;<br>&nbsp;&nbsp;&nbsp; j = t;<br>}</p> <p>调用上面的方法，有问题吗？</p> <p class="code">int x = 100;<br>int y = 1;<br>swap(x, y); </p> <p>在程序执行此段代码后，你会发现，x还是100， y还是1。为什么呢？因为Java对方法参数的传递，是使用<strong>值调用(call by value)</strong>的。想想，如果我这样调用swap函数呢，swap(3, 4)，这是莫名其妙的，有谁会要交换3和4这两个常数呢。</p> <p>那没办法交换两个整数变量了吗？可以。把swap函数体替换掉swap函数的调用就可以了。如：</p> <p class="code">int x = 100;<br>int y = 1;<br>int t = x;<br>x = y;<br>y = t; </p> <p>Java中其他的原生类型(primitive type)的情况，和int的一样。</p> <p>&nbsp;</p> <p>继续讨论函数调用吧。函数调用时，参数传递的方式主要有两种：</p> <ul> <li>值传递  <li>引用传递 </li></ul> <p>Java使用的是值传递。值传递是把变量的值、常数或常量传递给参数。而引用传递，是把变量的所在内存中的地址传递给参数，参数通过地址找到变量的值。很明显，引用传递不能把常数传递给参数。值传递和引用传递还有一个很大的不同：对于像int这样的小类型变量来说，值传递没副作用，而引用传递有。也就是说，在函数调用的执行过程中，不能改变传递给参数的变量的值。</p> <p>但对于普通类类型参数的传递方式的理解和原生类型有点不同。对于方法method(Object o)的调用method(x)， 不是把对象x复制一份传递给参数o，而是把对象x的在内存中的首地址，也就是把对象x的引用拷贝给参数o。这样就能这样实现对象的交换函数了吗？</p> <p class="code">public void swap(Object o, Object p) {<br>&nbsp;&nbsp;&nbsp; Object t = o;<br>&nbsp;&nbsp;&nbsp; o = p;<br>&nbsp;&nbsp;&nbsp; p = t;<br>} </p> <p>答案是：No。因为像下面这样的调用：</p> <p class="code">Object x = X;<br>Object y = Y;<br>swap(x, y); </p> <p>在执行完上的代码后，x指向的还是原来的X对象，y指向的还是那个Y对象。就像歌唱的那样：星星还是那个星星，月亮还是那个月亮。</p> <p>&nbsp;</p> <p>难道就不能通过方法调用实现交换这个功能吗？可以。有两种办法：</p> <ul> <li>可以交换数组等集合里的元素  <li>用反射实现</li></ul> <p class="code">public void swap(Object[] a, int i, int j) {<br>&nbsp;&nbsp;&nbsp; Object t = a[i] ;<br>&nbsp;&nbsp;&nbsp; a[i] = a[j];<br>&nbsp;&nbsp;&nbsp; a[j] = a[i];<br>}</p> <p>用反射实现swap函数，有点杀鸡用大炮的感觉。性能不怎么样，还容易出错。这个留着做家庭作业吧。</p><img src ="http://www.blogjava.net/jeff-lau/aggbug/172392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jeff-lau/" target="_blank">Jeff Lau</a> 2008-01-03 10:42 <a href="http://www.blogjava.net/jeff-lau/archive/2008/01/03/172392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>